Fixing a CrUX vs Lab Data Mismatch
A common and frustrating situation: Lighthouse gives a page a fast result, yet PageSpeed Insights field data and Search Console say it fails Core Web Vitals. Sometimes it is the other way round. Neither tool is broken. They measure different visits, over different time spans, on different devices, and often for different URLs.
This guide explains each source of disagreement, gives you a way to line the two sets of numbers up so you can see which gap you have, and shows how to get faster, more detailed real-user data so you are not waiting weeks to learn whether a fix worked.
- Two kinds of data, measuring different things
- Are you even looking at the same page?
- The 28-day window and update timing
- Why lab results look better than the field
- Why the field can look better than the lab
- Getting faster, more detailed field data
- The fix, step by step
- When there is no field data at all
- Questions and answers
Two kinds of data, measuring different things
| Field data (CrUX) | Lab data (Lighthouse) | |
|---|---|---|
| Who is measured | Real Chrome users who have opted in to sharing usage statistics | One simulated visit from a Google or local test machine |
| Devices | Whatever phones and computers your visitors own | A simulated mid-range phone, or a desktop profile |
| Time span | Rolling 28 days | A single moment |
| Figure reported | 75th percentile of all visits | The result of that one run |
| Cache | Mix of first and repeat visits | Empty cache every time |
| What happens after load | Scrolling, clicking, typing for the whole visit | Nothing; the test stops once the page settles |
| INP | Measured | Not measurable; TBT used as a stand-in |
| Used for Google's assessment | Yes | No |
The Chrome UX Report only includes data from Chrome on desktop and Android. It does not include Safari, Firefox, or Chrome on iPhone and iPad, which uses Apple's browser engine. If a large share of your visitors use iPhones, CrUX describes only part of your audience, and your own analytics may show a different device mix from the one CrUX is summarising.
The Core Web Vitals checker shows both kinds of data side by side for the same URL, which is the starting point for working out where the gap comes from.
Are you even looking at the same page?
Before blaming devices or networks, check what each report is actually describing. This catches more mismatches than any other check.
- URL or origin. PageSpeed Insights shows field data for the exact URL when CrUX has enough visits to it. When it does not, it falls back to the whole origin and says so above the figures. An origin figure blends your slow blog archive with your fast home page, so it may bear no relation to the page you tested in the lab.
- URL groups. Search Console groups pages that look similar and reports one status for the group. A single slow template can pull a group into "poor" even if the example URL it lists is fine on its own.
- Mobile or desktop. Field data is split by device type. Make sure you compare the mobile field figure with a mobile lab run, not with the desktop one.
- The metric. A lab report without INP, next to a field report failing only on INP, will look like a mismatch. It is really a gap in what the lab can measure.
- Which URL was tested. Testing
https://www.example.co.uk/in the lab while CrUX reports onhttps://example.co.uk/, or on the non-https version, compares two different sets of visits.
The 28-day window and update timing
Field data is a rolling 28-day summary. If you shipped a fix a week ago, around three quarters of the visits in the current figure happened before the fix. The number moves gradually as old visits drop out, and a big improvement can take around four weeks to show fully.
- The CrUX data in PageSpeed Insights and the CrUX API is refreshed daily, but always covers the previous 28 days.
- The CrUX History API publishes weekly data points, which is the easiest way to see the trend line turn after a release.
- The public BigQuery dataset is published monthly, for whole origins rather than individual pages.
- Search Console's Core Web Vitals report can lag a few days behind CrUX. When you start validation on an issue, Search Console monitors it over a 28-day period before reporting whether the fix has passed.
The same lag works in the other direction. A regression released today will not show as a fail in the field for days, while a lab test shows it at once. That is the main argument for combining both: the lab for instant feedback on every release, the field for the verdict.
Why lab results look better than the field
- Slower real devices. Lighthouse simulates a mid-range phone. Many real visitors use older, cheaper or overheating phones with slower processors, which hits JavaScript-heavy pages hardest.
- Arrival through redirects and tracking links. Visitors from adverts, emails and
social posts often go through one or more redirects and arrive with query strings such as
utm_sourceorgclid. Field LCP includes the redirect time. Many CDNs and page caches treat each unique query string as a new page, so these visitors get an uncached, slow response that your clean lab URL never sees. - Cookie banners and popups. Real visitors see consent banners, newsletter popups and chat prompts that may be suppressed, or dismissed differently, in a lab run.
- Logged-in and personalised pages. Account holders, basket contents and personalised recommendations can bypass the page cache and add work that a logged-out lab test avoids.
- Layout shift after load. Field CLS keeps counting while people scroll and use the page. Lazy-loaded adverts, late-loading embeds and infinite scroll can all cause shifts that a load-only lab test never reaches.
- Interactions. Field INP covers every tap and click. A slow menu or filter handler fails INP while lab TBT looks acceptable.
- Distance. Visitors far from your server see a slower first byte than a test machine near it.
- Single-page app navigation. In apps that change page with JavaScript, field CLS and INP from every route are attributed to the URL where the visit started, so the landing page can be blamed for problems on other screens.
Why the field can look better than the lab
The reverse happens too, and it is not a reason for concern on its own:
- Repeat visitors. Returning visitors have your CSS, JavaScript, fonts and images cached, so their pages load much faster than Lighthouse's empty-cache run.
- Back and forward cache. When someone presses back and the browser restores the page from its back/forward cache, the load is near-instant and those fast visits count in the field.
- Prerendering and prefetching. Pages prerendered through speculation rules, or prefetched by the referring site, can show very low LCP for real visitors.
- Fast audiences. An audience mostly on desktop office connections, or on new phones, will outperform the lab's deliberately modest device.
If the field passes comfortably and the lab fails, real visitors are having a good experience. Use the lab diagnostics to catch risks before they reach the field, but do not treat a lab fail as an emergency.
Getting faster, more detailed field data
CrUX tells you the result but not the cause, and not quickly. Your own real-user monitoring fills
both gaps. Google's open-source web-vitals library measures the Core Web Vitals in each
visitor's browser the same way Chrome does, and its attribution build explains what caused each result.
import { onLCP, onINP, onCLS } from 'web-vitals/attribution';
function send(metric) {
const body = JSON.stringify({
name: metric.name,
value: Math.round(metric.name === 'CLS' ? metric.value * 1000 : metric.value),
rating: metric.rating,
page: location.pathname,
navigationType: metric.navigationType,
detail: metric.attribution
});
navigator.sendBeacon('/rum', body);
}
onLCP(send);
onINP(send);
onCLS(send);
Send the results to your own endpoint or into your analytics tool as events. Then report the 75th
percentile by page template, device type and navigationType, which tells you whether a visit
was a normal load, a reload, a back/forward restore or a prerender. Within a few days of a release you
will know whether the fix is working, and the attribution tells you which element, script or interaction
is responsible when it is not.
If you collect this data with an analytics tool that sets cookies, handle consent in the same way as the rest of your analytics. This is not legal advice.
The fix, step by step
Step 1
Check you are comparing like with like
Open the Core Web Vitals checker or PageSpeed Insights and confirm whether the field figure is for this exact URL or the whole origin, and whether you are looking at mobile or desktop. In Search Console, open the failing group and note the example URLs. Make sure the lab test used the same address, protocol and www setting, and compare only the same metric on the same device type before drawing any conclusion.
Step 2
Account for the 28-day window
Write down the date of every performance change released in the last month. If a fix went live less than four weeks ago, much of the field figure still reflects the old page. Use the CrUX History API view, or the trend in the checker, to see whether the line has started to turn after the release date rather than judging the single current number, and give recent fixes time before changing course.
Step 3
Test the way real visitors arrive
Look
at your analytics for the most common landing URLs, including query strings from adverts and emails,
and test those exact addresses. Check for redirects on the way in and whether a URL with utm_source
or gclid gets a cache miss from your CDN or page cache. If it does, configure the cache
to ignore marketing parameters so every visitor gets the cached page.
Step 4
Reproduce real devices and journeys in the lab
Rerun lab tests with heavier CPU throttling to imitate slower phones, with a cold cache, and with the cookie banner showing. Use the DevTools Performance panel to record a real journey rather than just a load: accept the banner, scroll the page, open the menu and use a filter or form. Watch for layout shifts and long interactions after load that the default lab test would never reach.
Step 5
Add your own real-user monitoring
Install
the web-vitals library with its attribution build and send LCP, INP and CLS, with the page
path, device type, navigation type and attribution details, to your analytics or a simple collection
endpoint. Report the 75th percentile per template. Within a few days you will see which pages, devices
and elements are behind the field figure, instead of waiting a month for CrUX to change.
Step 6
Fix from the field data and track it weekly
Pick the template and metric that fail most often in your real-user data and use the lab tools only to find the cause behind it. After each release, check your own monitoring within days and the CrUX weekly trend over the following month, then start validation in Search Console. Keep a dated log of changes so any later movement in the field figure can be traced to a release.
When there is no field data at all
PageSpeed Insights sometimes shows no field data for a URL, or even for the whole origin, and Search Console may say there is not enough data. CrUX only publishes figures for pages and origins with enough eligible visits, and it only includes pages that are publicly available. A new site, a low-traffic page or a page behind a login will often have none.
This is not a penalty and not a failure. Without field data, Google has no Core Web Vitals figure to use for that page. In that situation:
- Use lab tests to catch obvious problems before they affect visitors.
- Add real-user monitoring if you want to know how real visitors are doing, even with small numbers.
- Check the origin-level figure, which may exist even when individual pages have none.
- Put most of your effort into content and crawlability until traffic grows.
For the metrics themselves, see the LCP guide, the INP guide and the guide to mobile-only failures, which covers the most common reason field results trail behind lab ones.
1. Why does PageSpeed Insights say my page passes in the lab but fails Core Web Vitals?
The top section of PageSpeed Insights shows field data from real Chrome users over the last 28 days, and that is the Core Web Vitals assessment. The lower section is a single Lighthouse lab run on a simulated phone. Real visitors may have slower devices, arrive through redirects, see a cookie banner, interact with the page and scroll it, none of which the lab run covers. Trust the field section for the verdict and use the lab section to look for causes.
2. How long does it take for field data to update after a fix?
The Chrome UX Report is a rolling 28-day window, refreshed daily in PageSpeed Insights and the CrUX API. After a fix, the figure improves gradually as older visits drop out, and it can take around four weeks to reflect the change fully. Search Console can lag a few more days, and its validation process monitors the issue over 28 days. Your own real-user monitoring, for example with the web-vitals library, shows the effect within days.
3. Why is Search Console showing different results from PageSpeed Insights?
Both use Chrome UX Report data, but they present it differently. PageSpeed Insights shows the exact URL if it has enough traffic, or the whole origin if not. Search Console groups similar URLs together and gives the group one status, and its report can be a few days behind. So a single page may look fine in PageSpeed Insights while its group fails in Search Console because other pages built on the same template are slow.
4. Does CrUX include iPhone users?
No. The Chrome UX Report collects data from Chrome on desktop and Android. Chrome on iPhone and iPad uses Apple's browser engine and is not included, and neither are Safari and Firefox. If many of your visitors use iPhones, CrUX reflects only part of your audience. That is still the data Google uses for its assessment, but your own real-user monitoring can include other browsers where they support the metrics, giving you a fuller picture of how all visitors fare.
5. Why is my field data better than my Lighthouse result?
Real visits include returning visitors with files already cached, pages restored instantly from the back and forward cache, prerendered pages, and people on fast devices and connections. Lighthouse always tests a first visit with an empty cache on a deliberately modest simulated phone. If the field data passes, real visitors are having a good experience. Keep using the lab diagnostics to catch risks, but a lab fail with a field pass is not an emergency.
6. Why does my page have no field data?
The Chrome UX Report only publishes figures for pages and origins that have enough eligible visits from Chrome users who share usage statistics, and only for publicly available pages. New sites, low-traffic pages and pages behind a login often have none. It is not a penalty. Check whether origin-level data exists, use lab tests to catch problems, and consider adding your own real-user monitoring if you want to see how actual visitors experience the page.
7. Should I trust my own real-user monitoring or CrUX?
Use both for different jobs. CrUX is the official data behind Google's Core Web Vitals assessment and Search Console, so it is the number to report and aim at. Your own monitoring is faster, covers more browsers, and with the attribution build tells you what caused each slow result. The totals will not match exactly because the audiences differ. Watch whether the two move in the same direction after a release rather than expecting identical numbers.
The Core Web Vitals checker pulls real-user field data from the Chrome UX Report and runs a Lighthouse lab test on the same URL, showing both side by side so you can see where they disagree.
Open Core Web Vitals Fixes โ