📄 expo/eas/workflows/examples/deploy-to-production

File: deploy-to-production.md | Updated: 11/15/2025

Source: https://docs.expo.dev/eas/workflows/examples/deploy-to-production

Hide navigation

Search

Ctrl K

Home Guides EAS Reference Learn

Archive Expo Snack Discord and Forums Newsletter

Deploy to production with EAS Workflows

Edit page

Copy page

Learn how to deploy to production with EAS Workflows.

Edit page

Copy page


When you're ready to deliver changes to your users, you can build and submit to the app stores or you can send an over-the-air update. The following workflow detects if you need new builds, and if so, it sends them to the app stores. If new builds are not required, it will send an over-the-air update.

Graph showing the deploy to production workflow.

Expo Golden Workflow: Deploy your app to production with an automated workflow

Expo Golden Workflow: Deploy your app to production with an automated workflow

Get started


Prerequisites

3 requirements

Set up EAS Build

To set up EAS Build, follow this guide:

EAS Build prerequisites

Get your project ready for EAS Build.

Set up EAS Submit

To set up EAS Submit, follow the Google Play Store and Apple App Store submissions guides:

Google Play Store CI/CD submission guide

Get your project ready for Google Play Store submissions.
Apple App Store CI/CD submission guide

Get your project ready for Apple App Store submissions.

Set up EAS Update

And finally, you'll need to set up EAS Update, which you can do with:

Terminal

Copy

- eas update:configure

The following workflow runs on each push to the main branch and performs the following:

  • Takes a hash of the native characteristics of the project using Expo Fingerprint .
  • Checks if a build already exists for the fingerprint.
  • If a build does not exist, it will build the project and submit it to the app stores.
  • If a build exists, it will send an over-the-air update.

.eas/workflows/deploy-to-production.yml

Copy

name: Deploy to production on: push: branches: ['main'] jobs: fingerprint: name: Fingerprint type: fingerprint environment: production get_android_build: name: Check for existing android build needs: [fingerprint] type: get-build params: fingerprint_hash: ${{ needs.fingerprint.outputs.android_fingerprint_hash }} profile: production get_ios_build: name: Check for existing ios build needs: [fingerprint] type: get-build params: fingerprint_hash: ${{ needs.fingerprint.outputs.ios_fingerprint_hash }} profile: production build_android: name: Build Android needs: [get_android_build] if: ${{ !needs.get_android_build.outputs.build_id }} type: build params: platform: android profile: production build_ios: name: Build iOS needs: [get_ios_build] if: ${{ !needs.get_ios_build.outputs.build_id }} type: build params: platform: ios profile: production submit_android_build: name: Submit Android Build needs: [build_android] type: submit params: build_id: ${{ needs.build_android.outputs.build_id }} submit_ios_build: name: Submit iOS Build needs: [build_ios] type: submit params: build_id: ${{ needs.build_ios.outputs.build_id }} publish_android_update: name: Publish Android update needs: [get_android_build] if: ${{ needs.get_android_build.outputs.build_id }} type: update params: branch: production platform: android publish_ios_update: name: Publish iOS update needs: [get_ios_build] if: ${{ needs.get_ios_build.outputs.build_id }} type: update params: branch: production platform: ios

Show More