AI Infrastructure

AI Infrastructure

Mastering Expo EAS: Submit, OTA Updates, and Workflow Automation

Pushkar Thakur

7 min read

AI Infrastructure

Mastering Expo EAS: Submit, OTA Updates, and Workflow Automation

Pushkar Thakur

7 min read

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:

eas submit --platform ios --latest  
eas submit --platform android --latest

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:

{
  "submit": {
    "production": {
      "ios": { "ascAppId": "1234567890" },
      "android": {
        "serviceAccountKeyPath": "./key.json",
        "track": "internal"
      }
    }
  }
}

One-step automation:

eas build --platform ios --profile production --auto-submit

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 or staging in eas.json:

    "production": { "channel": "production" }
  • Publish an update:

    eas update --channel production --message "Fixed login crash"

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:

eas update --channel preview

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:

"android": { "buildType": "apk" },
"ios": { "enterpriseProvisioning": "adhoc" }

Env Variables & Secrets

Store secrets on expo.dev or define in eas.json:

"env": {
  "API_URL": "...",
  "SENTRY_AUTH_TOKEN": "..."
}

Auto Version Bumping

Avoid duplicate build errors with:

Parallel & Conditional Workflows

  • Run --platform all to build both platforms

  • Use 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:

    • mainproduction build on production channel

    • developpreview build on preview channel
      Keeps updates organized and environments isolated.

  • Semantic & Runtime Versioning: Use SemVer (e.g. 1.2.0) and set:

    "runtimeVersion": { "policy": "appVersion" }

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:

    npm upgrade -g eas-cli  
    # or  
    npx eas-cli
    
    

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:

eas credentials

To inspect or clear old certs/profiles. You can also clean up stale provisioning profiles in the Apple Developer Portal. Then rerun:

eas build -p ios

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 updates

  • Use 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 env

  • After eas update, run:

    npx sentry-expo-upload-sourcemaps dist

    Or chain it:

    eas update --branch prod && npx sentry-expo-upload-sourcemaps dist

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 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.

Curious what Expo EAS can do for you?

Our team is just a message away.

Curious what Expo EAS can do for you?

Our team is just a message away.

Other blogs you might like

Procedure is an AI-native design & development studio. We help ambitious teams ship faster, scale smarter, and solve real-world problems with clarity and precision.

© 2025 Procedure Technologies. All rights reserved.

Procedure is an AI-native design & development studio. We help ambitious teams ship faster, scale smarter, and solve real-world problems with clarity and precision.

© 2025 Procedure Technologies. All rights reserved.

Procedure is an AI-native design & development studio. We help ambitious teams ship faster, scale smarter, and solve real-world problems with clarity and precision.

© 2025 Procedure Technologies. All rights reserved.