ExpoEAS BuildEAS SubmitApp StoreGoogle Play

How to Publish an Expo App to the App Store and Google Play (EAS Guide)

Step-by-step guide to publishing an Expo React Native app in 2026: app.json setup, EAS Build production builds, signing credentials, EAS Submit to App Store Connect and Google Play, TestFlight, store listings, and common rejection reasons.

DeveloperMill3 min read

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:

  • bundleIdentifier and package can 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:

  1. Add yourself and testers in TestFlight, then install on real devices.
  2. Fill out the App Store listing: name, subtitle, description, keywords, screenshots (6.9" iPhone at minimum), privacy policy URL, and support URL.
  3. Complete App Privacy (data collection) and age rating.
  4. Add demo credentials in App Review Information if the app needs login.
  5. 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:

  1. Test via the internal track link.
  2. Complete the store listing, Data safety form, content rating, and target audience.
  3. Personal developer accounts must run a closed test with testers for a period before applying for production access. Check Play Console's current requirements.
  4. 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 infoPlist descriptions 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, run eas 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.

Frequently asked questions

How do I publish an Expo app to the App Store?

Set your bundle identifier in app.json, run `eas build --platform ios --profile production` to create a signed build (EAS can generate certificates for you), then run `eas submit --platform ios` to upload it to App Store Connect. Test it in TestFlight, complete the store listing, and submit for review.

Do I need a Mac to publish an Expo iOS app?

No. EAS Build compiles your iOS app in the cloud and can manage signing credentials, and EAS Submit uploads it to App Store Connect. You do need a paid Apple Developer Program membership.

How much does it cost to publish an app?

Apple's Developer Program costs $99 per year, and a Google Play developer account is a one-time $25 registration fee. EAS has a free tier with a limited number of builds per month and paid plans for more builds and priority queues.

Why was my Expo app rejected?

Common reasons are missing or vague permission usage descriptions, no account deletion option for apps with sign-up, crashes on launch in review, broken demo credentials, missing Restore Purchases for subscriptions, and placeholder content. Most are fixable in app.json or with a small code change.

Build it faster with a template

Production-ready Expo React Native templates with the patterns from this post already wired up.

Browse templates