# 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](https://expo.dev/pricing), 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](https://rollbird.dev/docs/eas-update-pricing/)
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](https://docs.expo.dev/bare/installing-updates/)
guide; Rollbird steps follow [Getting started](https://rollbird.dev/docs/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:

```tsx
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](https://rollbird.dev/docs/ci/). |

EAS commands are from Expo's [rollouts](https://docs.expo.dev/eas-update/rollouts/)
and [rollbacks](https://docs.expo.dev/eas-update/rollbacks/) guides. Rollbird
commands and flags are in the [CLI reference](https://rollbird.dev/docs/cli/).

## 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](https://rollbird.dev/docs/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

- **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.json` build 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-updates` and the service behind it.

## Where Rollbird fits

- **Bare React Native without Expo modules.** `rollbird init` writes 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 init` provisions a signing key and `rollbird release` signs every bundle.

To try it, follow [Getting started](https://rollbird.dev/docs/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](https://rollbird.dev/docs/codepush-alternatives/).
