Causal decomposition · open protocol

Did the web actually get faster?

Since 2023, the share of sites with “good” Core Web Vitals has climbed about 13 points — a number quoted everywhere as proof the web is improving. But during that window Google changed both the metric and the measuring instrument. Correct for that and the comparable gain is +10.1 points, not +12.9 — and Google's own release notes prove a real chunk of it isn't sites getting faster at all.

The corrected headline

The raw fact is real: CrUX's headline share of origins passing Core Web Vitals rose from 43.0% in January 2023 to 55.9% in May 2026. The trap is reading that +12.9-point jump as “site owners made the web faster,” because in March 2024 Google replaced First Input Delay (FID) with Interaction to Next Paint (INP) as the responsiveness vital. INP is a stricter bar: in the two months CrUX reported both, the same web scored 3.2 points lower under INP (49.0% vs 45.8% in January 2024; 48.8% vs 45.6% in February). So the honest, metric-comparable baseline is the INP-substituted 45.8% — and the comparable gain to May 2026 is +10.1 points.

Line chart of the CrUX Core Web Vitals pass rate from 2023 to 2026. The official headline rises from 43.0% to 55.9%. A dashed INP-substituted line in the FID era sits lower (45.8% in January 2024), showing the metric-comparable baseline; the two lines merge at the March 2024 switch.
Figure 1 — CrUX headline pass rate, 2023–2026. The dashed line is the INP-comparable baseline before the March 2024 switch: the metric change lowered the starting score, so the real improvement is +10.1 points from 45.8%, not +12.9 from 43.0%. Source-coded from CrUX monthly release notes.
+12.9 ppraw headline (not metric-comparable)
+10.1 ppINP-comparable gain — the honest anchor
−3.2 ppthe FID→INP definition penalty
? ppshare that is actually site optimization

Two narratives die here. The web did not “get faster because INP replaced FID” — the switch lowered the reported pass rate. But the post-switch climb is far too big to wave away as just the transition. The real, unresolved question is how to split that +10.1 points between four very different forces — and the answer is not visible in any trend chart.

Four kinds of “faster”

“Faster” means at least four things in this literature, and they must be separated before any number means anything:

  1. Reported faster

    The official headline rises under the metric and data regime active that month. This is all a release note reports.

  2. Metric-definition faster

    The score improves because the metric changed. Excluding scroll-starting interactions from INP, for instance, removes interactions Google decided INP shouldn't measure — the number moves, the user feels nothing.

  3. Browser-side faster

    Users genuinely wait less because Chrome, Android, bfcache or the scheduler improved — with no change to the site's code.

  4. Site/platform optimized faster

    Site owners, CMSs, ad tags, CMPs or hosts changed markup, JavaScript, caching or delivery. This is the only category that answers “did websites get better?”

Only category 4 is site optimization. Category 3 is real user benefit but not the site's doing. Category 2 isn't a speed change at all. A headline number fuses all four — which is exactly why a raw year-over-year chart is methodologically unsafe when the metric definition and the instrument both move during the period being measured.

The documented shocks — and what's actually moving

Google's own CrUX release notes and Chromium changelogs date the discontinuities. Several explicitly are not ordinary site optimization. The component view shows where the headline comes from: LCP is the main mover (≈ +6 points), with CLS and INP improving from already-high bases.

Line chart of LCP, CLS and INP good-pass rates in the INP era (2024–2026): good-LCP rises from about 62% to 69%, good-CLS from 77% to 81%, good-INP stays high at 82–87%.
Figure 2 — Component pass rates in the official INP era. The headline tracks LCP most closely; several of the documented LCP movements below are browser-side, not site work.
Documented event windows from the release-note ledger. These windows overlap and are an upper-bound accounting, not a clean partition — the causal split needs the origin-panel study below.
WindowΔWhat the record attributes it to
FID → INP definition gap (Jan & Feb 2024)−3.2 ppMetric definition — a stricter bar, not a speed change
Jul → Sep 2024+1.8 ppMixed: INP scroll/modal exclusions + GPT yielding + LCP work
Feb → Mar 2025+1.0 ppBrowser-side: bfcache eligibility fixes by Chrome
Jun → Aug 2025+1.4 ppData quality: rebound after an Android data fix — not site work
Nov 2025 → Mar 2026+1.9 ppMixed seasonality / device / browser — unresolved

The events sort into families: metric-definition (FID→INP; the August 2024 scroll exclusion; the June 2024 modal-dialog timing change), browser-side (Chrome scheduler and Android cookie-caching gains; bfcache fixes; a March 2026 Android flagship boost Google measured at 4–6% faster loads), data-quality / coverage (the 2025 Android issue and fix; the ECT→RTT coverage change), and genuine site/platform work (WordPress LCP-image improvements; Google Publisher Tag and consent-platform yielding; Duda removing Cache-Control: no-store on ~40,000 origins).

A correction to a popular driver

One change is frequently miscredited: Chromium's February 2025 cross-origin LCP renderTime fix. Its changelog states plainly that the issue “did not affect the Chrome User Experience Report (CrUX)” and that it made RUM LCP “more in line with CrUX.” So it's a real-user- monitoring measurement event and a negative control for CrUX — if a decomposition attributes a 2025 CrUX LCP jump to it, the model is wrong.

Why a trend chart can't answer it — and what can

The Web Almanac's 2025 performance chapter is admirably honest: mobile CWV rose from 36% (2023) to 48% (2025), but it says that rise “may reflect browsers, devices and networks” alongside site optimization. That's the ambiguity. This study turns it into a falsifiable decomposition. Because web-platform events hit all Chrome users at once, there's no clean control group — so the design leans on exposure gradients and negative controls, not naïve before/after.

  1. An origin-month panel

    Pull chrome-ux-report.materialized.metrics_summary for every origin, Jan 2024–May 2026, and define pass/fail per metric at the 75%-good threshold — avoiding fragile p75 units.

  2. Constant-origin, not all-origin

    Run every model three ways: all reported origins, a constant-origin panel (present every month), and balanced-by-rank/device. Composition = (all-origin Δ) − (constant-origin Δ) — reported explicitly, never as “optimization.”

  3. Exposure-gradient event studies

    Each event gets an exposure proxy and a negative control: the Android data fix should load on phone density, with desktop as control; bfcache should help most where back/forward traffic is high; the cross-origin LCP change should produce no CrUX move (a falsification test).

  4. Additive + Shapley decomposition

    Because windows overlap, allocate the +10.1 points across metric-definition, data-quality, browser/device, site/platform, composition and an unexplained residual using order-averaged (Shapley) shares — so the result doesn't depend on which overlapping cause is counted first.

The reproducibility pack below ships the exact BigQuery extraction, the constant-origin panel construction, the exposure-feature SQL, and an R/fixest event-study skeleton — so anyone can run the causal step. The shares themselves are deliberately not estimated here: guessing them from aggregate monthly notes would be the exact error this paper exists to prevent.

The decomposition table the origin-panel study fills. Left blank on purpose — a confident number here without origin-level models would be theatre, not science.
Component of the +10.1 ppShareIdentification basis
Metric definition & scoringFID/INP paired gap; INP scroll/modal exposure
Data quality & coverageAndroid fix; ECT/RTT constant-coverage checks
Browser / device real speedbfcache, scheduler, Android exposure models
Explicit site/platform changesWordPress / GPT / CMP / Duda technology strata
Residual site optimizationresidual after event families + composition
Origin-set compositionall-origin minus constant-origin

What it means for performance teams

The decomposition isn't academic — it changes what you do:

And it reframes the speed-vs-revenue question our sister study “The cost of a millisecond” tackles: if your CrUX improved but the cause was a browser change, don't expect the conversion lift a real site optimization would have bought.

Limitations — read before quoting

  1. The causal shares are not estimated here

    This article establishes the corrected descriptive headline and the design. The numeric decomposition requires running the supplied origin-panel models on CrUX BigQuery; treat the table above as a specification, not a result.

  2. No randomized control

    Web-platform and metric events are global. Identification rests on exposure gradients and negative controls; aggregate interrupted-time-series alone is weak evidence and is labelled as such.

  3. CrUX is Chrome-only and eligibility-gated

    It excludes Chrome on iOS, WebView and other browsers, and origins enter/leave as popularity/eligibility shifts — which is precisely why constant-origin and composition panels are mandatory.

  4. Endpoint sensitivity

    May 2026 carries a documented, unexplained Android-heavy regression; March 2026 (56.5%) is the local maximum. Headline deltas should be reported against both endpoints.

  5. The series is source-coded by hand

    The headline numbers are transcribed from monthly release notes (spot-checked against the live notes — e.g. May 2026's 68.6/81.3/86.6/55.9 components match exactly). The published CSV lets you re-verify every row.

Data, code & sources

The reproducibility pack is published under CC BY 4.0: the source-coded headline series, the dated event ledger, the window accounting, and the BigQuery + R code to run the causal decomposition yourself.

Key sources

Cite this study

PageSpeedAudit Research (2026). Did the web actually get faster? A causal
decomposition framework for 2023-2026 Core Web Vitals improvement.
https://pagespeedaudit.com/research/did-the-web-get-faster

@misc{pagespeedaudit2026webfaster,
  title  = {Did the web actually get faster? A causal decomposition framework
            for 2023-2026 Core Web Vitals improvement},
  author = {{PageSpeedAudit Research}},
  year   = {2026},
  url    = {https://pagespeedaudit.com/research/did-the-web-get-faster},
  note   = {Headline series + event ledger + BigQuery/R code, CC BY 4.0}
}

Is your site actually faster — or did the metric move?

A PageSpeedAudit report separates real, code-level wins from measurement and browser effects, and tells you which fixes will move your field metrics. See also our study on whether Lighthouse's predicted savings materialize, and the free cloaking test.