Blog · SEO

Core Web Vitals: How to Measure and Fix LCP, INP and CLS

What LCP, INP and CLS measure, the thresholds you need at the 75th percentile, why PageSpeed Insights and Search Console disagree, and a fix playbook for each metric based on Google's own guidance, with a worked example.

Searvia · 10/24/2026 · 16 min read

In short: Core Web Vitals are three metrics Google uses to describe real-user experience: Largest Contentful Paint (LCP, loading, good at 2.5 s or less), Interaction to Next Paint (INP, responsiveness, good at 200 ms or less) and Cumulative Layout Shift (CLS, visual stability, good at 0.1 or less). Each is judged at the 75th percentile of real Chrome visits over 28 days, separately for mobile and desktop. Google says they are used by its ranking systems, but relevance comes first. To fix them, break each metric into its parts and fix the largest part first.

Most Core Web Vitals advice is a list of fifty tips. That is why teams spend a sprint on "performance" and see their numbers barely move. The metrics are more structured than that: each one can be split into a few measurable parts, and usually one part is responsible for most of the problem.

This guide covers what the three metrics measure, the thresholds as of October 2026, which data source to trust, what Google actually says about rankings, and a diagnosis-first playbook for each metric, based on Google's own documentation on web.dev.

What Core Web Vitals measure

Per web.dev's Web Vitals overview, the current, stable set has three metrics:

MetricMeasuresGoodNeeds improvementPoor
Largest Contentful Paint (LCP)Loading: when the main content appears≤ 2.5 s2.5 to 4 s> 4 s
Interaction to Next Paint (INP)Responsiveness: how fast the page reacts to input≤ 200 ms200 to 500 ms> 500 ms
Cumulative Layout Shift (CLS)Visual stability: how much content jumps around≤ 0.10.1 to 0.25> 0.25

The thresholds match the table in About PageSpeed Insights.

The 75th percentile rule

Google does not judge a page by its average or by a single test. Web.dev says a good threshold to measure is "the 75th percentile of page loads, segmented across mobile and desktop devices." In plain terms: at least three out of four real visits must meet the "good" threshold. To pass, a page needs a good result at the 75th percentile on all three metrics.

This has two consequences people often miss:

INP replaced FID in 2024

Interaction to Next Paint replaced First Input Delay (FID) as a Core Web Vital on March 12, 2024. FID only measured the delay before the browser started handling the first interaction. INP covers clicks, taps and key presses throughout the whole visit, and the full time until the next frame is painted. Many sites that passed FID easily fail INP, because the slow part was always the work after the first input, which FID never counted. If you still see FID in an old report or plugin, ignore it.

Web.dev also notes that stable Core Web Vitals "won't change more than once per year," and new candidate metrics stay in a pending stage for at least six months first, so you get notice before the rules change.

Field data vs lab data

There are two kinds of performance data, and confusing them is the most common reason teams fix the wrong thing.

Field dataLab data
SourceReal Chrome users (Chrome User Experience Report, CrUX)A simulated page load (Lighthouse, DevTools)
PeriodRolling 28 daysOne test, right now
Measures INP?YesNo (Total Blocking Time as a proxy)
Used by Google Search?This is what the Core Web Vitals assessment usesNo
Best forKnowing whether you have a problemFinding why, and testing a fix before release

A few details from Google's documentation:

The practical rule: field data decides whether you have a problem, lab data helps you find the cause. A Lighthouse score of 98 with poor field LCP means your real users have a worse experience than the simulation, often because of slow devices, ads, personalization or third-party scripts the lab test does not trigger.

How much Core Web Vitals matter for rankings

Google's page experience documentation is clear on both sides:

Our reading: Core Web Vitals will not lift an irrelevant page above a relevant one, but they can matter between pages of similar quality, and they matter directly for users. A product page that takes five seconds to show its photo, or a "Buy" button that freezes for half a second, loses customers regardless of rank. Aim for "good" on all three, then stop chasing points and go back to content.

Step 1: Find out which metric fails, and where

Before changing code:

Our free Core Web Vitals checker gives a fast first read without an account: it pulls the 75th percentile LCP, INP and CLS for phone visitors from CrUX (for the page you enter when Chrome has enough data for it, otherwise for your whole origin), and measures server response time, HTML size, compression, render-blocking scripts in the page head and image formats on that page, your homepage by default.

Step 2: Fix LCP by its four subparts

LCP is the time until the largest image or text block in the viewport is rendered. Eligible elements include <img>, <video>, elements with a CSS url() background image and block-level text (LCP on web.dev). On most product and landing pages it is the hero image.

Optimize LCP splits LCP into four parts that add up to the total:

SubpartWhat it isRough target share
Time to First Byte (TTFB)Until the first byte of HTML arrives~40%
Resource load delayFrom TTFB until the browser starts loading the LCP image< 10%
Resource load durationDownloading the LCP image~40%
Element render delayFrom download finished until the element is painted< 10%

Web.dev calls these proportions "guidelines, not strict rules," but they are very useful for diagnosis. Chrome DevTools' Performance panel shows the breakdown for a recorded load. Whichever part is far over its share is where you start.

High TTFB

TTFB includes redirects, connection setup and server processing. Web.dev's TTFB guide suggests 0.8 seconds or less as a rough target, while noting TTFB is not a Core Web Vital itself.

High resource load delay

This is often the largest subpart and usually the cheapest to fix. The browser could have started the image download earlier but did not know about it.

High resource load duration

High element render delay

The image has arrived, but something stops the browser from painting it:

If LCP is a text block rather than an image, resource load delay and duration are zero, and the problem is TTFB, render-blocking resources or web fonts.

Step 3: Fix INP by its three phases

INP records clicks, taps and key presses during the whole visit (not scrolling or hovering) and reports the slowest interaction, ignoring one outlier for every 50 interactions (INP on web.dev). Each interaction has three phases:

PhaseWhat it isTypical cause when it is slow
Input delayWaiting before the event handler can startOther JavaScript is busy on the main thread
Processing durationRunning your event handlersToo much work in the click handler
Presentation delayFrom handlers done until the next frame is paintedLarge DOM, heavy layout and rendering

The underlying problem is nearly always long tasks: any task that takes longer than 50 milliseconds on the main thread. While a long task runs, the browser cannot respond to the user.

Reduce input delay

Reduce processing duration

Reduce presentation delay

To find the slow interaction, look at real-user data first (which pages fail), then reproduce in Chrome DevTools: record a Performance trace while clicking the suspect element on a throttled CPU, and look for long tasks after the click.

Step 4: Fix CLS cause by cause

CLS adds up unexpected layout shifts. Each shift scores the share of the viewport that moved times how far it moved, shifts are grouped into windows of up to five seconds, and CLS is the worst window (CLS on web.dev). Shifts within 500 ms of a click, tap or key press are excluded, because the user expected them. Scrolling does not count as input, so content that shifts while someone scrolls still counts.

Per Optimize CLS, the usual causes and fixes:

CauseFix
Images and videos without dimensionsAlways set width and height attributes, or CSS aspect-ratio
Ads, embeds and iframesReserve space with min-height or aspect-ratio; keep a placeholder if no ad loads
Content injected late (banners, review widgets, "related products")Reserve space, place it lower on the page, or load it on user action
Web fonts swapping inPreload key fonts, use font-display: optional, or tune the fallback font with size-adjust
Animations of layout properties (top, left, height)Animate transform instead
Pages not restored from the back/forward cacheMake pages bfcache-eligible

Two notes from experience:

Do not forget the back/forward cache

When users press Back, a page restored from the bfcache appears instantly, with no new loading shifts. Web.dev calls bfcache eligibility a highly effective technique for keeping CLS low. The two most common blockers, per web.dev's bfcache guide: unload event listeners (use pagehide instead) and the Cache-Control: no-store header on pages that do not contain sensitive data. Chrome DevTools has a test under Application › Back/forward cache.

A worked example (hypothetical numbers)

The following is a hypothetical example, not real data. Fernwood Home, an invented online furniture store, has a failing Core Web Vitals assessment on mobile for its product page template. The 75th percentile field values:

MetricBeforeStatus
LCP4.6 sPoor
INP340 msNeeds improvement
CLS0.21Needs improvement

LCP: 4.6 s

A DevTools trace on a throttled phone profile shows the LCP element is the main product photo. The breakdown:

SubpartBeforeShareProblem
TTFB1.3 s28%HTML not cached; every campaign link has unique parameters
Resource load delay1.6 s35%Gallery script inserts the photo; loading="lazy" on all images
Resource load duration1.2 s26%2,400-pixel JPEG sent to every phone
Element render delay0.5 s11%Synchronous A/B testing script in the head

Resource load delay is more than three times its target share, so it goes first. The fixes: render the first photo as a plain <img> in the server HTML, remove loading="lazy" from it, add fetchpriority="high", serve AVIF and WebP at phone sizes through srcset, cache the HTML at the CDN while ignoring tracking parameters in the cache key, and load the A/B script with defer.

Lab result after the release: TTFB 0.7 s, load delay 0.2 s, load duration 0.6 s, render delay 0.3 s, for an LCP of 1.8 s.

INP: 340 ms

Field data points to the product page; reproducing in DevTools, the slow interaction is the "Add to cart" button. The trace shows about 90 ms of input delay (a chat widget and two tracking tags running at the same moment), 190 ms of processing (the handler re-renders the whole cart drawer and sends three analytics calls synchronously) and 60 ms of presentation delay.

The fixes: load the chat widget only after the first user interaction, show the cart drawer update first, then yield before analytics and recommendation updates. Lab measurement on the same throttled profile: about 150 ms.

CLS: 0.21

Three causes: a review stars widget inserted above the price after load, a web font swap that rewraps the product title, and thumbnail images without dimensions. The fixes: reserve the review widget's height, preload the title font and adjust the fallback with size-adjust, add width and height to every thumbnail. Lab CLS: 0.04.

Reading the result

The lab numbers confirm the fixes work. The field numbers, which decide the assessment, move as new visits replace old ones in the 28-day window. Fernwood should expect a gradual change over about four weeks, then click Start tracking in Search Console's report to begin validation, which also runs for 28 days. If the field LCP lands at, say, 2.3 s rather than 1.8 s, that is normal: real phones and networks are slower than any lab profile.

Common mistakes

A one-hour starting checklist

Core Web Vitals are one part of technical health. Our technical SEO audit guide puts them in context with crawling, indexing, redirects and structured data.

How Searvia helps with Core Web Vitals

The free Core Web Vitals checker needs no account and gives you the real-user picture for your site in under a minute. Inside Searvia, the Page speed tab of a website project runs PageSpeed Insights on your most visited pages every week and shows both lab scores and real Chrome user data for LCP, INP and CLS from the last 28 days. Fixes are ordered by the time they save, and Write a fix plan for my files with AI turns the top items into step-by-step changes for your stack (3 credits). Connect Search Console to see clicks and positions next to speed, so you can tell whether a faster template actually brought more traffic. The page speed help guide covers setup in about two minutes.

Frequently Asked Questions

What are the Core Web Vitals thresholds?
Largest Contentful Paint (LCP) is good at 2.5 seconds or less and poor above 4 seconds. Interaction to Next Paint (INP) is good at 200 milliseconds or less and poor above 500 milliseconds. Cumulative Layout Shift (CLS) is good at 0.1 or less and poor above 0.25. Google measures each at the 75th percentile of real page loads, separately for mobile and desktop, and a page passes only when all three are good.
Do Core Web Vitals affect Google rankings?
Yes, but modestly. Google states that Core Web Vitals are used by its ranking systems and recommends achieving good scores, but it also says there is no single page experience signal, that it always seeks to show the most relevant content even if page experience is sub-par, and that good scores do not guarantee top rankings. Treat them as a tiebreaker and a conversion issue, not as a replacement for relevant content.
Why are my PageSpeed Insights and Search Console numbers different?
They often show different things. PageSpeed Insights shows field data for one URL (or the whole origin when the URL has too little data) plus a Lighthouse lab test from a single simulated load. Search Console groups similar URLs and gives each group the status of its worst metric. Both use the same Chrome User Experience Report data over the last 28 days, but the lab score is a separate simulation and often differs from what real users experience.
Why doesn't Lighthouse show INP?
INP measures how quickly the page responds to real clicks, taps and key presses, and a simulated page load has no user to interact with it. Google's documentation says lab tools like Lighthouse cannot measure INP and suggests Total Blocking Time as a lab proxy. To see INP, use field data from the Chrome User Experience Report, PageSpeed Insights or Search Console, or record an interaction yourself in Chrome DevTools.
How long does it take for Core Web Vitals fixes to show up?
Field data is a rolling 28-day average, so a fix appears gradually: a few days after deployment the numbers start to move, and the full effect shows after about four weeks. In Search Console, clicking Start tracking on an issue begins a 28-day validation period. Check your lab results right after the deploy to confirm the fix works, then wait for the field data.

Sources

  1. Web Vitals – web.dev
  2. Understanding Core Web Vitals and Google search results – Google Search Central
  3. Understanding page experience in Google Search results – Google Search Central
  4. Interaction to Next Paint becomes a Core Web Vital on March 12 – web.dev
  5. Largest Contentful Paint (LCP) – web.dev
  6. Optimize Largest Contentful Paint – web.dev
  7. Interaction to Next Paint (INP) – web.dev
  8. Optimize Interaction to Next Paint – web.dev
  9. Optimize long tasks – web.dev
  10. Cumulative Layout Shift (CLS) – web.dev
  11. Optimize Cumulative Layout Shift – web.dev
  12. Back/forward cache – web.dev
  13. Time to First Byte (TTFB) – web.dev
  14. The most effective ways to improve Core Web Vitals – web.dev
  15. About PageSpeed Insights – Google for Developers
  16. CrUX API – Chrome for Developers
  17. Core Web Vitals report – Search Console Help

Keep Reading