All posts
NextPush Team9 min read

What OTA updates really cost: Expo Update vs NextPush, with worked examples

Expo Update bills monthly active users; NextPush bills update downloads. Three worked scenarios (10K, 50K and 200K users) with the arithmetic shown, the case where NextPush's listed plans run out, what is and is not included, and when Expo Update is the better buy.

Two hosted services for over-the-air React Native updates can quote wildly different monthly prices for the same app, and both can be telling the truth. The reason is almost never the per-unit rate. It is the unit. Expo Update bills per monthly active user; NextPush bills per update download. Which one is cheaper for you depends on one ratio: how many updates the average user downloads in a month. This post lays out both price lists as published in November 2026, runs three scenarios with the arithmetic shown, and ends with the cases where Expo Update is the right choice regardless of the number.

Two units

Monthly active users (Expo Update). Expo's billing FAQ defines an MAU as a unique user of your app who downloads at least one update through Expo Update within a billing month. A user who downloads one update and a user who downloads twelve both count once. Users who never download an update that month do not count at all. Bandwidth is metered separately in GiB.

Update downloads (NextPush). NextPush plans are quoted as "updates per month". An update is counted when a device downloads a release. A device that checks for updates and finds nothing new is not counted, which is why the free plan's 1,000 updates goes further than it sounds for an app that ships once a month. Each release a device downloads counts once, so a user who installs four releases in a month is four updates.

Put differently: Expo's bill grows with your audience and is flat in release frequency; NextPush's bill grows with audience times release frequency. Divide one by the other and you get the break-even, which we do at the end.

The price lists

Everything below is from the public pricing pages on the date of writing. Check them before you decide; both vendors have changed plans in the past.

Expo Update (Expo dropped the "EAS" prefix in 2026; the CLI is still eas):

Plan Price Included MAU Included bandwidth Overage
Free $0 1,000 100 GiB None; the service is limited instead
Starter $19 per month 3,000 100 GiB $0.005 per MAU from 3,001 to 200,000; $0.10 per GiB
Production $199 per month 50,000 1 TiB $0.005 per MAU from 50,001 to 200,000; $0.10 per GiB
Enterprise Custom Negotiated 40 TiB $0.10 per GiB

NextPush:

Plan Price Included updates per month Apps Storage and bandwidth Overage
Free $0 1,000 1 100 MB storage; bandwidth not listed None
Plus $24 per month ($20 billed yearly) 100,000 25 2 GB storage, 1 TB bandwidth None listed; upgrade to Enterprise
Enterprise $60 per month ($50 billed yearly) 1,000,000 Unlimited Unlimited Additional 1,000,000 updates for $15

Three scenarios

Assumptions for all three: every active user downloads every update you ship that month (the worst case for download billing and the usual case for an app people open weekly), and a JavaScript bundle plus assets is 3 MB over the wire. Change the bundle size and only the bandwidth lines move.

1. 10,000 users, 2 updates a month

Expo Update: 10,000 MAU. Starter covers 3,000, so 7,000 are overage.

$19 + 7,000 × $0.005 = $19 + $35 = $54 per month

Production would be $199 with 50,000 MAU included, so Starter is the right plan here. Bandwidth: 10,000 × 2 × 3 MB = 60 GB, inside the 100 GiB allowance.

NextPush: 10,000 × 2 = 20,000 downloads. The free plan stops at 1,000, so this is Plus.

$24 per month (20,000 of 100,000 included downloads used)

Result: $54 versus $24.

2. 50,000 users, 2 updates a month

Expo Update: 50,000 MAU. On Starter that would be $19 + 47,000 × $0.005 = $254, so Production, which includes exactly 50,000, is cheaper.

$199 per month

Bandwidth: 50,000 × 2 × 3 MB = 300 GB, inside Production's 1 TiB.

NextPush: 50,000 × 2 = 100,000 downloads, which is precisely the Plus allowance. If your numbers are that exact you pay $24; if you want headroom for a third release or a growth month, Enterprise at $60 includes 1,000,000.

$24 to $60 per month

Result: $199 versus $24 to $60.

3. 200,000 users, 4 updates a month

Expo Update: 200,000 MAU on Production, with 150,000 as overage.

$199 + 150,000 × $0.005 = $199 + $750 = $949 per month, before bandwidth

Bandwidth: 200,000 × 4 × 3 MB = 2.4 TB, roughly 2,235 GiB. Production includes 1,024 GiB, leaving about 1,211 GiB at $0.10, so around $121 more. Expo's client can fetch bsdiff patches for the launch asset since SDK 56, which will shrink that line for users who already have the previous release; the MAU line does not change.

NextPush: 200,000 × 4 = 800,000 downloads, inside Enterprise's 1,000,000. Bandwidth is unlimited on Enterprise.

$60 per month

Result: about $949 to $1,070 versus $60.

The honest caveat: shipping daily

Download billing has a failure mode too, and it is the one you should check before choosing NextPush. Take the 200,000-user app and ship every day.

200,000 × 30 = 6,000,000 downloads
Enterprise: 1,000,000 included
Additional: 5 × 1,000,000 at $15 = $75
Total: $60 + $75 = $135 per month

Expo's MAU count is unchanged at 200,000, so its bill stays at $949 plus bandwidth, and at 30 releases of 3 MB the bandwidth line is large: 6,000,000 × 3 MB is about 16,760 GiB, minus the 1,024 included, at $0.10 is roughly $1,570, less whatever bsdiff saves. The point is not that NextPush wins this one too; it is that a daily shipper exceeds every listed NextPush plan and lands on the additional-updates rate. Model your own release cadence, not ours. If your downloads are in the tens of millions, talk to us before you sign up rather than after the first invoice.

What is not in the price

On NextPush. Plus includes 2 GB of storage and 1 TB of bandwidth; Enterprise lists both as unlimited. The free plan lists 100 MB of storage and does not list a bandwidth figure, so if you plan to run a sizeable app on it, ask us. Releases are capped at 10 per month on the free plan and unlimited on paid plans. NextPush serves diff packages between releases where the CodePush protocol allows, so devices on the previous release download less than the full bundle. There is no separate build product: you bundle locally or in your own CI, and nextpush release-react uploads the result.

On Expo Update. Bandwidth overage is $0.10 per GiB on every paid plan. Code signing of updates hosted on EAS requires the Production or Enterprise plan. EAS Build and EAS Submit are separate products with their own quotas and are not part of the Update price. The free plan has no overage charges because the service is limited instead, so a free-plan app that grows past 1,000 MAU needs a plan change rather than a bigger bill.

On both. Neither price includes your time. Expo Update is tied into EAS Build and eas.json channels, so if you already live there, setup is a few lines. NextPush is the CodePush protocol, so if you already have react-native-code-push or @code-push-next/react-native-code-push in the app, setup is two configuration strings; if you do not, it is a native module to install.

The break-even

With both price lists in front of you the rule of thumb is simple. Expo's marginal cost above the included MAU is $0.005 per active user per month. NextPush's marginal cost at the Enterprise tier is $15 per 1,000,000 downloads, or $0.000015 per download. Divide and you get about 333: on the margin, a user has to download more than 333 updates in a month before NextPush's unit costs more than Expo's. Below the margins the fixed plan prices dominate, and the scenarios above show how that plays out at realistic sizes. The one place Expo's list price is lower is the very small end: under 1,000 active users, Expo's free plan does not care how often you ship, while NextPush's free plan runs out after 1,000 downloads and the next step is $24.

When Expo Update is the better choice

Price is one input. There are teams for whom Expo Update is the right answer at any of the numbers above.

  • You build with EAS Build and deploy with EAS Workflows. Channels, branches, runtime versions and eas update are integrated with the build pipeline. Replacing one piece of that with a third party costs more in glue than it saves in dollars.
  • Your developers live in Expo Go. Custom update servers require a development build; the Expo-hosted path is the one that works with the stock client.
  • You need enterprise terms. SSO, a negotiated contract, a named account team and a company of Expo's size behind the SLA. NextPush is run by one engineer. That is a feature for some buyers and a disqualifier for others.
  • You ship rarely to a tiny audience. Under 1,000 MAU the Expo free plan is hard to beat.
  • You want one vendor for builds, updates and submission. EAS is the only option in the React Native ecosystem that offers all three.

If none of those apply, and your app is on the CodePush protocol or can be, the download-based bill is usually the smaller one, often by an order of magnitude at 50,000 users and up. Run your own numbers with the formulas above; they are the same ones we used.

Sources