# Rollbird vs Revopush

Revopush 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. Revopush is a hosted service built on the CodePush client and CLI.
Rollbird, a hosted React Native OTA update service, uses its own SDK and a
five-command CLI. This page is for teams looking for a Revopush alternative:
it compares cost at three app sizes, lists every file that changes when you
leave the CodePush SDK, maps the commands, and says where Revopush is the
better choice.

Rollbird publishes this page. Revopush details come from its
[pricing page](https://revopush.org/pricing) and
[documentation](https://docs.revopush.org/sdk/getting-started), checked
October 2026.

## At a glance

| Topic | Revopush | Rollbird |
| --- | --- | --- |
| Price model | Plans by monthly active users (MAU) and egress, plus $1 per 1,000 extra users and $0.03 per GB of extra egress | Flat plans priced on apps, storage and seats; no per-user or bandwidth charge |
| Free tier | Up to 1,000 MAU and 10 GB of egress, unlimited releases | 1 app and 3 production releases a month, any number of users |
| Client library | `@revopush/react-native-code-push`, an MIT-licensed CodePush client | `@rollbird/react-native`, which wraps Hot Updater's client |
| CLI | `revopush`, from `@revopush/code-push-cli`, with CodePush's commands | `rollbird`: `login`, `init`, `release`, `rollback`, `status` |
| React Native | 0.76 or newer on the Revopush SDK; older apps stay on Microsoft's client | 0.76 is the verified baseline |
| Expo | Config plugin for Expo SDK 52 or newer | Config plugin for Expo 50 or newer |
| Native setup | Edit `build.gradle`, `MainApplication`, `strings.xml`, `AppDelegate` and `Info.plist` by hand | `rollbird init` writes the native configuration |
| Compatibility check | Binary version range (`targetBinaryVersion`) | Native fingerprint (default) or app version |
| Staged rollout | `--rollout` percentage | `rollbird release --rollout`, adjustable in the dashboard |
| Rollback | `revopush rollback` publishes the previous release again | `rollbird rollback`, always free and never blocked by plan limits |
| Differential updates | Yes; Revopush says they cut egress by up to 90% | No |

## What each costs at 10,000, 100,000 and 1,000,000 users

Revopush prices come from its [pricing page](https://revopush.org/pricing),
checked October 2026. Every plan, the free Starter plan included, lists
"$1 per 1,000 additional users", so the cheapest total is sometimes a smaller
plan plus overage. Egress overage ($0.03 per GB) is left out because it
depends on bundle size and release frequency. Rollbird prices come from
[the pricing section](https://rollbird.dev/#pricing).

| Monthly active users | Revopush, cheapest total | How it adds up | Rollbird |
| --- | --- | --- | --- |
| 10,000 | $9 | Starter is free to 1,000 users, plus 9,000 extra at $1 per 1,000. Startup, the smallest plan that includes 10,000, is $25. | $7 on Indie for up to 3 apps |
| 100,000 | $75 | Startup is $25 for 50,000, plus 50,000 extra at $1 per 1,000. Growing, at $100 for 300,000, costs more. | $7 on Indie for up to 3 apps |
| 1,000,000 | $500 | Professional includes 1,000,000. Business at $250 for 500,000 plus 500,000 extra users would be $750. | $7 on Indie for up to 3 apps |

Rollbird's price doesn't move with users. It moves with apps, storage and
seats: Indie is $7 a month for 3 apps, 2 GiB of storage and one member; Team
is $15 for 10 apps, 10 GiB and 3 members; Studio is $29 for unlimited apps,
50 GiB and 10 members. Annual billing is ten times the monthly price.

Under 1,000 users, both cost nothing. Revopush's free plan then allows
unlimited releases, while Rollbird Free allows 3 production releases a month.

## Leaving the CodePush SDK, file by file

Revopush keeps CodePush's client, so moving to Rollbird means undoing the
CodePush wiring and letting `rollbird init` add its own. The Revopush column
lists what its [Android](https://docs.revopush.org/sdk/android),
[iOS](https://docs.revopush.org/sdk/ios) and
[Expo](https://docs.revopush.org/intro/expo) setup guides add. The Rollbird
column lists what replaces it, from the
[CLI reference](https://rollbird.dev/docs/cli/) and the
[React Native SDK guide](https://rollbird.dev/docs/react-native/).

| File | Remove (added for Revopush) | Rollbird |
| --- | --- | --- |
| `package.json` | `@revopush/react-native-code-push`, and `@revopush/expo-code-push-plugin` in Expo apps | `@rollbird/react-native` and its dependencies, installed by `rollbird init`; `@rollbird/cli` as a dev dependency |
| `android/app/build.gradle` | The `apply from: ".../@revopush/react-native-code-push/android/codepush.gradle"` line | Nothing to add |
| `MainApplication.kt` | `import com.microsoft.codepush.react.CodePush` and the `getJSBundleFile()` override returning `CodePush.getJSBundleFile()` | `rollbird init` wires the bundle entry point to the update client |
| `strings.xml` | `CodePushDeploymentKey`, and `CodePushPublicKey` if you signed bundles | Channel and native fingerprint, written by `rollbird init`; the public signing key goes in `AndroidManifest.xml` |
| `AppDelegate` | `import CodePush` (or `#import <CodePush/CodePush.h>`) and `CodePush.bundleURL()` in the release bundle URL | `rollbird init` wires the release bundle URL to the update client |
| `Info.plist` | `CodePushDeploymentKey`, `CodePushPublicKey`, and the App Transport Security exception for `api.revopush.org` if you added one | Channel, public signing key and native fingerprint, written by `rollbird init` |
| App root component | `import codePush from "@revopush/react-native-code-push"` and `codePush(App)` | `Rollbird.wrap({ projectKey })(App)` |
| `app.json` (Expo) | The `@revopush/expo-code-push-plugin` entry with `CodePushDeploymentKey` and `CodePushServerUrl` | The `@rollbird/react-native` plugin entry, registered by `rollbird init`; values live in `rollbird.json` |
| `rollbird.json` (new) | | The linked project and its public project key; in Expo apps also the channel, public key and fingerprints |

In the app code, the change is one import and one wrapper:

```diff
-import codePush from "@revopush/react-native-code-push";
+import { Rollbird } from "@rollbird/react-native";

-export default codePush(App);
+export default Rollbird.wrap({ projectKey: "pk_from_rollbird_json" })(App);
```

Remove the CodePush lines before running `rollbird init`, so only one update
client is wired to the entry points. If `rollbird init` can't wire them, it
says so and prints the line to add by hand. The
[migration guide](https://rollbird.dev/docs/migrating-from-codepush/#javascript-api-mapping)
maps the rest of the CodePush JavaScript API, such as `sync`,
`checkForUpdate` and `restartApp`.

## How the commands map

| Revopush | Rollbird | Notes |
| --- | --- | --- |
| `revopush login` | `rollbird login` | Both open a browser. For CI, Rollbird uses a scoped `ROLLBIRD_TOKEN`; see [CI/CD](https://rollbird.dev/docs/ci/). |
| Create the app in the Revopush dashboard; it comes with two deployments | `rollbird init --channel preview`, then `rollbird init --channel production` for the store build | One channel per deployment you used. |
| `revopush deployment ls <appName> -k` to copy a deployment key into native files | None | `rollbird init` embeds the channel; there is no key to copy. |
| `revopush release-react <appName> <platform> -d <deployment>` | `rollbird release --channel <name>` | Rollbird builds both detected platforms unless you pass `--platform`. |
| `--rollout <percent>` | `rollbird release --rollout <percent>` | Change it later in the dashboard. |
| `--mandatory` | `rollbird release --force` | The app reloads after download unless `reloadOnForceUpdate` is `false`. |
| `--targetBinaryVersion <range>` | `rollbird release --target-app-version <version>` with the `appVersion` strategy | The default fingerprint strategy needs no target. |
| `revopush rollback <appName> <deploymentName>` | `rollbird rollback --channel <name>` | Rollbird disables the release and serves the previous one; rollback is free and counts against no limit. |
| `revopush rollback ... --targetRelease <label>` | `rollbird rollback <number> --channel <name>` | Disables that release. |
| `revopush promote <appName> Staging Production` | No direct equivalent | Run `rollbird release --production` from the same commit. |

Revopush commands come from its [getting started](https://docs.revopush.org/intro/getting-started),
[rollback](https://docs.revopush.org/cli/rolling-back-updates) and
[promote](https://docs.revopush.org/cli/promoting-updates) guides; the
`--rollout`, `--mandatory` and `--targetBinaryVersion` flags are documented in
the promote guide.

## Moving from Revopush to Rollbird

Never run the CodePush client and Rollbird in the same app. Both decide which
bundle the app loads at launch.

1. Uninstall `@revopush/react-native-code-push` (and the Expo plugin, if you use it), then run `pod install` for iOS.
2. Remove the native lines in the table above and restore the template's bundle entry points.
3. Install the CLI, run `npx rollbird login`, then `npx rollbird init --channel preview`, and review the diff it makes.
4. Replace `codePush(App)` with `Rollbird.wrap`, rebuild, and verify a preview release and a rollback 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 `revopush release-react` in CI with `rollbird release --production --yes`.

Remove the package with your package manager, for example:

```bash
npm uninstall @revopush/react-native-code-push
```

Binaries already in users' hands keep asking Revopush for updates until they
install the new store build. Keep your Revopush deployment serving until most
users have moved, or accept that those users stay on their current bundle.

## Where Revopush is the better choice

- **You want to keep the CodePush SDK and CLI.** Coming from App Center CodePush, Revopush is the smaller change: the same `codePush()` wrapper, native keys and `release-react` commands. Rollbird replaces all three.
- **Bundle size or egress is your cost driver.** Revopush ships differential updates. Rollbird downloads the full bundle.
- **You release often on a free plan.** Revopush's free plan has unlimited releases up to 1,000 users. Rollbird Free allows 3 production releases a month.
- **You rely on CodePush client options.** Revopush keeps checks on app resume, manual `sync`, and promoting a release between deployments. Rollbird checks on launch, and has no promote command.
- **You need your own cloud.** Revopush's Enterprise plan offers SSO and deployment on AWS, GCP or your own provider.

## Where Rollbird fits

- **A growing audience.** The price doesn't depend on users or egress, so going from 10,000 to 1,000,000 users doesn't change the plan you need.
- **No keys to copy into native files.** `rollbird init` writes the channel, signing key and fingerprint into the iOS and Android projects, or into `rollbird.json` for Expo.
- **Updates matched to the native build.** The default fingerprint strategy only offers a release to binaries with matching native code, instead of a version range you maintain.
- **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.

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/).
