Lab vs Field Data
Lighthouse lab vs CrUX/RUM field: what each is for, how they diverge, and how to use both.
- performance
- lab
- field
- rum
- core-web-vitals
Lab data is a controlled test (Lighthouse, WebPageTest, local Performance panel). Field data is real users (CrUX, your RUM). Shipping only for green Lighthouse while field INP burns is a classic failure mode.
Docs: web.dev lab vs field, CrUX, Core Web Vitals.
Comparison
| Lab | Field | |
|---|---|---|
| Environment | Fixed device/network simulation | Real devices, networks, locales |
| Interactions | Scripted or none | Actual clicks/scrolls |
| Variance | Low | High (use percentiles) |
| Debug depth | Excellent | Attribution limited |
| SEO / CWV reporting | Indirect | CrUX feeds Search signals |
Field is the source of truth for CWV
Google uses field metrics (CrUX) for experience signals. Good: p75 LCP ≤ 2.5s, INP ≤ 200ms, CLS ≤ 0.1. Lab helps you find why field is bad.
import { onLCP, onINP, onCLS } from 'web-vitals';
onLCP(send); onINP(send); onCLS(send);
Why they disagree
- Lab doesn’t perform the slow interaction INP cares about.
- Throttling models ≠ every 4G user.
- Auth, A/B, personalization change HTML in field.
- Third parties behave differently by geo.
- Sample bias (CrUX Chrome users only).
- Cached vs cold navigations mix in field.
How to use both
Field: which templates fail p75?
→ Lab: reproduce with throttle + Performance panel
→ Fix
→ Field: verify p75 moves over days/weeks
Don’t declare victory from one Lighthouse run on desktop.
Tooling map
| Need | Tool |
|---|---|
| Origin-level CWV | CrUX / PSI field section |
| Page-level RUM | web-vitals + analytics |
| Debug load | Lighthouse, WPT |
| Debug interaction | DevTools Performance + field attribution |
| Synthetic monitors | Lab in CI for regressions |
See RUM, Lighthouse interpretation.
Interview out-loud
“Field CWV is what users and Search see; lab is for debugging under controlled conditions. They diverge because of real devices, interactions, and third parties. I locate failures in RUM, reproduce in lab, confirm back in field.”
How this shows up in interviews
Be ready to define the metric or technique in one sentence, name one measurement approach (DevTools panel, web-vitals, or headers), and cite a concrete fix you would try first. Walk through a before/after: what the waterfall or flame chart showed, what you changed, and which percentile moved. Mention a tradeoff (complexity, caching correctness, or third-party business constraints) so the answer doesn’t sound like a blog checklist.
Production guardrails
Ship behind a flag when the change is risky, watch field p75 for the affected template for at least a few days, and keep a rollback path. Pair lab verification (throttled Performance/Network) with RUM so you don’t celebrate a Lighthouse-only win. Document the owner of any ongoing budget or third-party exception.
Related
- RUM real user monitoring
- Lighthouse score interpretation
- Measuring performance mindset
- Throttling CPU and network
Further depth
Teams often under-invest in this topic until an incident or CWV regression. Schedule a one-hour drill: reproduce the failure mode in DevTools, list the top three mitigations for your stack, and file tickets with owners. Revisit after the next major feature that touches networking, rendering, auth, or third parties — those are the moments regressions land. Keep primary documentation links in the runbook so on-call is not searching chat history at 2am.
Concrete artifacts to leave behind: a short architecture note, a CI assertion or header snapshot, and a dashboard panel (lab or field) that would have caught the last bug. Teaching the rest of the team the mental model matters as much as the one-line fix.
Further reading
Related guides
- Lighthouse Score InterpretationWhat the 0–100 Lighthouse score means, metric weights, variance, and how not to game it.
- RUM Real User MonitoringCollect field CWV and custom timings from real sessions: sampling, beacons, privacy, and dashboards.
- Measuring Performance MindsetMeasure before optimizing: hypotheses, percentiles, user journeys, and stopping when the metric doesn’t move.
- Avoiding Layout ThrashingStop forced sync layout loops: batch DOM reads and writes, use rAF, and fix janky measurement code.
- Caching Static Assets FingerprintingContent-hash filenames, long-cache headers, HTML revalidation, and CDN invalidation without stuck users.