Analytic result + secondary evidence + registered protocol
How many Lighthouse runs prove a change?
“We ran it five times and the score went up two points.” That sentence drives sprint reviews, agency invoices and CI gates — and most of the time it isn't evidence. Lighthouse is noisy enough that a small before/after change can be pure run-to-run variance. Median-of-five gives you a stable estimate; it does not give you the statistical power to prove a small improvement is real. Here's the framework that does — with the numbers, a calculator, and the protocol to settle it at scale.
What's settled here, and what isn't
This article delivers three things and is careful to keep them apart. (1) A completed analytic result — the confidence-interval and power tables that convert a run-level standard deviation into the runs you need; these are mathematics, not measurement. (2) Secondary empirical evidence — real repeated-run Lighthouse data from a published study, showing the variance is large and site-specific. (3) A registered protocol for the primary study we have not yet run (a 200-site × 50-run variance census). No empirical variance number is invented; the analytic tables are exact, and the census is specified so it can be executed and audited.
The claim everyone makes — and why it's usually unproven
The advice to run Lighthouse multiple times and aggregate is correct and well-founded. Google's own variability guidance lists the sources of run-to-run noise — network, CPU contention, layout non-determinism, A/B and personalisation — and recommends aggregating runs. The closest academic study, Heričko, Šumak & Brdnik (2021), reaches the same operational rule: single runs are unrepresentative, and five consecutive runs aggregated by the median reduce variability greatly in reasonable time. That is where “median of 5” comes from, and for its purpose — a stable snapshot of one page — it's good guidance.
The trouble is that the same heuristic gets quietly promoted to a job it was never validated for: proving that a change moved the score. Stabilising an estimate and detecting a small difference are different statistical problems. The first asks “where does this page sit?”; the second asks “is this 2-point gap bigger than the noise?” — and the answer to the second depends entirely on how much the runs scatter relative to the change you're claiming.
The variance is real, large, and stubbornly site-specific
Before any statistics, look at what repeated runs actually do. Heričko et al. ran each of ten production sites 1, 5, 10 and 100 times. Aggregation does pull the median in — but the underlying spread is wide for some sites and tiny for others, and it does not vanish even at 100 runs:
Two things explain why the score is so jumpy. First, its composition: the performance score is a weighted blend in which Total Blocking Time carries 30% and LCP and CLS 25% each — and TBT, which depends on exactly how main-thread long tasks get scheduled, is the most timing-sensitive of the lot. Second, throttling: PageSpeed Insights and default Lighthouse use simulated (Lantern) throttling, whose modelled timings react differently to noise than applied throttling. The upshot is that a “run-level σ” of 2 points on one site can be 7+ on another in the same lab — which is why a borrowed variance number is unsafe and a pilot is mandatory.
The right question is power, not repetition
Treat a before/after comparison as what it is: a two-sample test on noisy measurements. To detect a true difference δ in the score, with run-level standard deviation σ, at two-sided significance α and power 1−β, the runs per condition follow the standard sample-size formula:
n ≥ 2 · (z₁₋α/₂ + z_power)² · σ² / δ² independent, equal n per condition
at α = 0.05 and power = 0.80: n ≈ 15.7 · σ² / δ²
paired runs (alternated before/after): drop the factor of 2, use σ of the paired differences
The σ²/δ² term is the whole story. Runs scale with the square of the
noise-to-signal ratio, so halving the change you want to detect quadruples the runs you need.
That is why “a few more runs” never rescues a small claim — and why the median-of-5 default silently
fails the moment the effect you're chasing is small relative to the spread.
| Detect δ | σ = 2 | σ = 5 | σ = 8 |
|---|---|---|---|
| 10 points | 1 | 4 | 11 |
| 5 points | 3 | 16 | 41 |
| 3 points | 7 | 44 | 112 |
| 1 point | 63 | 393 | 1,005 |
What median-of-5 can and can't prove
Read the same physics the other way: fix the runs and ask how small a change they can resolve. The
minimum detectable effect at n runs is
(z₁₋α/₂ + z_power) · σ · √(2/n), which shrinks only as 1/√n — brutal
diminishing returns. At a typical σ = 5, here is what each run budget actually buys:
So median-of-5 isn't wrong — it's a screening tool. It will reliably flag a page that fell off a cliff. It cannot, and was never meant to, certify that your CSS refactor bought 3 points. For that you need either many more runs, a paired design that cancels shared drift, or the honesty to report “within noise.” This is the same lesson the systems-benchmarking literature settled long ago: Mytkowicz et al. showed you can “produce wrong data without doing anything obviously wrong,” and Kalibera & Jones formalised how many repetitions rigorous benchmarking actually requires. Web performance is not exempt.
Put your own numbers in
The tables above assume round numbers. Your site has its own spread, and your claim has its own threshold. The companion calculator turns a pilot-measured σ and a target δ into the runs you need — and, for any candidate run count, the smallest change you could honestly claim and the confidence interval you'd report.
Lighthouse required-runs calculator
Enter your run-level SD, the change you want to prove, and your confidence and power. It returns the required runs per condition, a precision sweep, and a clear red/green read on whether your planned run budget can actually support the claim.
The protocol to settle σ empirically
The analytic tables need one input the literature only sketches: the real distribution of run-level σ across the web, by site class and setup. The registered primary study fills that gap, and ships its data schema pre-frozen so results can't be fished:
A 200-site × 50-run census
200 sites stratified by score band, framework, third-party intensity and content class, each run 50× per condition on a pinned single-tenant runner — enough to estimate per-site σ precisely and to map how σ varies across the web.
Fixed environment, recorded to the byte
One Lighthouse version, Chrome build, throttling mode, device profile and cache policy, with container digest, CPU model and governor, and cgroup quota logged per run (the raw-observation schema is in the pack). Variance you don't control, you record.
Per-metric, not just score
σ for FCP, LCP, SI, TBT and CLS separately, because the score's noise is mostly TBT's noise — and a fix that targets LCP should be judged on LCP, not on a TBT-dominated composite.
Bootstrap, not just the normal approximation
The closed-form n assumes approximate normality of the mean; the study reports bootstrap confidence intervals on the median-of-n as well, since medians are what practitioners actually quote.
A published claim standard
The deliverable is a per-site-class table of “runs needed to defensibly claim a δ-point change,” turning the calculator's general formula into concrete, citable guidance.
A defensible before/after claim
Pulling it together, a Lighthouse before/after claim is decision-grade only when it clears a short bar. Anything less is a screening signal, and should be labelled as one:
- Pre-register δ. Decide the smallest change worth claiming before measuring — not after seeing the result.
- Pilot your σ. Estimate run-level spread in your exact setup; don't borrow a number.
- Hit the required n. Use
n ≈ 15.7 σ²/δ²(or the calculator); median-of-5 only qualifies when δ is large relative to σ. - Pair or block. Alternate before/after runs to cancel shared drift; it can cut the runs needed substantially.
- Report the interval. Quote a confidence interval on the difference, not two point medians. “+3 ± 6” is an honest non-result; “+3” alone is misleading.
- Freeze the environment. Same version, throttling, device and cache — and judge a metric-targeted fix on that metric, not the composite.
Limitations
σ is an input, not yet a measured distribution
The analytic tables are exact for a given σ; the spread of σ across the real web is what the registered census exists to supply. Until then, use a pilot.
Normal-approximation closed form
The
nformula assumes approximate normality of the aggregated mean and a known σ. For small n and skewed metrics (TBT, CLS), prefer the bootstrap; the secondary-evidence ranges hint the score is not always symmetric.Score vs metrics
This focuses on the 0–100 performance score for continuity with the median-of-5 advice. The same machinery applies per metric, with different σ — often the more useful unit.
Lab, not field
This is about controlled lab repeatability, not CrUX field data. A change that's lab-significant still has to show up for real users — a separate question we treat in our other studies.
Data, code & sources
Published under CC BY 4.0: the digitised secondary evidence, the analytic CI-multiplier and minimum-detectable-effect tables, and the pre-frozen raw-observation schema for the census. Every analytic number is reproducible from the formulas above.
Key sources
- Heričko, T., Šumak, B. & Brdnik, S. (2021). Towards Representative Web Performance Measurements with Google Lighthouse, StuCoSReC 2021 — the repeated-run data (Table 2) and the median-of-5 finding.
- Google / Chrome. Lighthouse performance scoring (metric weights: TBT 30%, LCP 25%, CLS 25%, FCP 10%, SI 10%) & Lighthouse variability (sources of noise; aggregate runs).
- DebugBear. Reducing variability in web performance metrics — independent repeated-run evidence.
- Mytkowicz, T. et al. (2009). Producing wrong data without doing anything obviously wrong!, ASPLOS — measurement bias in benchmarking.
- Kalibera, T. & Jones, R. (2013). Rigorous benchmarking in reasonable time, ISMM — how many repetitions rigorous measurement needs.
Cite this study
PageSpeedAudit Research (2026). How many Lighthouse runs prove a change?
A confidence-interval and statistical-power framework for before/after
performance-score claims.
https://pagespeedaudit.com/research/how-many-lighthouse-runs-prove-a-change
@misc{pagespeedaudit2026lighthousepower,
title = {How many Lighthouse runs prove a change? A confidence-interval
and statistical-power framework for before/after claims},
author = {{PageSpeedAudit Research}},
year = {2026},
url = {https://pagespeedaudit.com/research/how-many-lighthouse-runs-prove-a-change},
note = {Analytic tables + secondary evidence + registered protocol, CC BY 4.0}
}
Want a before/after you can actually defend?
A PageSpeedAudit report reports effects with their uncertainty, not a lone point score — so a “+3” comes with the interval that tells you whether it's real. Try the free required-runs calculator, and see our sister study “Do Lighthouse's promised savings materialize?” for whether the predicted milliseconds even show up.