Welcome back

Opening shared build

Preparing your Mach workspace…

Preparing your secure download…

Documentation
Blog
Open dashboard
Mach Docs

Store Submission

Ship to App Store & Google Play with one command.
Mach automates the final mile of your delivery. Gone are the days of manual uploads through Transporter or the Google Play Console UI.
Google Play Setup (Android)
Follow these steps to grant Mach permission to manage your Android releases.
1
Create Service Account
Open Service Accounts in Google Cloud, click Create Service Account, and name it "Mach Submission".
2
Generate JSON Key
Click on your new Service Account → **Keys** tab → **Add Key** → **Create new key** → **JSON**. Download the file.
3
Enable Developer API
You must [Enable the Google Play Android Developer API](https://console.cloud.google.com/apis/library/androidpublisher.googleapis.com) for your Google Cloud project.
4
Invite User in Play Console
In [Google Play Console Users](https://play.google.com/console/users-and-permissions), click **Invite new users**. Enter the email of the Service Account you created in Step 1 and grant **Admin** or **Releases** permissions.
5
Upload Service Key to Mach
Upload the downloaded JSON under the Android package that will be submitted. If you omit `--package-name`, Mach reads Android package identifiers saved in the Dashboard and asks you to select one.
mach credentials:service --platform android --package-name com.example.app --file ~/Downloads/play-service-account.json
# Or select from package ids already saved in the Dashboard
mach credentials:service --platform android --file ~/Downloads/play-service-account.json
Android service credentials are package-scoped. A key uploaded under `*` is legacy/global and will not satisfy submission for `com.example.app`; upload the service key under the exact package id.
App Store Connect (iOS)
Mach can handle iOS credentials automatically. Simply run the following command and Mach will provision the API keys on the Apple Developer Portal for you.
mach credentials:service --platform ios
App Store Connect API keys are used for TestFlight upload and iOS submit metadata. Mach stores the key id, issuer id, Apple team id, and App Store Connect provider/team metadata so future submit commands can run without interactive Apple login.
Submit Commands
Use `--latest` to submit the newest successful build. Add `--profile` so production, preprod, and staging builds cannot be mixed accidentally.
mach submit --latest --platform android --profile production
mach submit --latest --platform ios --profile production
mach submit --latest --platform android --profile production --track internal
Submissions are linked to the build they upload and are recorded in the Dashboard with status, profile, platform, artifact name, and creator identity. Failed runner or store-upload attempts are marked failed instead of staying pending.
How Submissions Run
Android
Mach uploads AABs directly with the Google Play Developer API, applies the selected track/release status, commits the edit, and retries transient Play API errors before failing.
iOS
Mach queues the submission and runs Fastlane pilot on the configured macOS runner. Users and CI still run the same mach submit command from any machine.
Visibility
Runner provider details are internal. Users see the Mach submission page, not the underlying runner job URL.
Automated Versioning
Tired of duplicate version errors? Enable Automated Versioning to let Mach handle the heavy lifting.
Android Auto-Increment
Mach assigns the next versionCode from an atomic Dashboard counter scoped to the package name.
iOS BuildNumber Sync
Mach assigns the next CFBundleVersion from an atomic Dashboard counter scoped to the bundle ID.
Enable in config
"android": {
"versionCode": "auto"
},
"ios": {
"buildNumber": "auto"
}
Or via CLI
mach build --platform android --auto-version
mach build --platform ios --profile production --auto-version
Config-based auto versioning runs automatically for store builds. Internal builds use the same Dashboard counter when you pass `--auto-version`.
For apps that already have uploaded builds, seed Mach's DB counter once with the latest uploaded Android versionCode and/or iOS build number. Mach then assigns the next value and continues from its own counter.
Seed an existing app
mach version seed --platform android --value 66
mach version seed --platform ios --value 82
mach version show --platform android
mach version show --platform ios
The seed value is the latest value already uploaded to the store; the next build uses seed + 1. Mach does not use environment variables, secrets, App Store Connect lookups, or Google Play lookups as native version counter state.
Previous
Push notifications
Next
E2E Tests