How to test core web vitals

Record a page load in the Chrome DevTools Performance panel, then read the LCP, CLS and INP values it reports and compare them with the field data for the same URL. Lab and field numbers differ, so a page passes only when the field numbers at the 75th percentile stay inside Google's thresholds.

Why check this

Core Web Vitals sit in the release gate of any page that search traffic reaches, and they are the performance numbers a product owner quotes back at you. Run the check on staging before a release, then again on production once real traffic has accumulated. The failure it prevents is concrete: a tester signs off a page on a fast laptop with a warm cache while real users on the same URL wait almost four times longer for the main content to appear.

Prerequisites

Steps

  1. Step 1.

    Measure the server side first, so you know how much of the budget is gone before the browser paints anything.

    curl -s -o /dev/null -w 'code %{http_code}\nttfb %{time_starttransfer}\ntotal %{time_total}\nbytes %{size_download}\n' https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS
    
    code 200
    ttfb 0.207413
    total 0.344199
    bytes 258732

    This is the pre-filter. It tells you the document arrives and how long that takes from your network. It reports none of the three vitals, because all three are measured inside the browser.

  2. Step 2.

    Open the URL in Chrome, press F12, switch to the Performance panel and click the reload and record button. Wait for the trace to stop, then read the LCP marker and the layout shift track.

    LCP  375 ms
    TTFB          2 ms
    Render delay  374 ms
    CLS  0.00

    One capture of one load on one machine. Your own trace produces its own numbers.

  3. Step 3.

    Read the field data for the same URL, from the field section of the Performance panel or from PageSpeed Insights. Both read the same Chrome User Experience Report dataset.

    Field (CrUX, p75 of real Chrome users, scope: url)
    LCP  1363 ms
      TTFB          336 ms
      Load delay    633 ms
      Load duration 299 ms
      Render delay  161 ms
    INP  35 ms
    CLS  0.05

How to read the result

| What you see | What it means | What to do | | --- | --- | --- | | Lab LCP 375 ms, field LCP 1363 ms | Your machine and your cache are faster than the user population | Report the field number. Keep the lab number as the reproduction. | | Field CLS 0.05 while lab CLS is 0.00 | The shifts follow interactions the trace never made | Scroll and click during the trace, then read CLS again. | | Field INP 35 ms | Interaction cost is inside the threshold on this URL | Nothing. INP has no lab equivalent to chase. | | No field section for the URL | CrUX has too few samples for this page | Read the origin scope instead, and say in the report which scope it is. |

Common mistakes

Sign: The Performance panel reports a fast LCP and the release still fails the vitals gate.Cause: The trace ran with a warm HTTP cache. TTFB was 2 ms on the captured trace and 336 ms for real users on the same URL, so the lab load skipped a third of a second that every first visit pays.
Sign: CLS is 0.00 in every trace and above zero in the field.Cause: A trace that only loads the page never scrolls, never clicks and never opens a menu. Shifts that follow an interaction fall outside the window the trace captured, and CLS keeps accumulating for the whole life of the page.
Sign: Two runs of the same URL give different LCP values.Cause: A lab metric is one sample. Network, CPU and cache state change between runs, so one trace is evidence about a range and not a value. Record three loads and keep the slowest.
Sign: The field section reports numbers for the whole site rather than the page.Cause: CrUX falls back to origin scope when a URL has too few samples. The scope label says which one you are reading, and an origin number cannot sign off a single page.

Thresholds

LCP 2.5 s, INP 200 ms, CLS 0.1

A page is good when it meets all three at the 75th percentile of page loads, segmented across mobile and desktop.

Source: web.dev, Web Vitals, https://web.dev/articles/vitals

What to check next

FAQ

How to measure core web vitals without Chrome?

Field data comes from Chrome users only, so no other browser contributes to it. You can time a page anywhere with your own instrumentation, and the number will be valid for your own report, but it is not the number Search uses.

What is the difference between lab and field core web vitals data?

Lab data is one load on your machine, under your network and your cache state. Field data is the 75th percentile of real Chrome users. On the captured URL the same metric read 375 ms in the lab and 1363 ms in the field. Lab finds causes, field decides pass or fail.

How to check INP?

INP appears in the field section only. It needs real interactions, and a load trace makes none. The captured URL reported INP 35 ms in the field and no INP value in the lab. To debug it, record a trace while clicking the slow control.

Which number belongs in the bug report?

The field value, with its scope label and the date beside it. Put the lab value underneath as the reproduction. A report that quotes the lab number alone gets closed as not reproducible on the developer's machine.

Verified

The browser figures above come from one Chrome DevTools capture of https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS on 2026-09-11, on one machine, with no CPU and no network throttling. That is a single capture and not a benchmark. Read your own Chrome build from chrome://version and record it beside your own numbers.

Verified by Maks Vernycurl 8.21.0

Each output block is what the command above it printed on that date, on the host named in the step. Figures read from a live site move between runs. Compare the shape of the answer rather than the digits, and see the methodology for how a page is re-verified.

intermediate12 minpublished updated Maks Verny