Websites · Compared
Development build vs production build in Expo
In Expo, a development build is a debug version of your app with developer tools built in, installed on your own devices to load code from your computer. A production build is the optimised, release signed app you submit to the App Store or Google Play. A preview build sits between them: release code, shared with testers through internal distribution.
Expo's eas.json starts with three build profiles, development, preview and production. Choosing the right one decides who can install the app and whether it can reach a store.
Indunil Asanka · Co-founder
4 min read · Published
| Question | Development | Preview | Production |
|---|---|---|---|
| Default eas.json setting | developmentClient: true, distribution: internal | distribution: internal | Store distribution (empty profile) |
| Who installs it | The developer's own devices | Testers with a link or QR code | Everyone, through the stores |
| Code | Loads JavaScript from a dev server; debug tools on | Release code bundled into the app | Release code bundled into the app |
| iPhone signing | Development or ad hoc provisioning | Ad hoc or enterprise provisioning | App Store distribution |
| Android file | APK | APK | AAB for Google Play |
| Goes to a store | No | No | Yes, through submission |
What each build is
A development build is your app compiled with the expo-dev-client library. It contains your app's native code and libraries but loads JavaScript from a development server, so changes appear on the phone instantly while you work, with debugging menus available. A production build is compiled in release mode with the JavaScript bundled inside, optimised and signed for store distribution. Expo's default eas.json also includes a preview profile, which builds release code for internal distribution, so testers can install a realistic version without going through a store.
How the profiles differ in practice
Each profile in eas.json sets options that EAS Build reads. distribution: internal makes the build installable by direct link: on Android as an APK, on iPhone with ad hoc provisioning, where EAS generates a provisioning profile listing the allowed device ids, so only registered devices can install it. The production profile defaults to store distribution: an Android App Bundle for Google Play and an iPhone build signed for App Store Connect, which TestFlight can then share with testers. The same project can produce all three, and teams often add their own profiles for staging environments.
When to use which
Use a development build while writing and debugging the app day to day. Use a preview or internal build when someone else needs to try it on a real phone: the owner, staff or a few customers. Use a production build when the app is ready for review, and for TestFlight and Google Play testing tracks, since those take store builds. A common mistake is sending testers a development build, which needs a running development server and shows debug tools.
Common mistakes
Expecting an internal iPhone build to install on a device that was not registered when it was built. Sending a production Android App Bundle to someone to install directly, when only an APK installs outside the store. Forgetting that development builds are slower than release builds, then judging performance on them. Changing native libraries and expecting an older development build to load the new code. Using different bundle ids per profile without meaning to, which makes the stores see separate apps. And building for production before checking the version numbers.
Where it shows up in OneCraft
OneCraft runs Expo builds for Android or iPhone on paid plans: a test build, with a QR install on Android or an Expo page on iPhone, or a store build, at 5 credits each. Builds run on OneCraft's Expo organisation unless the owner connects their own token, and iPhone builds need the owner's Apple key. OneCraft does not submit apps to the stores: the owner submits from their own accounts with eas submit, at Apple's 99 USD a year and Google Play's 25 USD once.
Questions people ask
Is a development build the same as Expo Go?
No. Expo Go is a ready made app from the stores that can run many projects but only with the native libraries it already contains. A development build is your own app, with exactly your native libraries, plus development tools. Projects that need custom native code need a development build.
Can I send a production build to testers?
Yes, through the stores' own testing channels. On iPhone, upload the production build to App Store Connect and invite testers with TestFlight. On Android, upload the bundle to an internal or closed testing track in Play Console. For quick tests outside the stores, use an internal distribution build instead.
Why will my internal iPhone build not install?
Usually because the device was not registered when the build was made. Ad hoc builds include a provisioning profile listing allowed devices, and a device added later needs a new build. Check the device is registered with the Apple account and rebuild.
Do development builds expire?
iPhone builds signed with development or ad hoc profiles stop launching when the provisioning profile or certificate expires, which is typically within a year. Android APKs do not expire. Store builds stay valid once approved, and TestFlight builds expire after 90 days.
What is the difference between preview and production in eas.json?
By default, preview builds use internal distribution, so they install by link on registered devices and as an APK on Android. Production builds target the stores: an App Bundle for Google Play and an App Store signed build for Apple. Both contain release code.
Make one with websites
The button opens the generator with this use case already described. Change the wording to match your own.
Create a website with OneCraftRelated questions
- What is an over the air update?What is an over the air update? Shipping new JavaScript and assets to an installed app without a store build, how Expo does it and the store rules.
- What is a provisioning profile on iPhone?What is a provisioning profile? The Apple file that ties an app ID, a signing certificate and allowed devices together so an iPhone will run the app.
- What is EAS Build?What is EAS Build? The Expo cloud service that compiles your React Native app for iPhone and Android, with EAS Submit sending it to the stores. Steps and needs.
- AAB vs APK: Android App Bundle or package fileAAB vs APK: the Android App Bundle Google Play requires for new apps against the APK a phone installs, compared on size, signing and sideloading.
Written and checked by the OneCraft team. Last checked .