Deploy Expo App to App Store: The 2026 Guide
Learn to deploy expo app to app store in 2026. This guide covers EAS Build, credentials, App Store Connect, and avoiding rejections.

You've finished the Expo app. The simulator looks good, TestFlight in your head feels one click away, and then Apple enters the chat with certificates, identifiers, metadata forms, reviewer notes, and just enough hidden rules to waste a week.
That's the part most first-time guides undersell. Shipping an Expo app to the App Store isn't mainly about writing eas build and waiting. It's about getting a chain of small details exactly right the first time, because the failures are usually boring, preventable, and expensive in time.
A lot of first submissions fail for reasons that have nothing to do with app quality. Applighter's breakdown of first-time App Store submissions notes a 25–30% rejection rate for first-time Expo submissions, with inapp functionality accounting for 18% of rejections and missing or inaccessible privacy policy URLs accounting for 12%. Those aren't mysterious edge cases. They're checklist problems.
Table of Contents
- Your App Is Coded Now What
- Pre-Flight Check Before You Build
- Mastering EAS Credentials and Identifiers
- Building and Submitting Your App with EAS
- Preparing Your App Store Connect Listing
- Navigating the App Review Process
- Common Pitfalls and Final Submission Checklist
Your App Is Coded Now What
Developers often get blindsided. The coding phase feels hard in an honest way. Bugs have stack traces. UI problems are visible. App Store problems are different. Apple rejects for missing details, mismatched metadata, or because the reviewer couldn't log in and moved on.
The first trap is assuming App Store submission is a packaging task. It isn't. It's a release discipline problem. Your binary, app record, review notes, privacy details, sign-in path, and versioning all have to line up. If one piece drifts, the whole thing stalls.
I've seen the same pattern repeatedly with Expo teams. They trust that because EAS abstracts away native setup, the submission phase will also be forgiving. It's not. Expo makes the build pipeline much cleaner, but Apple still reviews the finished app and the listing exactly the same way.
Practical rule: The app isn't ready when the code is done. It's ready when a stranger can install it, open it, log in, understand it, and verify compliance without asking you questions.
That's why pre-submission audits matter more than rescue work after rejection. If your login flow breaks for reviewers, if a privacy policy URL doesn't open, or if a key feature is incomplete, you're not dealing with “bad luck.” You're dealing with a release process that stopped too early.
A stronger mindset is to treat App Store release like a QA handoff to Apple:
- Binary check: Does the build install and run cleanly on a real device?
- Reviewer check: Can someone access every gated screen without Slacking you?
- Metadata check: Does the listing describe what the app does?
- Compliance check: Are required fields filled in, reachable, and believable?
Most frustration comes from tiny mismatches between those layers. The rest of this guide focuses on the gotchas that basic tutorials skip, because those are the ones that usually cost the most time.
Pre-Flight Check Before You Build
The fastest way to waste a release day is to run EAS before your project identity is stable. Apple is strict about app identity. Expo is strict about configuration. If the two disagree, you don't get a “close enough” pass.

Lock down identity first
Start with the values in app.json or app.config.js that define the app Apple will see.
The most important ones are:
name. This is the user-facing app name. Keep it consistent with your App Store listing.slug. This matters inside the Expo ecosystem, especially for project organization.version. Pick the release version before you build. Changing it carelessly later can force a rebuild.ios.bundleIdentifier. This is the app's permanent identity on Apple's side.
If you're still debating the bundle identifier, stop and decide now. Once you've created the app record in App Store Connect with one identifier and built the app with another, you've created a mismatch that tends to ripple through credentials, profiles, and submission.
A good pattern is to decide all identity values in one sitting, then copy them into a release checklist. Teams get into trouble when someone updates App Store Connect manually, someone else updates app.json, and neither notices they now differ by a character or suffix.
Validate assets before EAS touches them
App Store release problems aren't always code problems. Some are asset problems disguised as platform weirdness.
Before building, verify:
- App icon quality: Use a production-ready source file, not a placeholder export.
- Splash and branding consistency: Make sure the build assets match the store listing visuals.
- Privacy policy destination: The URL should load publicly and clearly describe your app's handling of user data.
- Login testing path: If the app requires authentication, prepare a reviewer-safe route through the product.
Shipping gets much easier when you assume Apple will test your app with zero context and very little patience.
I also recommend a quick real-device smoke test before touching EAS. Open the app on hardware, not just the simulator. Trigger onboarding, permissions, login, purchase flow if relevant, and any screen that relies on a remote environment variable. That catches the embarrassing failures, the kind where the app technically builds but the first meaningful tap breaks.
Here's a compact pre-build audit:
| Item | What to verify |
|---|---|
| Project identity | App name, slug, version, bundle identifier are final |
| App record readiness | App Store Connect record exists and matches project identity |
| Assets | Icon and launch assets are final and exported cleanly |
| Runtime sanity | Core flows work on a real iPhone |
| Compliance basics | Privacy policy URL exists and is publicly accessible |
Do this once, cleanly, before the first production build. It's much easier than explaining to your team why a release failed over metadata drift.
Mastering EAS Credentials and Identifiers
EAS feels magical until credentials go wrong. Then it feels like Apple's signing system has personally targeted you. The good news is that the pain usually comes from one misunderstood setup step, not from Expo itself.

What EAS is actually managing
When you use EAS for iOS release, Expo helps coordinate the Apple-side artifacts needed to sign and distribute your app. That usually means you aren't manually creating and passing around certificate files in Xcode, which is exactly why Expo is such a relief for many React Native teams.
But abstraction isn't the same as elimination. Those credentials still exist. EAS just orchestrates them for you.
The common first-time mistake is assuming eas build alone covers the full Apple release path. It doesn't. Build and submit are related but distinct jobs. Signing the app is one concern. Uploading it to App Store Connect is another.
The API key mistake that wastes hours
The credential gap most tutorials skip is the App Store Connect API key for EAS Submit. That omission causes a lot of “invalid credentials” confusion. This Stack Overflow discussion on submitting an Expo app to an existing App Store app record highlights that many guides miss the need to generate a specific App Store Connect API key via eas credentials, even though it's essential for avoiding submit failures.
That matters because developers often do one of these things:
- They set up build credentials successfully.
- They assume submit credentials are already handled.
- They run submission.
- EAS can't authenticate the upload cleanly.
- They start debugging the wrong layer.
If you want a calmer release flow, treat credentials as two checkpoints:
- Signing checkpoint: Can Apple accept this app as a valid distributable binary?
- Submission checkpoint: Can EAS authenticate against App Store Connect and upload it?
Release habit: Run credential setup before the release build, not after the build succeeds. Credential errors are easier to fix when you're not also trying to hit a launch window.
A practical sequence looks like this:
- Install and log into the Expo CLI and EAS CLI.
- Confirm the correct Apple Developer account is being used.
- Run
eas credentials. - Review what EAS has created or synced for iOS.
- Make sure the App Store Connect API key exists for the submit path, not just for build signing.
If your team has multiple Apple accounts, be extra careful. The technical issue often isn't “credentials are broken.” It's “the credentials belong to a different team or app context than the one this project expects.”
Here's the simplest mental model: credentials must match the app identity exactly, and the app identity starts with the bundle identifier. If that identifier is drifting between environments, credentials will seem randomly unreliable when they are, in fact, doing their job correctly against the wrong target.
Building and Submitting Your App with EAS
Once the project identity and credentials are stable, the actual Expo pipeline is refreshingly direct. The standard path is to build the iOS binary first, then submit it from the CLI without falling back to a manual Xcode archive flow.

Use the CLI path that Apple and Expo workflows expect
The release commands are straightforward:
- Run
eas build --platform ios - After the build completes, run
eas submit --platform ios
This walkthrough on deploying an Expo app to the Apple App Store documents that CLI-driven pipeline and notes a few details that trip people up: EAS Submit needs an App Store Connect API key during submission, your bundleIdentifier in app.json must match the one in App Store Connect exactly, and the app icon should be uploaded as a 1024x1024px JPG rather than PNG to avoid metadata rejection during the Prepare for Submission phase.
That workflow is one of the biggest reasons teams choose Expo for release management. You can skip manual Xcode archiving and upload directly to App Store Connect from the same toolchain you used to build.
A clean production profile in eas.json also helps. Keep it boring. Production should point at your final environment values, not a shared staging setup that happened to work during testing.
What usually breaks during build or submit
When developers say “EAS failed,” the root problem is often one of these:
- Bundle identifier mismatch: The project says one thing, App Store Connect expects another.
- Credential confusion: The build signed fine, but submit can't authenticate.
- Version drift: The binary you uploaded doesn't line up with the App Store version entry you intended to use.
- Asset rejection later: The app built, but listing metadata blocks release.
The most important mindset shift is this: a successful build does not mean you're ready to ship. It only means the binary exists.
A useful midpoint check after eas build --platform ios is to review the generated artifact and the target app record before submitting. Confirm you're pushing the right binary to the right app. This takes minutes and saves the awkward moment where the correct app is uploaded under the wrong listing identity.
For a visual walkthrough of the CLI flow, this quick demo is useful:
If your goal is to deploy an Expo app to the App Store reliably, don't treat eas submit like an afterthought. It's part of the release pipeline, not an administrative last click.
Preparing Your App Store Connect Listing
A surprising number of App Store failures happen after the binary is already uploaded. Developers relax once the IPA is in App Store Connect, then run into listing issues that Apple treats just as seriously as technical defects.

Treat the listing like part of the product
Your App Store Connect listing isn't marketing garnish. It's part of the review surface. Apple checks whether the listing, privacy details, and in-app experience align.
That means your app name, subtitle, description, screenshots, privacy policy, and review notes should all describe the same product the binary presents. If the app says one thing, the listing promises another, and your sign-in path hides the key feature, reviewers slow down fast.
A practical way to build the listing is to work from the app's first-time user journey:
- What does the user see first?
- What does the reviewer need to do to test the core value?
- Which screenshots prove that value quickly?
- Which permissions need explanation inside the listing and notes?
The fields that trigger avoidable rejection
Some App Store Connect fields are far more dangerous than they look. This guide to publishing an Expo app on the App Store calls out three in particular.
First, the App Review Information field. If your app requires login and you fail to provide working demo credentials, the approval rate is 0% until rectified, because Apple can't bypass the login screen during review.
Second, the Made for Kids questionnaire. Selecting it triggers a mandatory compliance review that commonly extends the usual 24-48 hour review window by several days, while not selecting it keeps you aligned with the standard 24-48 hour benchmark when the app is not intended for that category.
Third, the version field in app.json. If it doesn't follow Apple's semantic versioning format such as 1.0.0, submission can fail and force a full rebuild.
If the app has a login wall, reviewer credentials are not “nice to have.” They are part of the product you are submitting.
Those three gotchas catch more first-time teams than obscure native bugs. They also create the most demoralizing kind of delay, because the fixes are usually simple but require a new cycle anyway.
A tighter listing workflow
Instead of filling App Store Connect from top to bottom in one sitting, split it into review-critical layers.
Layer one is access. Add the build, verify the version, and prepare reviewer notes plus demo credentials first.
Layer two is compliance. Finish privacy details and make sure the privacy policy URL is public, loads on mobile, and clearly belongs to your app or company.
Layer three is presentation. Then polish screenshots, subtitle, promotional text, and release notes.
Here's a concise review matrix:
| Listing area | What Apple cares about most |
|---|---|
| Review information | Can the reviewer access and test the app quickly |
| Versioning | Does the binary line up with the version entry cleanly |
| Privacy details | Do your disclosures match app behavior |
| Screenshots | Do they represent the actual current app |
| Category and audience | Have you classified the app accurately |
A few practical habits help here:
- Use a reviewer account that won't expire: Temporary codes and short-lived magic links create avoidable failure.
- Write direct review notes: Tell Apple exactly how to reach the core flow.
- Audit every URL manually: Privacy policy links fail in surprisingly boring ways.
- Generate screenshots after UI freeze: Don't redesign onboarding after exporting your store assets.
If you're trying to deploy an Expo app to the App Store smoothly, App Store Connect is where discipline matters most. Not because it's hard technically, but because Apple expects you to communicate clearly.
Navigating the App Review Process
Many developers approach review like a courtroom. That's the wrong frame. Apple's reviewer isn't there to admire your architecture. They're there to determine whether the app works, matches its listing, and follows policy.
Write for the reviewer you actually have
A good reviewer note is short, specific, and operational. It should answer the questions a reviewer would ask after opening the app cold on a work device.
Include details like:
- How to log in: Provide the exact test credentials and any needed setup steps.
- What to test first: Point them to the primary user flow.
- What might look broken but isn't: Explain region locks, role-based content, or required approval states.
- How to reach support during review: Give a contact who can respond quickly if Apple messages through Resolution Center.
Reviewers respond better to clarity than persuasion. Tell them how to verify the app, not why the app deserves approval.
If the app has a non-obvious flow, say so plainly. Don't make the reviewer hunt for the value. Every extra tap and every moment of uncertainty raises the chance of a reject, or at least a clarifying message that drags the process out.
How to respond when Apple rejects the build
Read the rejection carefully and answer only the actual issue. Teams lose time by sending defensive essays instead of confirming the fix.
A solid response usually has three parts:
- Acknowledge the issue directly.
- State what changed.
- Explain how the reviewer can verify the fix now.
For example, if the rejection is about access, don't relitigate the feature set. Send updated reviewer credentials, list the login steps, and mention any account state the reviewer should expect after signing in.
If the issue is policy-related and you believe Apple misunderstood the feature, respond calmly and map the feature to the relevant behavior inside the app. Screenshots can help when the Resolution Center discussion gets ambiguous, but the writing still needs to be crisp.
The fastest approvals usually happen when developers treat the reviewer like a QA partner with limited context, not an opponent blocking launch day.
Common Pitfalls and Final Submission Checklist
The ugly part of App Store release is that small mistakes often have big consequences. A one-character bundle mismatch, an unreachable privacy policy page, or missing demo credentials can send you back into a rebuild or resubmission loop.
The good part is that these problems are predictable. You can catch most of them in one final pass if you review the whole release as a connected system instead of a list of separate screens.
The most common trouble spots are familiar by now:
- Identity mismatch:
bundleIdentifierin your Expo config doesn't match App Store Connect. - Versioning mistake:
app.jsonversion format isn't acceptable for Apple. - Reviewer lockout: Login-required app, but no working demo account in review info.
- Policy hygiene: Privacy policy URL is missing, broken, or inaccessible.
- Asset formatting: Store-facing icon or screenshots don't match Apple's expectations.
Use this right before you submit:
| Check Item | Status (OK / Check) | Notes |
|---|---|---|
ios.bundleIdentifier matches the App Store Connect app record exactly |
||
version in app.json follows semantic versioning |
||
| Production build was created from the intended release config | ||
| App Store Connect build selection matches the intended app version | ||
| Login-required flows have working demo credentials in App Review Information | ||
| Privacy policy URL is public, reachable, and relevant to the app | ||
| Core in-app functionality works on a real device | ||
| App icon and screenshots are final and compliant | ||
| Review notes explain how to test the main flow | ||
| Team account, credentials, and submission target are the correct Apple context |
That final pass is the difference between “submitted” and “shipped.” Teams don't need more tutorials. They need fewer hidden assumptions.
If you'd rather skip the credential maze, metadata cleanup, screenshot prep, privacy docs, reviewer notes, and the back-and-forth that often follows first submission, LetsDeployIt handles Expo and React Native launches end to end. They wire up EAS Build and Submit, prepare the store listing materials Apple expects, manage reviewer communication, and keep resubmitting until the app is approved.