You've built your Expo app, and now it needs to reach real users. With EAS Build and EAS Submit, you can go from code to the App Store and Google Play without Xcode, Android Studio, or even a Mac. Here's the full process.
Before you start
- Apple Developer Program: $99/year (needed for the App Store and TestFlight).
- Google Play Console: $25 one-time registration.
- An Expo account and the EAS CLI:
npm install -g eas-cli
eas login
eas build:configure
1. Prepare app.json
{
"expo": {
"name": "Habitly",
"slug": "habitly",
"version": "1.0.0",
"icon": "./assets/icon.png",
"scheme": "habitly",
"ios": {
"bundleIdentifier": "com.yourcompany.habitly",
"infoPlist": {
"NSCameraUsageDescription": "Habitly uses the camera so you can add a progress photo to a habit."
}
},
"android": {
"package": "com.yourcompany.habitly",
"adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#ffffff" }
}
}
}
Get these right before your first release:
bundleIdentifierandpackagecan never change after publishing.- Permission descriptions must explain why you need access, specifically. "Needs camera" gets rejected.
- Icon: 1024×1024 PNG with no transparency for iOS.
2. Create production builds
eas build --platform all --profile production
On the first run, EAS offers to generate signing credentials (iOS distribution certificate and provisioning profile, and Android upload keystore) and stores them securely. Let it, unless your team already manages credentials. Android production builds produce an .aab (App Bundle), which is what Google Play requires.
Run npx expo-doctor first. It catches dependency mismatches that cause launch crashes.
3. Submit to the App Store
eas submit --platform ios
EAS uploads the latest build to App Store Connect. Within a few minutes it appears in TestFlight:
- Add yourself and testers in TestFlight, then install on real devices.
- Fill out the App Store listing: name, subtitle, description, keywords, screenshots (6.9" iPhone at minimum), privacy policy URL, and support URL.
- Complete App Privacy (data collection) and age rating.
- Add demo credentials in App Review Information if the app needs login.
- Select the build and click Submit for Review.
4. Submit to Google Play
Create the app in Play Console first, then:
eas submit --platform android
For a brand-new app, EAS creates the first release on the internal testing track. Then:
- Test via the internal track link.
- Complete the store listing, Data safety form, content rating, and target audience.
- Personal developer accounts must run a closed test with testers for a period before applying for production access. Check Play Console's current requirements.
- Promote the release to production.
For CI, create a Google service account key and an App Store Connect API key so eas submit --non-interactive can run unattended.
5. Build and submit in one step
Once everything is set up, combine both steps:
eas build --platform all --profile production --auto-submit
Common rejection reasons (and fixes)
- Vague permission strings: rewrite
infoPlistdescriptions to explain the specific feature. - No account deletion: if users can sign up, Apple requires in-app account deletion.
- Crash on launch: test the production build in TestFlight, not just dev builds. Android release builds use R8 by default in SDK 58.
- Missing Restore Purchases for subscriptions (see our RevenueCat guide).
- Broken login for reviewers: provide working demo credentials.
- Sign in with Apple missing when you offer other third-party social logins on iOS.
- Placeholder content or broken links in the app or listing.
After launch
- Bug fixes: ship JavaScript fixes in minutes with EAS Update, no review needed.
- Native changes: bump
version, runeas build, and submit again. - Monitor: watch crashes and performance with Expo Observe or your crash reporting tool.
- Stay current: plan SDK upgrades (what's new in SDK 58) before Apple's yearly iOS deadlines.
Launch faster
Most of the time before a first release goes into auth, settings, onboarding, and polish, not publishing. Our Expo templates cover those foundations, and our free components handle the UI details reviewers and users notice.