Upgrade Playbook · Original Research

The React Native upgrade timeline: what 6 versions behind actually means

Published May 31, 2026 · 11 minute read
TL;DR

One version behind costs roughly a week of focused engineering. Three versions behind costs three weeks if you're lucky. Six versions behind costs 4 to 12 weeks of elapsed work and is the threshold where in-house attempts most often stall.

The cost curve isn't linear. It's flat-then-jagged: each version step crosses a different set of breaking changes, build-tool jumps, and dependency cliffs.

The most predictive signal of how long your upgrade will take isn't the React Native version distance. It's the maintenance state of your dependency graph and the number of custom native modules.

"We're four versions behind on React Native." That sentence does almost nothing to predict how long the upgrade will take. Four versions could be a one-week project or a three-month one, depending on what else is in the codebase.

This post is the patterns we've seen across rescue engagements. The work is concentrated, the stall points are predictable, and the cost curve is jagged in places worth knowing about in advance.

On this page
  1. The curve isn't linear
  2. Cost by version distance
  3. The real drivers of cost
  4. Common stall points
  5. The half-life of an in-house upgrade attempt
  6. Predicting your timeline
  7. One big upgrade vs many small ones
  8. FAQ

The curve isn't linear

It's tempting to think "if one version takes a week, six should take six weeks." That's not the shape.

The first version step is mostly straightforward: the upgrade helper diff is small, dependencies usually slot in, the New Architecture flag stays put. Each additional version step adds work that scales worse than linearly because:

The result: the cost curve is flat for the first hop, jumps at certain version boundaries, then flattens again.

Cost by version distance

Rough engineering-week estimates from actual engagements. Variance is large; treat these as central tendencies, not promises.

Versions behindTypical engineering weeksNotes
1 (e.g. 0.75 → 0.76)0.5–2Single-version. Upgrade helper is well-behaved.
2 (e.g. 0.74 → 0.76)1–3Often crosses the New Architecture default-on threshold.
3 (e.g. 0.73 → 0.76)2–5Dependencies start needing genuine work.
4 (e.g. 0.72 → 0.76)3–7Cumulative breaking changes start to compound.
5 (e.g. 0.71 → 0.76)4–9Multiple library replacements likely. Build tool work required.
6+ (e.g. 0.70 → 0.76)4–12The in-house stall zone. Productized engagement compresses time.
10+ (e.g. 0.66 → 0.76)8–16Effectively a partial rewrite of dependencies. Plan accordingly.

The "engineering weeks" is focused engineering — one or two engineers working on the upgrade as their primary task. In-house teams trying to do the upgrade in spare time alongside features typically multiply elapsed time by 2 to 4.

The real drivers of cost

Three things predict the timeline far better than version distance alone.

Driver 01

Dependency graph health

How many libraries in your package.json are still maintained? An app with 25 dependencies and 24 of them current upgrades fast. An app with 25 dependencies and 8 of them abandoned takes much longer — each abandoned library is a small replacement project.

The free scanner against your lockfile will tell you which way you fall before you commit to an upgrade.

Driver 02

Custom native modules

Each custom native module written against the old NativeModule API needs migration to TurboModules for the New Architecture. A module that was 50 lines is a few hours. A module that's 2,000 lines with custom threading or event dispatch is days to weeks.

The team count matters too — most teams have 2–4 custom native modules they barely remember writing.

Driver 03

Patch-package depth

Patches are diffs against specific versions of files. The further you jump versions, the more patches stop applying. Each broken patch becomes a re-author, a delete, or a hunt for the upstream fix that may or may not exist.

An app with 3 patches is a quick triage. An app with 20 patches is a week of investigation work before the actual framework upgrade even starts.

Common stall points

Observed patterns where in-house upgrade attempts get stuck for weeks or months.

The half-life of an in-house upgrade attempt

An in-house React Native upgrade that doesn't ship within its initial estimate has a high abandonment rate. The shape we've seen:

Anecdotally, roughly half of stalled in-house upgrades get abandoned and restarted later, rather than finished. The restart pays the cost of the first attempt plus the cost of additional drift.

The pattern

Successful in-house upgrades have one thing in common: someone is given the upgrade as their only task for the duration. Upgrades attempted as a side-project alongside feature work stall at a rate so consistent it's essentially predictive.

Predicting your timeline

A rough formula based on the drivers above:

  1. Start with the version-distance baseline from the table above.
  2. Add 1 week per abandoned dependency that needs replacement.
  3. Add 1–4 weeks per custom native module needing TurboModule migration (depending on size).
  4. Add 1 week per 10 patch-package patches you're carrying.
  5. Multiply by 1 for focused engineering, 2 for split attention, 3+ for interleaved feature work.

A typical example: a team 5 versions behind, with 6 abandoned dependencies, 3 custom native modules (one large), and 12 patches, working with split attention.

That's 8–9 months for an upgrade the team probably estimated at "a few sprints." The math is uncomfortable but it's better to know it upfront.

One big upgrade vs many small ones

For teams already several versions behind, the choice is whether to step through versions one at a time or jump in one go.

Stepping (one version at a time):

Jumping (multi-version at once):

For 1–3 versions behind, stepping is usually right. For 4+ versions, jumping is faster if you have the team focus to sustain it. For 6+ versions, productized engagements that own the work end-to-end are usually the cost-effective answer.

Want a real estimate for your specific case?

Run the free scanner against your lockfile. It'll show your dependency graph health, the libraries that have moved on, and the known CVEs in your current pins — which together are the actual drivers of the timeline, not the React Native version distance alone.

Frequently Asked Questions

How long does a React Native upgrade take?

For a single minor-version upgrade on a clean codebase, a few days. For a single minor with a moderate dependency graph, about a week. The non-linear part is when you're several minors behind — the work doesn't scale linearly with version distance, because each version step crosses into different breaking changes, build-tool requirements, and dependency boundaries. Six versions behind usually takes 4 to 12 weeks of focused work, not six times the one-version cost.

What makes a React Native upgrade take longer?

Three things, in roughly this order. First, abandoned dependencies that need replacement — every dead library is a small project. Second, custom native modules that have to migrate to TurboModules under the New Architecture. Third, accumulated patch-package patches that no longer apply cleanly and have to be either reapplied, reauthored, or removed entirely. The framework itself is usually the smallest component of the total work.

Should I upgrade one version at a time?

For staying current, yes — single-minor upgrades are dramatically less risky than multi-minor jumps. For catching up when you're already 4+ versions behind, the choice is more nuanced. Stepping by single versions means doing the upgrade work multiple times, each time on a codebase still being changed by other developers. Jumping in one big upgrade is more disruptive but takes less calendar time. The right answer depends on your team's appetite for sustained focus vs incremental commits.

What are the common stall points in a React Native upgrade?

By far the most common is a dependency that doesn't have a version supporting the target React Native — either it's abandoned or the maintainer is behind. Other recurring stalls: native build failures from Gradle or Cocoapods version mismatches, Reanimated 2 to 3 migration, patches against React Native internals that no longer apply, custom native modules that need TurboModule rewrites, and privacy-manifest gaps on third-party SDKs.

Is it better to upgrade in-house or hire help?

In-house works well when you're one or two versions behind and have engineers who can carve out two weeks of focused time. It works poorly when you're four or more versions behind and the team is also expected to ship features — those upgrades tend to stall. A productized rescue service or experienced contractor compresses calendar time and de-risks the work, at the cost of the engagement fee. The break-even is roughly: if your in-house estimate is more than 6–8 weeks of elapsed time, outside help is usually cheaper end-to-end.

What does "half-life" mean in the context of a React Native upgrade?

Half-life is how long it takes for half of stalled in-house upgrades to actually ship vs get abandoned. Anecdotally, in-house React Native upgrades that don't ship within their initial estimate have a high abandonment rate — somewhere around 50% are quietly dropped within 6 months of the initial attempt, with the team going back to the old version. The work resumes a year later under more pressure, on a codebase that's drifted even further. Recognizing the half-life pattern is how you avoid being the team that learns it twice.