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.

· Co-founder

4 min read · Published

Expo's default build profiles compared
QuestionDevelopmentPreviewProduction
Default eas.json settingdevelopmentClient: true, distribution: internaldistribution: internalStore distribution (empty profile)
Who installs itThe developer's own devicesTesters with a link or QR codeEveryone, through the stores
CodeLoads JavaScript from a dev server; debug tools onRelease code bundled into the appRelease code bundled into the app
iPhone signingDevelopment or ad hoc provisioningAd hoc or enterprise provisioningApp Store distribution
Android fileAPKAPKAAB for Google Play
Goes to a storeNoNoYes, 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 OneCraft

Related questions

Sources

Written and checked by the OneCraft team. Last checked .