Have you seen this guide ? TL;DR: Run `eas update:configure` Then create new builds Then run `eas update --channel production` to update builds with the channel production. There is a concept of branches, which allows for more flexible (and complex) release flows. We added `--channel` recently, which makes it such that you don't have to think about branches if you're not using them. Also, to amend another commenter: you can preview updates in Expo Go or inside a development build. With the command above, you can also send updates to end-users using app store builds. If you want to learn more about delivering code to your users, this doc can help. Answer from jonsamp on reddit.com
🌐
Expo Documentation
docs.expo.dev › eas-update › getting-started
Get started with EAS Update - Expo Documentation
The channel property on a build allows you to point updates at specific types of builds. For example, it allows you to publish updates to a preview build without impacting your production deployment.
🌐
Expo Documentation
docs.expo.dev › eas-update › how-it-works
How EAS Update works - Expo Documentation
It is defined in eas.json. For instance, we may have an Android and an iOS build with a channel named "production", while we have another pair of builds with a channel named "staging". Then, we can distribute the builds with the "production" channel to the public app stores, while keeping the "staging" builds on the Play Store Internal Track and TestFlight. Later when we publish an update, we can make it available to the builds with the "staging" channel first; then once we test our changes, we can make the update available to the builds with the "production" channel.
🌐
Expo Documentation
docs.expo.dev › build › updates
Using EAS Update - Expo Documentation
For more general information about configuring the library with EAS Update, see Getting started with EAS Update . Each build profile can be assigned to a channel, so updates for builds produced for a given profile will pull only those releases that are published to its channel.
🌐
Reddit
reddit.com › r/expo › how to do eas update?
r/expo on Reddit: How to do EAS update?
May 31, 2023 -

I'm seriously confused with all this talk about channels, branches and whatnot.

How would I do to be able to push changes directly to my production build?

When I do my builds, i just do:

eas build --platform ios --auto-submit

I guess that uses the production setting below?

eas.json

{
  "cli": {
    "version": ">= 3.10.2"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "android": {
        "buildType": "apk"
      }
    },
    "development-simulator": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": {
        "simulator": true
      }
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {}
  },
  "submit": {
    "production": {}
  }
}
🌐
Expo Documentation
docs.expo.dev › eas-update › eas-cli
Manage branches and channels with EAS CLI - Expo Documentation
EAS Update works by linking branches to channels. Channels are specified at build time and exist inside a build's native code. Branches are an ordered list of updates, similar to a Git branch, which is an ordered list of commits.
Top answer
1 of 3
17

After reading the docs, I think you have to have to think differently about branch and channel.

Channels are specified at build time and exist inside a build's native code.

and

Branches are an ordered list of updates, similar to a Git branch, which is an ordered list of commits.

With EAS Update, we can link any channel to any branch, allowing us to make different updates available to different builds.

So first you have to "publish" the update group to a branch and then you gotta link the channel to point to that branch.

I imagine it could look like

eas update --branch staging-1.0.1
eas channel:edit staging --branch staging-1.0.1

Please correct me if I'm wrong about anything here.

https://github.com/expo/eas-cli#eas-channeledit-name

2 of 3
4

This was also hard to understand for me but now I got it. Unfortunately the docs are so far not really clear.

EAS builds retrieve updates from the channel specified in eas.json. So normally for production builds you would have a channel named "production".

If you now want to run an EAS Update to distribute changes to clients you won't publish directly to a channel but instead you go a detour using branches. Because branches are linked to channels you can work with different branches (e.g. for different versions) and then you only need to change the branch-channel link to publish an update.

To change the linking between a branch and a channel you run:

eas channel:edit

In an simplified setup (like mine) you would have a git branch called production and also a channel with the same name. To publish an update you then just run:

eas update --branch production

or

eas update --auto

In the latter case EAS then sets your current git branch as the branch name, so you could check out the production branch and then run this command to publish the update.

🌐
Expo Documentation
docs.expo.dev › eas-update › rollouts
Rollouts - Expo Documentation
This rollout mechanism allows you to incrementally roll out a set of updates on a new branch to a percentage of end users and leave the remaining percentage of users on the current branch. To start a branch-based rollout, run the following EAS CLI command: ... In the terminal, an interactive guide will assist you in selecting a channel, choosing a branch for the rollout, and setting the percentage of users for the rollout.
🌐
Ignitecookbook
ignitecookbook.com › eas update
EAS Update | Ignite Cookbook for React Native
eas update --branch preview --message "update login screen" Now that the updates are on the server, we can look to update our app on our emulator/device. If the app is still in the foreground, swipe the app away to close it. Reopen it from the app drawer. At this point in time, the default Expo update flow is to check for new updates on the update channel (formerly release channel if you're coming over from expo publish).
Find elsewhere
🌐
DEV Community
dev.to › nour_abdou › react-native-ota-updates-with-expo-eas-step-by-step-guide-best-practices-1idk
React Native OTA Updates with Expo EAS: Step-by-Step Guide & Best Practices - DEV Community
May 12, 2025 - In EAS Update, a channel acts as the "distribution pipeline" that delivers updates to your app, while a branch represents the mode or version stream—such as test or production—from which updates are sourced.
🌐
Expo Documentation
docs.expo.dev › eas-update › deployment
Deploy updates - Expo Documentation
You can keep your channels pointed at a branch with the same name as the channel and think of them as a singular concept. EAS Update branches were meant to map to Git branches and enable teams to publish changes from a Git branch directly to an EAS Update branch of the same name.
🌐
Medium
medium.com › @nnaemekaonyeji27 › update-your-live-react-native-app-in-minutes-with-eas-update-877d131b245b
Update Your Live React Native App in Minutes with EAS Update | by Samuel Nnaemeka Onyeji | Medium
October 15, 2025 - If you are using EAS Build , good news: The eas update:configure command automatically configured update channels for your preview and production profiles in your eas.json file.
🌐
Expo Documentation
docs.expo.dev › eas-update › download-updates
Downloading updates - Expo Documentation
The typical way to use EAS Update is to have a single update URL and a set of request headers (such as update channel name) embedded in a build of your app. To control which update is loaded, you make changes on the server through the eas update ...
🌐
GitHub
github.com › expo › eas-cli
GitHub - expo/eas-cli: Fastest way to build, submit, and update iOS and Android apps
USAGE $ eas channel:resume [NAME] [--branch <value>] [--json --non-interactive] ARGUMENTS NAME Name of the channel to edit FLAGS --branch=<value> Name of the branch to point to --json Enable JSON output, non-JSON messages will be printed to stderr. --non-interactive Run the command in non-interactive mode. DESCRIPTION resume a channel to start sending updates...
Starred by 1.2K users
Forked by 162 users
Languages   TypeScript
🌐
Expo Documentation
docs.expo.dev › tutorial › eas › team-development
Share previews with your team - Expo Documentation
Every update is associated with a channel name. It is similar to every commit that we make with git, which is associated with a git branch. So, by using the channel development in our build profile and then publishing an, we're asking EAS to ...
🌐
Lightrun
lightrun.com › answers › expo-eas-cli-release-channel-set-in-easjson-is-not-reflected-in-updatesreleasechannel-ios-only
Release channel set in eas.json is not reflected in Updates.releaseChannel (iOS only)
Configure expo updates step correctly returns Setting the release channel in 'Expo.plist' to 'pre-prod'. Updates.releaseChannel returns default. On Android everything works correctly. EAS CLI 0.38.3 environment info: System: OS: macOS 11.6 Shell: 5.1.8 - /usr/local/bin/bash Binaries: Node: 12.18.2 - ~/.nvm/versions/node/v12.18.2/bin/node Yarn: 1.22.17 - ~/.nvm/versions/node/v12.18.2/bin/yarn npm: 8.1.4 - ~/.nvm/versions/node/v12.18.2/bin/npm Utilities: Git: 2.30.1 - /usr/bin/git npmPackages: expo: ^43.0.0 => 43.0.3 expo-dev-client: ^0.6.3 => 0.6.3 react: 17.0.1 => 17.0.1 react-dom: 17.0.1 => 17.0.1 react-native: 0.64.3 => 0.64.3 react-native-web: 0.17.1 => 0.17.1 npmGlobalPackages: eas-cli: 0.38.3 expo-cli: 4.13.0
🌐
Expo Documentation
docs.expo.dev › eas-update › override
Override update configuration at runtime - Expo Documentation
The typical way to use EAS Update is to have a single update URL and a set of request headers (such as update channel name) embedded in a build of your app. To control which update is loaded you make changes on the server through the eas update ...
🌐
Expo Documentation
docs.expo.dev › eas-update › standalone-service
Using EAS Update without other EAS services - Expo Documentation
# Create a channel named `production` (for example, which points to the production EAS Update branch by default)# Your channel names may vary depending on release process