Moving from local development to a live production environment is often the most stressful part of mobile development. If you’re wondering how to deploy expo app to app store, you’ve likely realized that while Expo makes development a breeze, the Apple ecosystem requires a very specific set of credentials and configurations.

In my experience, the transition from the Expo Go app to a standalone binary is where most developers hit a wall. Whether you are using the Expo Router tutorial for beginners to build your navigation or you’re coming from a more complex setup, the deployment pipeline remains the same. Today, we use EAS (Expo Application Services), which has fundamentally changed how we handle certificates and builds.

Prerequisites

Before we touch a single line of code, you need these three things in place. Without them, you cannot publish to the App Store:

Step 1: Configure your app.json

Your app.json (or app.config.js) is the source of truth for your app. You need to provide a unique bundle identifier that Apple uses to identify your app globally.

{
  "expo": {
    "name": "My Awesome App",
    "slug": "my-awesome-app",
    "version": "1.0.0",
    "ios": {
      "bundleIdentifier": "com.yourname.myapp",
      "buildNumber": "1.0.0",
      "supportsTablet": true
    },
    "extra": {
      "eas": {
        "projectId": "your-project-id-from-expo"
      }
    }
  } }

If you’re still debating why use Expo instead of React Native CLI, this is exactly why: EAS handles the complex Xcode project generation for you in the cloud.

Step 2: Initialize EAS Build

Run the following command in your project root to set up your build configuration:

eas build:configure

This creates an eas.json file. I recommend setting up a specific production profile to ensure your app is optimized for the store. Your eas.json should look something like this:

{
  "build": {
    "production": {
      "distribution": "store",
      "autoIncrement": true
    }
  }
}

Step 3: Running the Production Build

Now we trigger the build. This is where the magic happens. Instead of needing a Mac with Xcode installed locally, Expo’s servers will spin up a macOS VM, install your dependencies, and compile the binary.

eas build --platform ios --profile production

During this process, EAS will ask you to log into your Apple Developer account. Pro Tip: Let EAS handle the credentials. It will generate your Distribution Certificate and Provisioning Profile automatically. I’ve tried doing this manually in the past, and it’s a recipe for ‘Invalid Signature’ errors.

As shown in the image below, once the build starts, you can follow the progress in your terminal or via the Expo dashboard.

Terminal output showing successful EAS iOS build process
Terminal output showing successful EAS iOS build process

Step 4: Submitting to App Store Connect

Once your build is finished, you have a .ipa file sitting on Expo’s servers. You can manually download it and use Transporter, but the fastest way is using the EAS submit command:

eas submit -p ios

This pushes your binary directly to App Store Connect. From here, you just need to log into the web portal, fill out your app descriptions, upload screenshots, and submit for review.

Pro Tips for a Smooth Approval

Troubleshooting Common Errors

Error Cause Solution
Bundle ID mismatch The ID in app.json doesn’t match App Store Connect Ensure bundleIdentifier is identical in both places.
Missing Icon Icon file missing or wrong format Check expo.icon path and ensure it’s a PNG.
Build Timeout Too many heavy dependencies Check for unused packages or upgrade your EAS plan.

What’s Next?

Once your app is live, the work doesn’t stop. I highly recommend setting up OTA (Over-the-Air) Updates. With eas update, you can push bug fixes to your users instantly without waiting for Apple’s 24-48 hour review process. This is a game-changer for productivity.