EAS Build Best Practices
A condensed summary of the 25 most important best practices drawn from every page in EAS Build - reproducible builds with locked dependencies, fingerprint gates, and credential hygiene on Expo SDK 57.
Search across all documentation pages
A condensed summary of the 25 most important best practices drawn from every page in EAS Build - reproducible builds with locked dependencies, fingerprint gates, and credential hygiene on Expo SDK 57.
Run eas build:configure early: Link projectId in app.config.ts before the first cloud compile - builds without it fail with opaque config errors.
Commit lockfiles with every native-affecting change: package-lock.json / yarn.lock / pnpm-lock.yaml must match what EAS installs - floating ranges cause non-reproducible binaries.
Gitignore ios/ and android/ under CNG: Upload JS + config - EAS runs expo prebuild when native folders are absent. See Prebuild Basics.
Use three baseline profiles: development, preview, production in eas.json - avoid engineer-named one-off profiles that rot undocumented.
Bind every profile to an EAS environment: environment: "production" pulls vars from Expo dashboard - local .env.local is ignored on build runners.
Align channel with eas update: Production binaries on channel: "production" must receive updates published to the same channel - Release & OTA Rules.
Set explicit runtimeVersion policy: Use appVersion, sdkVersion, or fingerprint consistently - mismatch strands users on stale JS silently.
Adopt fingerprint CI gates: @expo/fingerprint diff before merge tells you whether OTA is safe or a new eas build is mandatory.
Rebuild dev clients after native changes: SDK bumps, new native modules, and config plugin edits require new development profile builds - OTA cannot upgrade embedded native code.
Let EAS manage iOS credentials: Distribution certs and provisioning profiles stored encrypted - teammates use --non-interactive without Xcode signing exports.
Let EAS generate Android keystores for greenfield apps: Upload existing keystores only when migrating a live Play app - fingerprint must match Play Console upload certificate.
Enable Play App Signing: Google holds the app signing key - upload key loss is recoverable; app signing key loss is catastrophic.
Use buildType: "app-bundle" for Play production: APK is for internal sideload preview - AAB is required for store production uploads.
Enable autoIncrement on store profiles: Remote buildNumber / versionCode prevents "redundant binary" and "version code already used" rejections.
Register iOS devices before ad hoc builds: eas device:create → tester enrollment → rebuild - profiles embed UDIDs at compile time.
Prefer TestFlight internal over ad hoc for iOS QA: Production signing, easier installs, no per-device profile rebuild for ASC team members - TestFlight Distribution.
Submit to Play internal track before production: Catch signing and policy issues on up to 100 testers - promote through closed → open → staged rollout.
Store submit secrets in CI vaults: App Store Connect .p8 and Play service account JSON - never in git; reference paths in eas.json submit profiles.
Use EXPO_TOKEN for CI builds and submits: Machine tokens from expo.dev - personal session tokens expire and break pipelines.
Run npx expo-doctor before eas build: Catch invalid config and SDK version skew before spending EAS minutes on a doomed compile.
Express native changes in config plugins: Hand-editing generated Info.plist or build.gradle is lost on prebuild --clean - hooks are not a substitute.
Document eas-build-pre-install / post-install hooks: Non-obvious pipeline steps belong in README - future engineers will not read package.json scripts first.
Keep hooks fast: Private registry auth and codegen are fine - 20-minute E2E suites belong in CI gates before triggering EAS, not on the worker.
Pin cli.version in eas.json: Ensures local and CI use compatible EAS CLI semantics - bump deliberately when adopting new flags.
Physical device smoke test after credential or plugin changes: Simulators miss push entitlements, App Links, and signing edge cases that only appear on signed IPAs and release APKs.
eas update.eas build for production and development clients.eas login + clone repo with lockfileeas build --profile development --platform ios (simulator) or Android APKnpx expo start --dev-clientnpx expo-doctornpx expo prebuild --no-install (twice - zero diff on second run)eas build --profile preview --platform <one> for device proofStack versions: This page was written for React 19.2.3, React Native 0.86.0, and Expo SDK 57 (
expo~57.0.4).
Reviewed by Chris St. John·Last updated Jul 16, 2026