Expo App Publishing Guide
A complete walkthrough for publishing your React Native app to the App Store and Google Play using Expo EAS Build.
Overview: The Expo Publishing Stack
Expo Application Services (EAS) is the official cloud build and submission system for Expo apps. It handles the parts of app publishing that traditionally required a Mac with Xcode: compiling native code, signing binaries, and submitting to the App Store. EAS Build runs in the cloud, so you can publish an iOS app from Windows or Linux.
Setting Up EAS
Install the Expo CLI and EAS CLI globally. Run eas build:configure in your project root. This generates an eas.json file with build profiles. You'll need an Apple Developer account ($99/year) for iOS and a Google Play Developer account ($25 one-time) for Android. EAS handles credential management and can generate signing certificates automatically, which is the recommended approach for most teams.
Building for App Store
Run eas build --platform ios --profile production to trigger a cloud build. This creates an .ipa file signed with your production certificate. Before submitting, check that your app.json has the correct bundleIdentifier, version, and buildNumber. The build number must increment with every submission; EAS can auto-increment it for you. Once the build completes, run eas submit --platform ios to hand it off to App Store Connect via the Transporter API.
Building for Google Play
The Android build process is parallel: eas build --platform android --profile production generates an .aab (Android App Bundle). Run eas submit --platform android to upload to Google Play Console. The first submission to Google Play requires manual review and can take 1–3 days. Subsequent updates are usually reviewed within hours.
Over-the-Air Updates with EAS Update
One of Expo's main advantages is OTA updates: you can push JavaScript changes to users without App Store review. Run eas update --branch production to push an update. Users get it the next time they launch the app. There are limits, though. OTA updates can only change JavaScript, not native code. Any change to native modules, permissions, or SDK version requires a full build and store submission.
More Free Resources
Keep reading
Browse the rest of our free guides or check out the free tools.