Audit my site
Technical SEOIntermediateChecked against Google docs · Oct 2026

Core Web Vitals: what LCP, INP and CLS measure and how to fix them

Core Web Vitals measure how real visitors experience loading, responsiveness and visual stability. Google uses them in ranking, but relevance comes first, so the goal is a good score on all three, not a perfect one.

Author: Eugene Serbin, Head of SEO at Semalt Updated: 30 October 2026 Reading time: 22 min Visuals: 6

In short

Core Web Vitals are three metrics measured on real Chrome users: LCP for loading, INP for responsiveness and CLS for visual stability. A page passes when at least 75% of visits are “good” on all three, separately for mobile and desktop. Google says Core Web Vitals are used by its ranking systems, but relevance comes first, so treat them as part of a good page experience, not as a shortcut to the top.

What Core Web Vitals are

Google Search Central defines them in one sentence: “Core Web Vitals is a set of metrics that measure real-world user experience for loading performance, interactivity, and visual stability of the page.” There are three of them, and each answers one question a visitor has:

INP replaced FID in March 2024

Until 2024 the responsiveness metric was First Input Delay (FID). FID only looked at the delay before the browser started handling the first interaction. INP looks at the interactions throughout the visit and measures the full time until the next frame is painted. Google's web.dev announced: “Interaction to Next Paint will officially become a Core Web Vital and will replace First Input Delay on March 12.” That was 12 March 2024. If a tool, plugin or article still talks about FID as a Core Web Vital, it is out of date.

How metrics get added and retired

“Metrics on the Core Web Vitals track go through a lifecycle consisting of three phases: experimental, pending, and stable.” INP went through all three before it replaced FID. Today LCP, INP and CLS are all stable. The set can still change in future, but changes are announced in advance.

The thresholds and the 75th percentile rule

Each metric has three bands. These are the ranges Search Console uses in its Core Web Vitals report:

Chart · Core Web Vitals thresholds
Good, needs improvement and poor ranges for LCP, INP and CLS LCP: good up to 2.5 seconds, needs improvement up to 4 seconds, poor above 4 seconds. INP: good up to 200 milliseconds, needs improvement up to 500 milliseconds, poor above 500 milliseconds. CLS: good up to 0.1, needs improvement up to 0.25, poor above 0.25. GoodNeeds improvementPoor LCPINPCLS loadingresponsivenessvisual stability ≤ 2.5 s2.5 s – 4 s> 4 s ≤ 200 ms200 ms – 500 ms> 500 ms ≤ 0.10.1 – 0.25> 0.25
Values are measured at the 75th percentile of visits. Segment widths are not to scale.
MetricGoodNeeds improvementPoor
LCP≤ 2.5 s≤ 4 s> 4 s
INP≤ 200 ms≤ 500 ms> 500 ms
CLS≤ 0.1≤ 0.25> 0.25

The 75th percentile

A metric is not judged on one visit or on the average. Google's web.dev explains: “To ensure you're hitting the recommended target for these metrics for most of your users, a good threshold to measure is the 75th percentile of page loads, segmented across mobile and desktop devices.” In plain terms: sort all visits from fastest to slowest and take the value three-quarters of the way along. If that value is within the “good” band, at least 75% of your visitors had a good experience on that metric.

Three consequences follow:

  1. All three must pass. “Tools that assess Core Web Vitals compliance should consider a page passing if it meets the recommended targets at the 75th percentile for all three of the Core Web Vitals metrics.” Good LCP and CLS do not compensate for poor INP.
  2. Mobile and desktop are judged separately. A page can be good on desktop and poor on mobile. Mobile visitors usually have slower devices and networks, so mobile is where most pages fail.
  3. Your slowest quarter matters less, but not nothing. A few very slow visits will not fail a page, but if the slow visits grow past a quarter of traffic, the 75th percentile value moves into the next band.

What Google officially says

“We highly recommend site owners achieve good Core Web Vitals for success with Search and to ensure a great user experience generally. This, along with other page experience aspects, aligns with what our core ranking systems seek to reward.”

Google Search Central — Understanding Core Web Vitals and Google search results

“Core Web Vitals are used by our ranking systems.”

Google Search Central — Understanding page experience in Google Search results

“Google Search always seeks to show the most relevant content, even if the page experience is sub-par.”

Google Search Central — Understanding page experience. Google continues: “But for many queries, there is lots of helpful content available. Having a great page experience can contribute to success in Search, in such cases.”

The same page experience documentation adds several limits. Each of these is a direct quote:

Google also gives a self-assessment for page experience. Among its questions: “Do your pages have good Core Web Vitals?” “Are your pages served in a secure fashion?” “Does your content display well on mobile devices?” “Do your pages avoid using intrusive interstitials?”

How much Core Web Vitals matter for ranking

Read Google's wording carefully and a consistent picture emerges:

The other page experience aspects in the self-assessment, such as HTTPS, mobile-friendliness and avoiding intrusive interstitials, are worth doing for users. Google states they do not directly raise rankings on their own.

Field data vs lab data

There are two ways to measure performance, and they answer different questions.

Field data comes from real visits. Google's main field source is the Chrome User Experience Report (CrUX), which collects anonymised measurements from Chrome users. This is the data shown in the Search Console report and in the top section of PageSpeed Insights, and it reflects your real visitors' devices, networks and locations. As web.dev puts it: “The most important thing to understand about field data is that it is not just one number, it's a distribution of numbers.”

Lab data comes from loading a page once in a controlled environment, usually with Lighthouse (inside PageSpeed Insights and Chrome DevTools). It is repeatable and detailed, which makes it ideal for debugging and for testing a fix before release. But it is one simulated visit, not your audience.

Table · Field data vs lab data
Field data (CrUX, RUM)Lab data (Lighthouse)
SourceReal Chrome users visiting the pageOne simulated load with fixed device and network settings
Time spanRolling 28 daysThe moment you run the test
LCPYesYes
INPYesNo; Total Blocking Time (TBT) is a lab proxy
CLSYes, for the whole visitOnly shifts during the test load
Best forKnowing whether real users have a problemFinding why, and checking a fix before release
Shown inSearch Console report, PageSpeed Insights (top), CrUXPageSpeed Insights (bottom), Lighthouse, DevTools
Use field data to decide what to fix and lab data to find out how.

Lab tools cannot measure INP at all: “Tools like Lighthouse that load pages in a simulated environment without a user cannot measure INP, as there is no user input.” Lighthouse reports Total Blocking Time instead, which tends to move in the same direction. And because users scroll, click and stay on pages longer than a test run, field CLS is often higher than lab CLS.

The Lighthouse performance score (0–100) is not a Core Web Vitals assessment. A page can score 95 in the lab and still fail in the field, or the other way round. web.dev is clear that lab measurement “is not a substitute for field measurement.”

If your site gets little traffic, CrUX may have no data for it at all. In that case rely on lab data and, if you can, collect your own field data with the open-source web-vitals JavaScript library (real user monitoring, or RUM).

LCP: causes and fixes

“LCP reports the render time of the largest image, text block, or video visible in the viewport, relative to when the user first navigated to the page.” On most pages the LCP element is a hero image, a product photo or the main heading. Lighthouse and DevTools tell you which element it is on your page.

To fix LCP, split it into parts. web.dev says: “Every single page can have its LCP value broken down into these four subparts.”

Diagram · The four LCP subparts
LCP broken down into four subparts A timeline from navigation start to the LCP element being painted, split into time to first byte (about 40%), resource load delay (under 10%), resource load duration (about 40%) and element render delay (under 10%). ~40%~40% <10%<10% Resource load delayElement render delay Time to first byteResource load duration until the image starts loadinguntil it is painted server sends the HTMLdownloading the image Navigation startsLCP element painted
Target shares from web.dev for a well-optimised page; Google calls them “guidelines, not strict rules”.

The two “delay” parts should be close to zero on a well-built page. If either is large, that is where to start.

Time to first byte (TTFB)

The time until the browser receives the first byte of the HTML. Nothing else can start before it. Fixes: full-page caching, a CDN, faster hosting or database queries, and removing redirect chains (each redirect adds a round trip before the real page loads).

Resource load delay

The gap between the first byte and the moment the browser starts downloading the LCP image. It grows when the browser discovers the image late. Fixes:

Resource load duration

How long the image itself takes to download. Fixes: compress it, use AVIF or WebP, serve the right size with srcset and sizes, and deliver it from a CDN. On its own this is not enough: web.dev shows that a smaller image can simply move the waiting time into render delay if the page is blocked elsewhere.

Element render delay

The time between the image finishing and it appearing on screen. Fixes: reduce render-blocking CSS and JavaScript in the <head>, inline the critical CSS, avoid rendering the hero only after a JavaScript framework has loaded, and remove A/B testing or “anti-flicker” scripts that hide the page until they finish. If the LCP element is text, make sure the web font does not keep it invisible.

Code · Hero image, slow vs fast

✕ Delays LCP

<!-- discovered late, loaded late -->
<img src="/img/hero.jpg"
     loading="lazy"
     alt="Running shoes">

/* or hidden in CSS */
.hero { background: url(/img/hero.jpg); }
  • Lazy-loaded LCP image
  • Image only known after CSS loads
  • No dimensions, no priority

✓ Loads early

<img src="/img/hero-800.webp"
     srcset="/img/hero-800.webp 800w,
             /img/hero-1600.webp 1600w"
     sizes="100vw"
     width="1600" height="900"
     fetchpriority="high"
     alt="Running shoes">
  • In the HTML, found immediately
  • High fetch priority, no lazy loading
  • Right size per screen; dimensions set
The right-hand version lets the browser find and prioritise the hero image from the first bytes of HTML.

INP: causes and fixes

INP observes clicks, taps and key presses during the whole visit. Hovering, scrolling and zooming do not count. For each interaction it measures the time until the browser paints the next frame, and “The final INP value is the longest interaction observed, ignoring outliers.” So one slow menu or one slow “Add to cart” button can decide the page's INP.

Every interaction has three phases:

  1. Input delay: the browser is busy with something else and cannot start handling your click yet.
  2. Processing duration: your event handlers run.
  3. Presentation delay: the browser recalculates styles and layout and paints the result.

The common root cause is long tasks on the main thread: blocks of JavaScript that run for more than 50 milliseconds without a break. While one runs, the page cannot respond. Causes and fixes by phase:

Input delay

Usually caused by heavy scripts running while the page loads, or by timers and third-party tags firing in the background. Fixes: load less JavaScript, defer what is not needed for the first view, split large bundles, and audit tag managers, chat widgets and ad scripts. Interactions during page load are often the slowest, so test those too.

Processing duration

Caused by event handlers that do too much. Google's advice: “The best general advice in optimizing event callbacks is to do as little work as possible in them.” Do the visible update first (open the menu, show a spinner) and move the rest, such as analytics calls or saving state, to a separate task. Debounce handlers on inputs that fire often, like typing in a search box.

button.addEventListener('click', () => {
  showMenu();                 // the user sees this immediately
  setTimeout(() => {           // yield, then do the rest
    sendAnalytics();
    saveState();
  }, 0);
});

Presentation delay

Caused by a large DOM, complex CSS selectors and updates that force the browser to redo layout many times. Fixes: keep the number of elements down (paginate long lists, do not render hidden mega-menus in full), avoid reading and writing layout properties in a loop, and update only the part of the page that changed. Pages that render most of their HTML with JavaScript on the client are especially prone to slow interactions.

CLS: causes and fixes

CLS adds up how much visible content moves unexpectedly, and how far. Shifts are grouped into short bursts, and CLS is the score of the worst burst during the visit. Movement the user caused is excluded: “Layout shifts that occur within 500 milliseconds of user input will have the hadRecentInput flag set, so they can be excluded from calculations.” Opening an accordion you clicked does not hurt CLS; a banner that appears on its own and pushes the text down does.

Images and videos without dimensions Very common

The browser does not know how tall the image will be, so it reserves no space and the text jumps when the image arrives. “Always include width and height size attributes on your images and video elements.” With CSS height: auto the image stays responsive, and the browser uses the attributes to reserve the right aspect ratio. CSS aspect-ratio works too.

Ads, embeds and iframes Very common

“Ads, embeds, iframes, and other dynamically injected content can all cause content appearing after them to shift down, increasing your CLS.” Reserve the space in advance with min-height on the slot, sized for the most common ad. Do not collapse an empty slot after the page has rendered.

Content injected above existing content Common

Cookie bars, promo banners, “related posts” blocks or late-loading notices inserted at the top push everything below them. Reserve space, overlay them in a fixed position, or insert them below the content the user is looking at.

Web fonts Common

When the web font replaces the fallback font, text can change width and height and reflow the page. Use font-display: optional, or match the fallback font's size with size-adjust and related descriptors, and preload the main font file.

Animations that change layout Occasional

Animating top, left, width or height moves other elements. Animate with transform and opacity instead, which do not trigger layout shifts.

One more tip from web.dev: make your pages eligible for the back/forward cache (bfcache). A page restored from bfcache appears exactly as the user left it, without any new shifts.

Cheat sheet · Causes and fixes per metric
MetricTypical causeFix
LCPSlow server responsePage caching, CDN, faster hosting, no redirect chains
LCPHero image found late or lazy-loaded<img> in HTML, no loading="lazy", fetchpriority="high", preload if in CSS
LCPHeavy imageCompress, AVIF/WebP, srcset, CDN
LCPRender-blocking CSS/JS, client-side renderingCritical CSS inline, defer scripts, server-render the hero
INPLong tasks during loadLess JavaScript, code splitting, defer third-party tags
INPHeavy event handlersUpdate the screen first, yield, move the rest to later tasks
INPLarge DOM, layout thrashingFewer elements, batched DOM reads and writes
CLSImages or videos without dimensionswidth and height attributes or aspect-ratio
CLSAds, embeds, iframesReserved space with min-height
CLSInjected banners and noticesReserve space, overlay, or insert below the viewport
CLSWeb font swapfont-display: optional, size-adjusted fallback, preload
Most failing pages have one or two of these causes on a shared template, so one fix usually helps many URLs.

Tools: PageSpeed Insights, Search Console, Chrome DevTools

PageSpeed Insights

One URL at a time. The top shows 28-day CrUX field data for the URL and the whole origin, when there is enough traffic. The bottom is a Lighthouse lab run with diagnostics.

Search Console report

The whole site, grouped by similar pages, mobile and desktop separately. Field data only. Use it to find which templates fail and to validate fixes.

Chrome DevTools

The Performance panel shows live LCP, INP and CLS for your own session, the LCP element, its subparts, long tasks and which elements shifted.

Lighthouse

Lab audits in DevTools or the command line. Good for testing a change before release. No INP; use TBT as a guide.

web-vitals library

Small JavaScript library that measures LCP, INP and CLS on real visits and sends them to your analytics. Your own field data, per page view.

CrUX

The public dataset behind the field numbers in Google's tools, also available through an API and BigQuery.

A practical split: Search Console tells you where the problem is, PageSpeed Insights confirms it for a sample URL, and DevTools shows you why.

The Core Web Vitals report in Search Console

The report lives under Experience in Search Console. “The data for the Core Web Vitals report comes from the CrUX report”, so it shows what real visitors experienced over the last 28 days, not a test.

URL groups

“URLs in the report are grouped into pages that have a similar user experience.” Typically these are pages built on the same template, such as all product pages or all blog posts. The status applies to the whole group, and the example URL you see represents the group. If a group has too little data, Search Console falls back to an origin group for the whole protocol://host:port, for example everything under https://example.com.

Diagram · How a URL group gets its status
A URL group's status is its worst metric An illustrative group of product pages has LCP 2.1 seconds (good), INP 260 milliseconds (needs improvement) and CLS 0.31 (poor). The group status is poor, because the worst metric decides. URL GROUP · MOBILE similar pages, one template /product/red-shoe/product/blue-hat/product/… LCP 2.1 s · Good INP 260 ms · Needs improvement CLS 0.31 · Poor GROUP STATUS Poor the worst metric decides 75th percentile, last 28 days (illustrative values)
A group with one poor metric is poor, however good the other two are.

How the report works

Prioritising and validating

Google recommends “fixing everything labeled "Poor" first”, then working through issues by the number of URLs affected or by the importance of the pages. After deploying a fix, click Validate fix (Start tracking): “Click Start Tracking to start a 28-day monitoring session to check for instances of this issue in your site.” If the issue does not appear on any URL during those 28 days, it is marked as fixed. Note that “Start tracking does not trigger re-indexing or any other active behavior from Google.” It only watches the field data.

If many pages change status without any change on your side, look for borderline values: a traffic spike, a slower image server or a shift in your audience's devices can push groups that were just inside “good” over the line.

Check your site's speed and technical health

OurSEO Tools runs a 69-point checklist that includes rendering and speed, plus a technical crawl of up to 1,000 pages with status code, canonical, indexability and load time for every URL.

69-point checklistTechnical crawlContent analysis

Common mistakes

How to improve Core Web Vitals step by step

  1. Open the Search Console report, mobile first, and list the issues labelled Poor with their example URLs.
  2. Map groups to templates. Product pages, category pages, articles: one template usually explains a whole group.
  3. Confirm with PageSpeed Insights on one or two example URLs. Check the field section and note which metric fails.
  4. Diagnose in the lab. Use Lighthouse and the DevTools Performance panel to find the LCP element and its subparts, long tasks during interactions, and the elements that shift.
  5. Fix the template, starting with the cheapest high-impact fixes: image dimensions, removing lazy loading from the hero, fetchpriority, reserved ad space, deferred third-party scripts.
  6. Verify in the lab before and after release, on a throttled mobile profile.
  7. Click Validate fix in Search Console and watch the 28-day field data.
  8. Set up monitoring with the web-vitals library or a RUM tool so regressions from new scripts or features are caught early.

FAQ

Are Core Web Vitals a ranking factor?

Google says “Core Web Vitals are used by our ranking systems.” It also says relevance comes first, and that good scores do not guarantee top rankings. They help most when many pages answer a query equally well.

Does Google use my Lighthouse score?

No. Search relies on field data from real Chrome users (CrUX). Lighthouse is a lab tool for diagnosing problems, and it cannot measure INP at all.

What replaced First Input Delay?

Interaction to Next Paint (INP), since 12 March 2024. It measures all clicks, taps and key presses during a visit, not only the first one, and includes the time until the result is painted.

My site shows “No data available”. Is that a problem?

No. It means CrUX does not have enough visits for your site or device type, or the property is new. Test pages with PageSpeed Insights or Lighthouse and collect your own data with the web-vitals library.

Why does PageSpeed Insights show different numbers from Search Console?

The Search Console report works with groups of similar URLs, while PageSpeed Insights shows a single URL (or the origin if the URL has too little data) and strips parameters. The lab score at the bottom of PSI is a different measurement altogether.

How long until fixes show up?

Field data is a rolling 28-day window, so the numbers improve gradually over about four weeks. Search Console's validation also runs for 28 days.

Sources

Quotes checked against the official pages on 30 October 2026.