Build and publish to the Play Store
Take an Expo app to the Google Play Store: set the app identity, build an APK and an AAB with EAS Build, test on a real phone, set up Play Console, pass the testing rules and release updates.
You will take an Expo app from your laptop to the Google Play Store: set the app's identity, build an installable file with EAS Build, test it on a real phone, create a Play Console listing, and release it. Android is the focus, in line with the rest of this track.
Prerequisites: a working Expo app, a free Expo account (sign up at expo.dev), and a Google account. Be ready for some waiting: the first release on a new personal Play account takes days to weeks, mostly because of Google's testing rules explained below.
Rules and fees change. This lesson describes how the process works; check the official Play Console help pages for current fees and requirements.
The big picture
The journey
- 1Prepare the app: name, icon, package name, version.
- 2Build a test APK and install it on a phone (checks that the real build works).
- 3Build a production Android App Bundle (
.aab) with EAS Build. - 4Create a Google Play developer account (one-time registration fee, identity verification).
- 5Create the app in Play Console, fill the store listing and policy forms.
- 6Upload the bundle to a testing track, run the required testing, then apply for production.
- 7Release, then ship updates.
Step 1: Prepare app.json
Your app's identity lives in app.json (or app.config.js). The important fields are the name users see, the slug, the version, and the Android package name: a unique id like com.yourname.expensetracker. Once you publish with a package name, you can never change it, so choose carefully. Use reverse-domain style, lowercase, and a name you own (for example your own name or a domain you control).
{
"expo": {
"name": "Expense Tracker",
"slug": "expense-tracker",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"android": {
"package": "com.yourname.expensetracker",
"versionCode": 1,
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
}
}
}Replace yourname with your own identifier. Keep your existing fields; only add or change these.
Version fields
| Field | Meaning |
|---|---|
version | The number users see, such as 1.0.0 |
android.versionCode | A whole number that must increase with every upload to Play (1, 2, 3...). Play rejects a repeat |
android.package | Permanent unique id of your app on Play |
Your icon should be a 1024 by 1024 PNG. The adaptive icon foreground needs the artwork inside the central safe area, because Android crops it into circles, squares and other shapes on different phones. Check the Expo documentation on app icons for exact sizes.
Let EAS count versions
If you use EAS appVersionSource: remote (the default created by eas build:configure) with autoIncrement in the production profile, EAS can manage versionCode for you. Then you do not edit it by hand.
Step 2: Set up EAS
EAS (Expo Application Services) builds your app in the cloud, so you do not need Android Studio installed or a powerful computer. EAS Build has a free plan with limits on how many builds you can do; check expo.dev pricing for the current limits, and paid plans exist for more.
npm install -g eas-cli
eas login
eas build:configureeas build:configure creates eas.json in your project. Use npx eas-cli instead of the global install if you prefer.
Open eas.json. Add a preview profile that builds an APK, a file you can install directly on a phone. The production profile builds an AAB (Android App Bundle), the format Google Play requires for new apps.
{
"cli": { "version": ">= 5.0.0", "appVersionSource": "remote" },
"build": {
"preview": {
"distribution": "internal",
"android": { "buildType": "apk" }
},
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}The cli.version number may differ in your generated file; keep what eas build:configure wrote and add the profiles.
Step 3: Build and test an APK
eas build --platform android --profile previewThe first time, EAS asks to generate an Android keystore. Say yes and let EAS store it.
The first build asks to create a keystore, the signing key that proves updates come from you. EAS stores it for you. If you lose a keystore you may not be able to update your app, so do not delete it from your EAS project. You can download a backup with eas credentials.
When the build finishes (often 10 to 20 minutes, longer in busy times), the terminal prints a link and a QR code. Open the link on your Android phone, download the APK and install it. Android may ask you to allow installs from your browser.
Build finished. The terminal shows a build URL on expo.dev and an APK download link / QR code.Test on a real phone
- App opens with no red error screen and no Expo Go needed.
- Login, data loading and every feature you built work on a release build (not just in development).
- Rotate the phone and open it with the network off: nothing crashes.
- Icon and app name look right on the home screen.
- Test on at least one low-end or older phone if you can.
Expo Go is not your real app
Features that worked in Expo Go can fail in a build if the config is missing: for example expo-notifications, Google sign-in, or maps need extra setup or keys. Always test the built APK before submitting. Environment variables read at build time must be set for EAS builds too (use eas env or the env field in eas.json).
Step 4: Google Play developer account
Go to play.google.com/console and sign up. You pay a one-time registration fee (at the time of writing it was about US dollars 25, charged once, not yearly; confirm on the sign-up page) using a card that works for international payments. Google also verifies your identity, which can take a few days.
You choose between a personal and an organization account. Organization accounts need a business identity (such as a D-U-N-S number) and are what companies use. A student or hobby developer normally uses a personal account.
Closed testing rule for personal accounts
Google has had special rules for newer personal accounts: before you can apply for production access, you must run a closed test with a minimum number of testers who stay opted in for 14 days in a row (the number was 12 when this was written; it was 20 earlier). Plan for it: ask friends, classmates and family with Android phones to join. Read the current rule in Play Console help before you start, because it changes.
Step 5: Production build
eas build --platform android --profile productionProduces an .aab file on EAS. Download it from the build page.
Step 6: Create the app in Play Console
In Play Console
- 1In Play Console choose Create app. Enter the name, default language, App or Game, Free or Paid, and accept the declarations.
- 2Open the Dashboard setup tasks and complete them one by one. These include: app access (give test login details if your app has login), ads declaration, content rating questionnaire, target audience, data safety form, and a privacy policy URL.
- 3Create the store listing: short description (80 characters), full description, app icon (512 by 512), feature graphic (1024 by 500) and at least two phone screenshots.
- 4Go to Testing, then Closed testing, create a track, and add testers by email list or Google Group.
- 5Create a release on that track and upload the
.aab. Add release notes. - 6Send the release for review and share the opt-in link with testers.
- 7After the required testing period, use the Apply for production button, answer the questions, and then create a production release.
The data safety form asks what data your app collects (email, location, purchases) and whether it is shared. Answer honestly and match what the app really does, because mismatches can lead to rejection or removal. If your app collects any personal data, you need a privacy policy hosted on a public URL. In India this also connects to the DPDP Act, so state clearly what you collect and why. A free page on GitHub Pages or Notion can host a simple policy.
Store listing assets (check Play Console for current limits)
| Asset | Size and note |
|---|---|
| App icon | 512 by 512 PNG |
| Feature graphic | 1024 by 500 |
| Phone screenshots | At least two; real screens of your app, not mock-ups of other products |
| Short description | Up to 80 characters |
| Full description | Up to 4000 characters; explain real features without keyword stuffing |
Step 7: Submit from the command line (optional)
Once the first release is uploaded manually, you can send later builds with eas submit. It needs a Google service account key (a JSON file) with permission on your Play Console app. The Expo docs ("Submit to Google Play Store") walk through creating it. Keep that JSON file out of Git.
eas build --platform android --profile production --auto-submit
# or submit the latest build later:
eas submit --platform android --profile productionIn eas.json, the submit profile can point to the key file with serviceAccountKeyPath, and choose a track such as internal.
Updates after launch
For code-only changes (JavaScript and assets), EAS Update can send an over-the-air update without a new Play review. It needs the expo-updates library set up; see the EAS Update docs. Changes to native code, new permissions or new native libraries need a new build and a new Play release with a higher versionCode. Play policies still apply to what you change through updates.
Why apps get rejected
Common reasons
- No privacy policy, or one that does not match the app's real data use.
- Data safety form answers that do not match the app.
- Reviewers cannot log in because you gave no test account.
- App crashes at start (test the production build, not only development).
- Misleading name, icon or screenshots; copying another brand.
- Requesting permissions you do not need (for example location in an expense app).
- Broken or empty features: a half-finished app can be rejected for minimum functionality.
How this comes up in interviews
Questions include "What is the difference between APK and AAB?" (APK installs directly; AAB is the publishing format Play uses to create optimised APKs per device), "What is a keystore and why is it important?" and "How do you ship an urgent fix?" (EAS Update for JavaScript-only fixes, or a new build with a higher versionCode). Having a real published or tested app on your resume makes these answers credible.
Try it: Ship a test build today
Build the preview APK of any app you made, install it on your phone, and fix at least one problem that only appears there. Then write your app's privacy policy as five short bullet points: what you collect, why, where it is stored, how a user can delete it, and how to contact you.
Key takeaways
- Choose the Android package name carefully: it is permanent.
- EAS Build makes cloud builds: APK for testing, AAB for the Play Store.
- Never lose the keystore; let EAS store it and keep a backup.
- Test the built app on a real phone; Expo Go hides configuration problems.
- Plan for the Play developer fee, identity checks and, for new personal accounts, a closed testing period. Check current rules in Play Console help.
- Privacy policy, data safety form and test login details prevent most rejections.
- Each upload needs a higher versionCode; JavaScript-only fixes can go out through EAS Update.
Check yourself
Finishing the quiz marks the lesson as done.
1. Which file format does Google Play require for new apps, and what do you use to test directly on a phone?
2. Why must android.versionCode increase with each upload?
3. What can you do with the Android package name after publishing?
4. Your app worked in Expo Go but crashes in the built APK. What is the best first step?
5. A one-line JavaScript bug fix needs to go out quickly. Which is usually fastest if expo-updates is set up?
Saved on this device. Create a free account to keep it on every device.
Practise this with Sam
A real mock interview, out loud, with an honest scorecard. Free to start.