How to Submit an App Update to the App Store (Step by Step)

DavidDavid September 6, 2026 10 min read
An overhead still life on a warm walnut desk: a silver laptop showing an upload progress bar, a phone displaying a version number badge, a small stack of printed release notes and a coffee cup, with open space on the left
Original image, App Store Launch Club

How to Submit an App Update to the App Store, Start to Finish

Submitting an app update to the App Store is the same loop every time: raise your version number, raise your build number, produce a new binary, upload it to App Store Connect, create a new App Store version that points at that build, write the release notes, and submit for review. A binary change (any change to native code, permissions, SDK versions, or anything that is not pure JavaScript and assets) has to go through this loop. There is no shortcut around review for a native change, and trying to find one is how apps get flagged.

The reason updates feel harder than the first launch is that the first launch is a checklist you follow once, while updates are a routine you repeat for the life of the app. The people who ship a steady stream of updates are not doing anything clever; they have turned the loop below into muscle memory so a release takes twenty minutes of attention instead of an anxious afternoon. This is the loop, in order.

Version Number vs Build Number: The Distinction That Trips Everyone

Every App Store update involves two numbers that do completely different jobs, and mixing them up is the single most common reason an upload gets rejected before it even reaches review. The version number is the public, human-facing number like 1.2.0 that users see on your App Store page. The build number is an internal counter that identifies one specific binary. App Store Connect enforces one hard rule: the build number of a new upload must be strictly higher than any build number you have ever uploaded, even for a different version.

In practice this means the version number increases when you want users to see a new release, and the build number increases every single time you upload a binary, including the third re-upload of the same version after you fixed a rejection. If you upload version 1.2.0 build 5, get rejected, and re-upload as version 1.2.0 build 5 again, the upload fails. It has to be build 6. Treat the build number as an ever-increasing odometer that never resets and never repeats.

What each number controls

NumberWhere it livesWhen it must change
Version (e.g. 1.2.0)version in app config, shown to users on the App StoreFor every public update users should see; follow major.minor.patch
Build number (e.g. 7)ios.buildNumber in app config, internal to App Store ConnectFor every binary you upload, always higher than any previous build, even a re-upload of the same version

Step 1: Bump the Version and Build a New Binary

Open your Expo app config and raise the version to the new public number, following major.minor.patch: a patch bump (1.2.0 to 1.2.1) for bug fixes, a minor bump (1.2.0 to 1.3.0) for new features, a major bump for a significant redesign. Then either raise ios.buildNumber by hand or, better, enable auto-increment so the build tooling handles it. With that set, produce the release binary with a single command: eas build --platform ios --profile production.

This is a place the Claude Code desktop app earns its keep. Point it at your project and describe the release (a patch fix, a new feature) and it can make the correct version bump in your config, confirm the build number is set to auto-increment, and kick off the build for you, so you are not hand-editing a config file and second-guessing which number to touch. The terminal is there if you prefer it, but you do not need to memorize the commands to run this loop cleanly.

Step 2: Upload the Build to App Store Connect

Once the build finishes, upload it to App Store Connect. With EAS this is one command: eas submit --platform ios --profile production, which takes the build you just produced and delivers it to Apple. After the upload, the build does not appear instantly; App Store Connect runs it through automated processing that usually takes a few minutes to half an hour, and only then does the build show up as available to attach to a version.

Do not start the next step until the build has finished processing and appears in the Build section of your app in App Store Connect. If you added any new permission or a data-collection SDK, this is also when you confirm your App Privacy answers still match what the app actually does, because an update that quietly starts collecting new data with stale privacy answers is a rejection waiting to happen. The details of getting those answers right are in the guide on [app privacy details in App Store Connect](/blog/app-privacy-details-app-store-connect).

Step 3: Create the New Version and Write the Release Notes

In App Store Connect, on your app's page, add a new version using the same version number you set in your config. This opens a fresh version page where you attach the build you just uploaded and fill in the What's New in This Version field, which is the release notes users read before they update. Release notes are required for every update, and a blank or lazy note (like the tired 'bug fixes and performance improvements') is a missed conversion: the note is a small piece of App Store copy that tells returning users why to tap Update.

  1. Lead with the change users will actually feel, in plain language: 'You can now export your notes as PDF' beats 'Added export functionality'.
  2. List real fixes specifically enough to be believable: 'Fixed the crash when opening a shared link' rather than a generic catch-all line.
  3. Keep it short and scannable; two to five short lines is plenty, and the first line is the one most people read.
  4. Only mention things that are true in this build, because a release note describing a feature that is not actually shipping is both a bad look and a review risk.

Step 4: Turn On Phased Release Before You Submit

Phased release is a setting on the version page that rolls your update out to a growing percentage of your existing users over seven days instead of all at once: roughly 1 percent on day one, climbing to 100 percent by day seven. This is the single most useful safety net for an independent builder, because it means a bad build that slipped past your own testing reaches a small fraction of users first, giving you time to catch it in your crash reporter and pause the rollout before it hits everyone.

Turn it on for every update that has any real code change. You can pause a phased release at any point from App Store Connect if something looks wrong, fix it, and resume, and you can release to all users immediately if the update is clean and you want it out fast. New users who install for the first time always get the latest version regardless; phased release only governs how fast the update reaches people who already have the app. Pair it with the crash reporting from the guide on [adding crash reporting to your Expo app](/blog/how-to-add-crash-reporting-to-your-expo-app) so you actually see the problem during that first slow day.

Step 5: Submit for Review and What Happens Next

With the build attached, release notes written, and phased release set, click Add for Review and then Submit. The update enters the same review queue as a first submission. Apple publishes that on average the majority of submissions are reviewed within about 24 hours, but that is a throughput average across all apps, not a promise about yours, so never build a hard launch date on a specific review time. An update is approved, rejected with a specific guideline reason, or occasionally held in review longer for a manual look.

If the update is rejected, treat it exactly like a first-launch rejection: read the guideline Apple cites, fix that one specific thing, raise the build number, and resubmit. An update rejection is usually narrower than a first rejection because most of the app already passed, so it is often a single metadata or behavior issue. If it is approved and you chose phased release, the rollout begins automatically; if you chose to release manually, it sits in a Pending Developer Release state until you press the button.

When You Do Not Need a Full Submission at All

Not every change needs this loop. If your update is pure JavaScript and assets (a copy fix, a color change, a logic tweak, a bug fix in your React code) you can ship it over the air with an update service and skip App Store review entirely, so users get it within hours. The full submission loop is only mandatory for a binary change: new native modules, new permissions, an SDK or Expo version bump, or anything that alters what is compiled into the app.

The discipline is knowing which bucket a change falls into before you start. A native change goes through the five steps above; a JavaScript-only change goes over the air. Confusing the two either wastes a full review cycle on a change that did not need one, or tries to push a native change over the air where it simply will not take effect. The full mechanics of the over-the-air path are in the guide on [pushing app updates without App Store review](/blog/how-to-push-app-updates-without-app-store-review).

Which update path a change takes

ChangePathWhy
Copy, colors, layout, JS logic, JS bug fixOver the air, no reviewOnly the JavaScript bundle changed; no new binary is needed
New native module or library with native codeFull submissionThe compiled binary changed and must be reviewed
New permission (camera, location, etc.)Full submissionRequires a native config change and a usage-description string
Expo SDK or native SDK version bumpFull submissionThe native layer is recompiled, so a new build and review are required

The Update Loop, as a Repeatable Routine

Put together, the whole thing is a short, repeatable routine you run every time you ship. Once it is muscle memory, a routine update is a twenty-minute job, and the phased release plus a crash reporter mean a mistake is contained instead of catastrophic.

  1. Bump the version number for a public update, and let the build number auto-increment.
  2. Build the release binary with EAS.
  3. Upload it and wait for App Store Connect to finish processing.
  4. Create the new version, attach the build, and write specific release notes.
  5. Turn on phased release for any real code change.
  6. Submit for review, then let the rollout run or release manually once approved.

Members inside App Store Launch Club run this loop together, post their release notes for a second pair of eyes, and compare crash-reporter dashboards during that first phased-release day so a bad build gets caught early. If you want the update routine and the rejection fixes in one place instead of learning them one painful release at a time, join at applaunchclub.co for $9 a month.

Free app-building tips, straight to your inbox

Short, practical drops on app ideas, validating fast, store listings, and passing app review. No spam, unsubscribe anytime.

Frequently asked questions

How do I submit an app update to the App Store?

Bump your version number, raise your build number, build a new binary, upload it to App Store Connect, create a new App Store version that points at that build, write your release notes, and submit for review. With an Expo app on EAS this is eas build followed by eas submit, then the version and release-note steps happen inside App Store Connect. Every binary change goes through this same loop.

What is the difference between the version number and the build number?

The version number (like 1.2.0) is the public number users see on your App Store page and must increase for a public update. The build number identifies one specific binary and must be higher than any build number you have ever uploaded, even when you re-upload the same version after a rejection. The cleanest approach is to let EAS auto-increment the build number so an upload is never rejected for a duplicate.

Do I need to update screenshots and the description for every app update?

No. Screenshots and the description carry forward from the previous version, so on a routine update you usually leave them alone. You only update them when the interface changed enough that the old screenshots no longer match the current app, because inaccurate screenshots can trigger a Guideline 2.3 accurate-metadata rejection. Release notes, however, are required for every update.

What is phased release and should I use it?

Phased release rolls an approved update out to a growing share of existing users over seven days, from about 1 percent on day one to 100 percent on day seven, instead of everyone at once. Use it for any update with a real code change: it means a bad build reaches only a small fraction of users first, so you can catch the problem in your crash reporter and pause the rollout before it hits everyone. New installs always get the latest version regardless.

Can I update my app without going through App Store review?

Only for pure JavaScript and asset changes. A copy fix, color change, or JS bug fix can ship over the air with an update service and reach users within hours, skipping review. Any binary change, such as a new native module, a new permission, or an Expo SDK bump, must go through the full submission and review loop. Knowing which bucket a change falls into before you start saves a wasted review cycle.

How long does an app update take to get approved?

Apple publishes that on average most submissions are reviewed within roughly 24 hours, but that is a throughput average across all apps, not a guarantee for yours, so do not build a hard launch date on it. An update review is often faster in practice because most of the app already passed, but treat any specific timing as unpredictable and submit with a buffer before any date you care about.

Last reviewed by David on September 6, 2026

David

Written by

David

Founder and app builder

Keep reading

App StoreLaunch

App Store Phased Release: How the 7-Day Rollout Works, How to Pause It, and When to Skip It

App Store phased release rolls a version update out to a random sample of users with automatic updates on over 7 days: 1 percent on day one, then 2, 5, 10, 20, 50 and 100. You can pause it for up to 30 days in total, or release to everyone with one button. Here is exactly what Apple says it does, what it does not do, and how I decide when an Expo app update should use it.

David 8 min
Read article
App StoreLaunch

App Store Pre-Order: How to Set It Up for Your First Expo App (and When It Is Worth It)

An App Store pre-order publishes your product page before your release date so people can order the app, and on launch day it downloads to their device automatically. Apple only publishes the pre-order after the build has passed App Review, the release date has to sit two to 180 days out for a brand-new app, and you have to release the version manually. Here is how to set it up in App Store Connect for an Expo app, what Apple charges and when, and the three questions I use to decide whether a pre-order is worth the wait.

David 9 min
Read article

Ready to build it yourself?

Join App Store Launch Club, the #1 community for building and launching apps, for $9/month.

← Back to the blog