How to Publish an Expo App on Google Play With EAS
Build an Android App Bundle with EAS Build, manage the upload key, upload your first build manually, then automate with EAS Submit to a closed testing track.
Short answer
Run eas build --platform android with a production profile to get an .aab (EAS can generate and store the upload keystore for you). Create the app in Play Console and upload the first build manually, since Google’s API can’t create a new app’s first release. After that, eas submit can send builds straight to your closed track.
1. Configure app.json / app.config
- android.package: your permanent application ID.
- android.versionCode: integer, increase every upload (or set autoIncrement in eas.json).
- version: the user-visible versionName.
2. Build with EAS
- npm install -g eas-cli, then eas login.
- eas build:configure creates eas.json.
- eas build --platform android --profile production.
EAS builds an Android App Bundle by default for store builds. On the first build it offers to generate a keystore and stores it on Expo’s servers. Download a backup with eas credentials. It’s your upload key. See lost upload key.
3. First upload: manual
Google Play’s publishing API can’t upload the very first build of a brand-new app. So:
- Create the app in Play Console, complete the store listing and App content.
- Download the .aab from your EAS build page.
- Upload it to a closed testing track by hand. See upload your first AAB.
4. Automate later uploads with EAS Submit
- In Google Cloud, create a service account, then grant it access in Play Console (Users and permissions) with release permissions for the app.
- Download the JSON key and reference it in eas.json under submit.production.android.serviceAccountKeyPath.
- Set track to the track you want (for example a closed track name or "internal").
- Run eas submit -p android --latest.
5. Expo-specific tips
| Topic | Tip |
|---|---|
| Target API | Use an Expo SDK whose defaults target API 36 (required since August 31, 2026) |
| OTA updates | expo-updates pushes JS changes without a new store build. Still ship at least one real build update during your test, and follow Play policies on code updates |
| Permissions | Remove unused permissions in app.json so your Data safety form stays simple |
| Crash reports | Add Sentry or Crashlytics before testers start |
After the bundle is built: same path for every app
- Create the app in Play Console and complete the store listing and App content. See does a closed test need a store listing.
- Upload the .aab to a closed testing track (internal first is optional). See upload your first AAB.
- Attach a tester list and publish. Share the opt-in link.
- On a new personal account: keep 12+ testers opted in for 14 days, then apply for production access.
Frequently asked questions
Can I build locally instead of on EAS servers?
EAS supports local builds with a flag on the build command, if you have the Android toolchain installed. Cloud builds are simpler for most people.
Who owns the keystore EAS generated?
You do. It’s stored in your Expo account. Download a backup with eas credentials and keep it safe.
Do OTA updates count as app updates for testers?
They change the JavaScript your testers run, but Play only sees the store build. Ship at least one real build update during the test so changes show up in Play Console too.
Sources and how we keep this accurate
- Android Developers: About Android App Bundles
- Play Console Help: Use Play App Signing
- Expo docs: Submit to the Google Play Store
Policy facts are checked against Google's own documentation on the date shown above. Google can change requirements at any time, so confirm in your Play Console. Where we give advice or estimates rather than Google's rules, we say so. TestersZone is independent and not affiliated with Google. Drafts are AI-assisted and reviewed by our team.
Need 12 testers? Get them free.
Test 3 apps, earn 60 credits, and list your app for up to 20 real testers with verified daily check-ins.
Start freeKeep reading
How to Publish a React Native App on Google Play
How to Upload Your First App Bundle to Play Console
“Version Code Has Already Been Used”: How to Fix It
How to Publish a Unity Game on Google Play
How to Publish a Godot Game on Google Play
How to Publish a Capacitor or Ionic App on Google Play
Browse all guides, or see the quick answers, guides and comparisons.