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 and documentation, 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, 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.
| 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, iOS and Expo setup guides add. The Rollbird column lists what replaces it, from the CLI reference and the React Native SDK guide.
| 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:
-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 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. |
| 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, rollback and promote 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.
- Uninstall
@revopush/react-native-code-push(and the Expo plugin, if you use it), then runpod installfor iOS. - Remove the native lines in the table above and restore the template's bundle entry points.
- Install the CLI, run
npx rollbird login, thennpx rollbird init --channel preview, and review the diff it makes. - Replace
codePush(App)withRollbird.wrap, rebuild, and verify a preview release and a rollback on a device, following Getting started. - Run
npx rollbird init --channel production, build the store binary, and ship it. - Replace
revopush release-reactin CI withrollbird release --production --yes.
Remove the package with your package manager, for example:
npm uninstall @revopush/react-native-code-pushBinaries 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 andrelease-reactcommands. 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 initwrites the channel, signing key and fingerprint into the iOS and Android projects, or intorollbird.jsonfor 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 from installation to a verified preview update and rollback. If you are comparing more than these two services, see CodePush alternatives in 2026.