Performance

Lighthouse and CrUX: who is right when the numbers disagree

Five lab runs on one page give LCP from 708 to 908 ms, with a cold TTFB of 11,416 ms. CrUX publishes the 75th percentile over 28 days.

Key points

  • Lighthouse measures a single lab run; CrUX measures the 75th percentile of 28 days of real users.
  • Five runs on the same page gave LCP between 708 and 908 ms and TTFB between 319 and 529 ms.
  • One cold start measured 11,416 ms of TTFB: a single run can describe a case users never see.
  • When the two numbers diverge, the lab explains why and the field says whether it matters.

Lighthouse and CrUX do not measure the same thing: Lighthouse is a single lab run, CrUX is the 75th percentile of 28 days of real users. When the numbers disagree, CrUX is right about the verdict and Lighthouse about the diagnosis. Five runs on our home page gave LCP between 708 and 908 ms, and one cold start measured 11,416 ms of TTFB.

Two measurements, two questions

QuestionLighthouseCrUX
Who measuresa headless browser, oncereal users, 28 days
Which number it publishesone samplethe 75th percentile
Does it cover the slowest deviceno, it emulates oneyes, if those users exist
How fast you get itseconds, locallydays, and you need enough traffic
What a regression looks likevisible at oncevisible after days

In our series the TTFB spread is 319-529 ms, which is 210 ms between runs on the same page from the same network. The cold run reaches 11,416 ms. Whoever reads one run sees one of those three worlds and calls it "the performance of the site".

The command

npx lighthouse https://example.com/ --only-categories=performance --preset=desktop \
  --output=json --output-path=./lh.json --chrome-flags="--headless=new"
node -e "const r=require('./lh.json');console.log(Math.round(r.audits['largest-contentful-paint'].numericValue))"

The command needs Node, Chrome and a connection; the first run downloads Lighthouse. numericValue is the LCP in milliseconds for that single run. Run it five times: if the values move, the number to cite is the median with its range, not the best run.

Why lab and field diverge

A lab measures a fast machine on a good network, or emulates a slow machine on a slow network: either way it measures a model. The field measures real phones with different caches, extensions, a crowded 4G cell and a nearly empty battery. The divergence is not a fault in either tool: it is the difference between a controlled test and a sample.

The limitation to name

We did not query the CrUX API, which needs a key and an origin with enough traffic: this site's field data is not published here. The five runs come from one network and one device. So the honest comparison is between a lab distribution and the field thresholds, not between two field numbers.

Where to continue

The EneUI catalogue indexes 111,985 components, the chart blocks and the record hero parallax, a hero that moves LCP more than any tweak. For lab against field read measuring LCP; to put the thresholds in CI, Lighthouse CI with thresholds; for responsiveness, INP: what it measures; and for the comparison between architectures, frontend frameworks compared.

Frequently asked questions

If Lighthouse says 98 and CrUX says "needs improvement", who is wrong?

Neither. Lighthouse measured one run on a fast machine, CrUX the 75th percentile of your users. The field decides whether the page passes, the lab explains which part of the code weighs.

Why do two Lighthouse runs give different scores?

Because every run is a sample: network, cache, other processes and browser startup vary. In our series LCP went from 708 to 908 ms and TTFB from 319 to 529 ms on the same page.

Does CrUX measure every page of the site?

No. It publishes data per origin and, above a traffic threshold, per URL. Pages with few visits have no data of their own and fall into the origin aggregate.

Can CrUX replace my own RUM?

CrUX is public, aggregated data, useful as an external reference. It gives you no detail per page, device or code version: for that you need your own RUM.

Which threshold should CI enforce?

Lab thresholds are stricter than field ones: a lab LCP budget near 2,500 ms leaves room in the field. Set the budget on the median of several runs, never on the best one.