Rollbird vs EAS Update#
EAS Update and Rollbird both deliver over-the-air (OTA) updates to React Native apps: they ship a new JavaScript bundle to installed binaries without a store review. This page compares them for teams looking for an EAS Update alternative, especially for bare React Native apps that don't use Expo otherwise. It covers setup, the concepts each uses, what to remove when moving, and where EAS Update is the better choice.
Rollbird publishes this page. EAS Update details come from Expo's documentation and pricing page, checked October 2026.
At a glance#
| Topic | EAS Update | Rollbird |
|---|---|---|
| Price model | Plan fee plus each update user above the allowance, plus bandwidth over a quota | Flat plan priced on apps, storage and seats; no per-user charge |
| Free tier | Up to 1,000 update users | 1 app and 3 production releases a month, any number of users |
| Client library | expo-updates | @rollbird/react-native, which wraps Hot Updater's client |
| Bare React Native | Supported after installing Expo modules | rollbird init writes the native configuration |
| Expo | First-party | Config plugin; Expo 50 or newer, tested on SDK 53 and 57 |
| Compatibility check | runtimeVersion: appVersion, fingerprint or a custom string | fingerprint (default) or appVersion strategy |
| Staged rollout | Per-update percentage and branch-based rollouts | Per-release percentage, adjustable in the dashboard |
| Rollback | eas update:rollback to an earlier or the embedded update | rollbird rollback, always free and never blocked by plan limits |
The EAS Update pricing guide works through the EAS bill at 10,000, 100,000 and 1,000,000 users: $54, $449 and $3,774 a month before bandwidth. Rollbird's Indie plan is $7 a month at each of those sizes.
Setup in a bare React Native app#
Both need native configuration and a rebuild; the difference is who edits the native files and whether Expo modules come along. EAS steps follow Expo's installing expo-updates in an existing app guide; Rollbird steps follow Getting started.
| Step | EAS Update | Rollbird |
|---|---|---|
| Prerequisite | Install Expo modules: npx install-expo-modules@latest | None beyond Node.js 20 |
| Install | npx expo install expo-updates, then npx pod-install | npm install --save-dev @rollbird/cli |
| Link the project | eas update:configure writes updates.url and projectId to app.json | npx rollbird login, then npx rollbird init --channel preview |
| Android native config | Edit build.gradle, add the updates configuration to AndroidManifest.xml, and add the runtime version to strings.xml | Written by rollbird init |
| iOS native config | Add Podfile.properties.json, edit the Podfile, and add Expo.plist with the EXUpdates keys in Xcode | Written by rollbird init |
| Channel | A request header in AndroidManifest.xml and Expo.plist, or the build profile in eas.json with EAS Build | Embedded by rollbird init --channel <name> |
| App code | No wrapper; expo-updates checks on launch | Wrap the root component with Rollbird.wrap |
| Rebuild | Required | Required |
rollbird init edits the same kinds of native files that the EAS guide edits by hand. It does them in one step and you review the diff before committing. It also provisions a signing key and embeds the native fingerprint. The one code change Rollbird needs that EAS doesn't is the wrapper around your root component:
import { Rollbird } from "@rollbird/react-native";
export default Rollbird.wrap({ projectKey: "pk_from_rollbird_json" })(App);How the concepts map#
| EAS Update | Rollbird | Notes |
|---|---|---|
| Channel | Channel | Both are embedded in the native build. A binary only asks for its own channel. |
| Branch | None | EAS publishes to a branch and points a channel at it. Rollbird publishes straight to a channel. |
runtimeVersion with the fingerprint policy | strategy: "fingerprint", the default | Re-run rollbird init and rebuild after a native change. |
runtimeVersion with the appVersion policy | strategy: "appVersion" with --target-app-version | Set the strategy in Rollbird.wrap. |
Custom runtimeVersion string | No equivalent | Use the fingerprint or app version. |
eas update --rollout-percentage=10 | rollbird release --rollout 10 | Starts a staged rollout. |
eas update:edit to change the percentage | The staged-rollout control on the release page in the dashboard | |
eas update:revert-update-rollout | rollbird rollback | Rollbird disables the release and serves the previous one. |
eas update:rollback to an earlier update | rollbird rollback --channel <name> | Rollback is free and doesn't count against any limit. |
eas update:rollback to the embedded update | rollbird rollback when no earlier release remains | A binary never moves below the bundle it shipped with. |
eas channel:rollout (branch rollout) | No equivalent | |
EXPO_TOKEN in CI | ROLLBIRD_TOKEN, scoped and optionally bound to one project | See CI/CD. |
EAS commands are from Expo's rollouts and rollbacks guides. Rollbird commands and flags are in the CLI reference.
Moving from EAS Update to Rollbird#
Never run expo-updates and Rollbird in the same app. Both control which bundle the app loads, and rollbird init refuses to set up a project that still has expo-updates installed.
- Remove the
expo-updatespackage and runnpx pod-installfor iOS. - Remove the
updatesblock andruntimeVersionfrom your app config. In a bare app, also remove theexpo-updatesentries fromAndroidManifest.xml,strings.xmlandExpo.plist. Other Expo modules your app uses can stay. - Run
npx rollbird init --channel previewand review the diff it makes. - Wrap the root component with
Rollbird.wrap, rebuild, and verify a preview release on a device, following Getting started. - Run
npx rollbird init --channel production, build the store binary, and ship it. - Replace the
eas updatestep in CI withrollbird release --production --yes.
Remove the package with your package manager, for example:
npm uninstall expo-updatesBinaries already in users' hands still ask EAS for updates until they install the new store build. Keep your EAS channel serving until most users have moved, or accept that those users stay on their current bundle.
Where EAS Update is the better choice#
- You build with Expo and EAS. EAS Update shares an account, dashboard and bill with EAS Build and Submit, and its channels come from your
eas.jsonbuild profiles. - Your audience is under 1,000 update users. EAS Update is free there; Starter is $19 to 3,000 users.
- You need more rollout control. EAS offers branch-based rollouts, custom runtime versions, and percentage changes from the CLI. Rollbird's CLI has five commands, and percentage changes happen in the dashboard.
- You want the library's own maintainers. Expo builds both
expo-updatesand the service behind it.
Where Rollbird fits#
- Bare React Native without Expo modules.
rollbird initwrites the iOS and Android configuration directly. - A growing audience. The price doesn't depend on users or bandwidth, so going from 10,000 to 1,000,000 users doesn't change the plan you need.
- Recovery you never have to budget for. Rollback is always free, never consumes release quota, and still works when a plan or storage limit blocks new releases. If a new bundle crashes before it reports ready, the device falls back to the previous bundle and the release page counts the failure.
- Signed releases by default.
rollbird initprovisions a signing key androllbird releasesigns every bundle.
To try it, follow Getting started from installation to a verified preview update and rollback. If you are comparing more than these two services, see CodePush alternatives in 2026.