Documentation
On this page

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#

TopicEAS UpdateRollbird
Price modelPlan fee plus each update user above the allowance, plus bandwidth over a quotaFlat plan priced on apps, storage and seats; no per-user charge
Free tierUp to 1,000 update users1 app and 3 production releases a month, any number of users
Client libraryexpo-updates@rollbird/react-native, which wraps Hot Updater's client
Bare React NativeSupported after installing Expo modulesrollbird init writes the native configuration
ExpoFirst-partyConfig plugin; Expo 50 or newer, tested on SDK 53 and 57
Compatibility checkruntimeVersion: appVersion, fingerprint or a custom stringfingerprint (default) or appVersion strategy
Staged rolloutPer-update percentage and branch-based rolloutsPer-release percentage, adjustable in the dashboard
Rollbackeas update:rollback to an earlier or the embedded updaterollbird 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.

StepEAS UpdateRollbird
PrerequisiteInstall Expo modules: npx install-expo-modules@latestNone beyond Node.js 20
Installnpx expo install expo-updates, then npx pod-installnpm install --save-dev @rollbird/cli
Link the projecteas update:configure writes updates.url and projectId to app.jsonnpx rollbird login, then npx rollbird init --channel preview
Android native configEdit build.gradle, add the updates configuration to AndroidManifest.xml, and add the runtime version to strings.xmlWritten by rollbird init
iOS native configAdd Podfile.properties.json, edit the Podfile, and add Expo.plist with the EXUpdates keys in XcodeWritten by rollbird init
ChannelA request header in AndroidManifest.xml and Expo.plist, or the build profile in eas.json with EAS BuildEmbedded by rollbird init --channel <name>
App codeNo wrapper; expo-updates checks on launchWrap the root component with Rollbird.wrap
RebuildRequiredRequired

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:

tsx
import { Rollbird } from "@rollbird/react-native";

export default Rollbird.wrap({ projectKey: "pk_from_rollbird_json" })(App);

How the concepts map#

EAS UpdateRollbirdNotes
ChannelChannelBoth are embedded in the native build. A binary only asks for its own channel.
BranchNoneEAS publishes to a branch and points a channel at it. Rollbird publishes straight to a channel.
runtimeVersion with the fingerprint policystrategy: "fingerprint", the defaultRe-run rollbird init and rebuild after a native change.
runtimeVersion with the appVersion policystrategy: "appVersion" with --target-app-versionSet the strategy in Rollbird.wrap.
Custom runtimeVersion stringNo equivalentUse the fingerprint or app version.
eas update --rollout-percentage=10rollbird release --rollout 10Starts a staged rollout.
eas update:edit to change the percentageThe staged-rollout control on the release page in the dashboard
eas update:revert-update-rolloutrollbird rollbackRollbird disables the release and serves the previous one.
eas update:rollback to an earlier updaterollbird rollback --channel <name>Rollback is free and doesn't count against any limit.
eas update:rollback to the embedded updaterollbird rollback when no earlier release remainsA binary never moves below the bundle it shipped with.
eas channel:rollout (branch rollout)No equivalent
EXPO_TOKEN in CIROLLBIRD_TOKEN, scoped and optionally bound to one projectSee 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.

  1. Remove the expo-updates package and run npx pod-install for iOS.
  2. Remove the updates block and runtimeVersion from your app config. In a bare app, also remove the expo-updates entries from AndroidManifest.xml, strings.xml and Expo.plist. Other Expo modules your app uses can stay.
  3. Run npx rollbird init --channel preview and review the diff it makes.
  4. Wrap the root component with Rollbird.wrap, rebuild, and verify a preview release on a device, following Getting started.
  5. Run npx rollbird init --channel production, build the store binary, and ship it.
  6. Replace the eas update step in CI with rollbird release --production --yes.

Remove the package with your package manager, for example:

bash
npm uninstall expo-updates

Binaries 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#

Where Rollbird fits#

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.