Expo EAS Guide: Automate Submissions & OTA Updates
Discover Expo EAS tools for seamless app deployment. Submit builds, push OTA updates, and optimize workflows to release mobile apps without manual hassle.
Share this blog on
Automating mobile app releases is no longer optional; it’s essential for speed and reliability. This guide dives into Expo’s EAS Submit, OTA Updates, and advanced eas.json workflows to help you streamline your mobile CI/CD pipeline. Learn how to push builds directly to App Store or Play Console without manual uploads, deliver instant bug fixes through over-the-air updates, and customize workflows with environment variables, caching, and runtime strategies. Whether you’re preparing production launches or internal betas, this blog equips you with proven steps and tips to release faster, reduce errors, and maintain smooth mobile delivery cycles.
Building your mobile app is only half the battle - releasing it smoothly to the App Store or Play Store (and updating it without friction) is where the real challenge begins. In this second part of our Expo EAS automation series, we’ll explore how to streamline app store submissions with eas submit
, push live fixes using over-the-air (OTA) updates, and scale your workflow with advanced eas.json
configurations.
Whether you're shipping to production or running internal beta tests, this guide will help you master Expo’s EAS tools and finally automate your entire mobile CI/CD pipeline - no Transporter, no manual uploads, and no surprises.
✅ New here? Start with Part 1 of this series, where we walk through automating builds with Expo EAS.
Automate App Store Submissions with EAS Submit (No Manual Uploads Needed)
Take full control of mobile releases by configuring once and deploying effortlessly - no Transporter, no console hopping, just clean, reliable delivery.
Building your app is step one. EAS Submit handles step two: uploading it to app stores.
Set up credentials:
Use an App Store Connect API key for iOS
Or a Google service account JSON for Android
Ensure your app is already created in App Store Connect or Play Console, and your app IDs are set
Submit a build:
The --latest
flag grabs your most recent EAS build. The CLI guides you through any missing info, like app IDs or submission tracks.
Optional: eas.json
config
Save repeat settings in a submit profile to avoid re-entering them:
One-step automation:
This builds and submits in one go! Perfect for release branch workflows.
With EAS Submit, pushing to TestFlight or Play Console becomes a single command - no Transporter, no manual uploads. For growing teams that need reliable release pipelines, explore how we build and scale React Native apps with Expo EAS automation.
Push Live Fixes with Over-the-Air Updates in Expo
Need to fix a bug without waiting for an App Store review? EAS Update lets you push over-the-air (OTA) updates - ideal for quick JS, UI, or asset changes (not native code).
How it works:
With expo-updates
installed, your app checks a designated channel for updates on launch. If a new JS bundle is published, it downloads and applies it (immediately or on next restart).
Setup Steps:
Ensure expo-updates
is installed (EAS handles this in managed workflow).
Define channels like
production
orstaging
ineas.json
:Publish an update:
Note: If you don’t provide the --environment
flag, EAS will default to loading environment variables from your local .env
file (e.g., .env
, .env.local
, etc.) based on your Expo config and .gitignore
. Use --environment
to load variables from a named environment configured in your eas.json
.
This uploads your JS and assets to Expo’s servers. All apps linked to that channel will fetch the update next time they launch.
Channels act like deployment branches - you can create new ones, switch, or roll back easily via the Expo dashboard.
Use cases for EAS Update:
Quick bug fixes and patches between app store releases. For example, you discovered a typo or a small bug after releasing – push an OTA update to fix it for users immediately.
Feature flags or phased rollouts. You could have a “beta” channel for some users to receive new features early.
Content or configuration updates that don’t warrant a full binary release.
To see how OTA strategies fit into larger delivery pipelines, read how we streamline mobile CI/CD with cloud-native DevOps practices.
Important: Always test OTA updates and ensure they're compatible with your app’s native code. If you’ve added or changed native functionality, you'll need a new binary build.
Use runtimeVersion
to prevent updates from applying to incompatible app versions commonly tied to your app’s semantic version (e.g., 1.2.0
).
You can also use:
To push feature branch updates to testers instantly, especially with internal builds or Dev Clients.
eas.json Deep Dive: Build Profiles, Env Vars, and More
Learn how to configure and extend your EAS workflow using eas.json
from defining custom build types to managing secrets and runtime behavior.
Custom Build Profiles
Create profiles like staging
or internal
, with custom channels or settings.
Example:
Env Variables & Secrets
Store secrets on expo.dev or define in eas.json
:
Auto Version Bumping
Avoid duplicate build errors with:
Parallel & Conditional Workflows
Run
--platform all
to build both platformsUse EAS YAML Workflows to define pipelines with jobs like build, test, and update triggered via GitHub
Caching
EAS auto-caches dependencies to speed up builds. Use --clear-cache
if needed.
EAS Tips, Tricks, and Gotchas You Should Know
Avoid common pitfalls and boost your workflow efficiency with real-world insights, proven strategies, and troubleshooting best practices.
Pro Tips for a Smooth EAS Experience
Branch & Channel Strategy: Align Git branches with EAS build profiles and channels.
Example:main
→production
build onproduction
channeldevelop
→preview
build onpreview
channel
Keeps updates organized and environments isolated.
Semantic & Runtime Versioning: Use SemVer (e.g.
1.2.0
) and set:
To ensure OTA updates only apply to compatible app versions.
production
to control who receives which OTA. Tie them to matching release branches for safer, segmented rollouts.
QA with Internal Builds: Set
"distribution": "internal"
for fast feedback. iOS uses ad-hoc provisioning; Android builds generate a shareable APK link perfect for testers and PMs.Always Test Before Shipping: Even with automation, test builds on real devices. Check native changes, verify OTA updates using test channels or
Updates.checkForUpdateAsync()
.Stay Updated: Keep EAS CLI current with:
This ensures compatibility with new Xcode/Gradle versions and gives you access to the latest features.
Common Pitfalls and How to Solve Them
iOS Provisioning Problems
If a build fails at the credentials step:
To inspect or clear old certs/profiles. You can also clean up stale provisioning profiles in the Apple Developer Portal. Then rerun:
Hitting the 100-device limit on ad hoc profiles? Use TestFlight or Enterprise distribution.
Credential Conflicts and Bundle ID Mismatches
One recurring pain point developers face is dealing with mismatched credentials or incorrect bundle IDs. If you’ve used different Apple teams or environments before, stale provisioning profiles or misconfigured IDs can cause build failures.
Tip: Always verify that your app.json
and eas.json
are in sync with your Apple/Google developer accounts. Use eas credentials
to inspect and clean credentials when in doubt.
OTA Update Not Showing
Ensure your build’s channel matches the one used in
eas update
Confirm
expo-updates
is configured to check for updatesUse the Updates API for immediate fetching if needed
Check expo.dev to verify the update was published successfully
Restart the app - updates often apply on next launch
Sentry Source Maps (OTA)
For clean stack traces:
Set
SENTRY_AUTH_TOKEN
in your EAS envAfter
eas update
, run:Or chain it:
This links crashes to specific OTA updates.
Build Cache Glitches
Cached dependencies can cause obscure errors. Run:
eas build --clear-cache
Especially helpful when switching SDKs or native modules.
Gradle / Pod Failures
If Android or iOS builds fail on dependencies, try:
expo doctor
Ensure your SDK version is EAS-supported. For new toolchain updates (like a new Xcode), check Expo forums for compatibility updates.
Why EAS Is the Easiest Way to Automate Your App Releases in 2025
Adopting Expo’s EAS gives you a true mobile CI/CD superpower - no Mac build machines, no key juggling, no manual uploads, and no delays for minor fixes.
Speed & Simplicity: One command to build, another to ship. EAS saves hours of tedious work with minutes of automation.
Reliable Releases: Automated versioning and cloud consistency eliminate "works on my machine" surprises. OTA updates give you a safety net for hotfixes.
More Time for What Matters: EAS handles the infrastructure behind app development, giving you more time to focus on what matters most: features, UX, and quality.
Automation That Pays Off
Developers who switch from manual or semi-manual pipelines (like GitHub Actions) to EAS consistently report a drop in build delays and manual errors. Automating the build and submission process has a compounding effect - less time spent fixing signing issues, fewer last-minute bugs, and faster feedback cycles.
Whether you're a solo dev or part of a larger team, automation through EAS can reduce context switching and get your release cadence on track.
Pro Tip: Integrate EAS early in your project. It promotes good habits (like versioning and OTA planning) before release pressure kicks in and helps you catch platform quirks early.
Helpful Resources to Master Expo EAS
EAS Docs – Full guides on Build, Submit, and Update
OTA Updates – How to ship changes instantly
Need help? Team up with the Pros
EAS lets you build, ship, and iterate with confidence. Automate the boring stuff so you can focus on what you do best: building great apps.
Planning to modernize your release workflow? Talk to our team about automating Expo EAS submissions and OTA updates, so you can focus on features instead of manual uploads.
If you found this post valuable, I’d love to hear your thoughts. Let’s connect and continue the conversation on LinkedIn.