Permanent SEO
Technical SEO

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

Core Web Vitals work is usually 20% measurement and 80% knowing which fix actually moves each metric. Here's what LCP, INP, and CLS measure, and the fixes with the highest leverage.

MSMehroz Shafique12 min readFact-checked

Core Web Vitals are Google's answer to a hard question: how do you quantify whether a page feels good to use? The answer is three numbers, one for loading, one for responsiveness, one for visual stability, each measured from real Chrome users and each with a published threshold your pages either meet or don't.

As a ranking signal, CWV is real but modest: it functions as a tiebreaker among relevant results, not a substitute for relevance. But the business case doesn't rest on rankings alone. The same milliseconds and layout shifts that fail the thresholds are the ones that suppress conversions and drive abandonment, which is why we treat CWV as a standing workstream in technical SEO rather than a one-off sprint.

This guide explains what each metric actually measures, why field data is the only scoreboard that matters, and the short list of fixes that produce most of the improvement for each metric.

What LCP, INP, and CLS actually measure

Each vital captures one dimension of experience, and each is assessed at the 75th percentile of page loads, meaning at least three-quarters of your real users must have a “good” experience for the page to pass. Averages hide exactly the users you're failing.

MetricMeasuresGoodNeeds improvementPoor
LCP (Largest Contentful Paint)Time until the largest visible text block or image renders≤ 2.5s2.5s – 4.0s> 4.0s
INP (Interaction to Next Paint)Worst-case delay from a user interaction to the next visual update≤ 200ms200ms – 500ms> 500ms
CLS (Cumulative Layout Shift)Total unexpected movement of visible content during the page's life≤ 0.10.1 – 0.25> 0.25

The nuances that change how you debug

  • LCP tracks one element, usually the hero image or headline. Identify which element it is before optimizing anything; teams routinely speed up resources that aren't the LCP element.
  • INP replaced FID in March 2024 and is much harder to pass: FID measured only the first interaction's input delay, while INP measures the full latency of effectively the worst interaction across the entire visit, clicks, taps, and key presses included.
  • CLS only counts unexpected shifts. Movement within 500ms of a user interaction is excluded, so a menu expanding on tap is fine; an ad pushing the paragraph you're reading is not.

Field data vs. lab data: which numbers count

The single most common CWV confusion: a team celebrates a 98 Lighthouse score while Search Console still reports failing URLs. Both are “right”, they measure different things.

  • Field data (real-user monitoring) comes from the Chrome User Experience Report (CrUX): anonymized measurements from actual Chrome users over a trailing 28-day window. This is what the ranking signal uses. You see it in PageSpeed Insights' top panel, Search Console's Core Web Vitals report, and the CrUX API.
  • Lab data comes from tools like Lighthouse and WebPageTest running a simulated load on throttled hardware. It's reproducible and rich in diagnostics, but it can't measure INP at all (no real interactions) and its conditions rarely match your real audience's devices and networks.

The workflow that follows: field data decides what's broken; lab data helps you find out why. Start from Search Console's CWV report to identify failing URL groups, confirm in PageSpeed Insights' CrUX panel, then use lab tools and DevTools traces to locate the cause. After deploying a fix, expect up to 28 days for the field window to fully reflect it.

Fixing LCP: get the hero resource on screen fast

LCP decomposes into four phases, server response (TTFB), resource load delay, resource load time, and render delay. Almost every failing LCP is dominated by one of these, and the fixes map cleanly:

  1. Cut TTFB first. If the HTML takes 1.8s to arrive, no front-end trick can hit 2.5s. Cache rendered HTML at a CDN edge, tune slow server work, and eliminate redirect chains. Target TTFB under ~800ms, ideally far less.
  2. Make the LCP resource discoverable immediately. The browser should learn about the hero image from the initial HTML, not after CSS or JavaScript executes. Background-image CSS heroes and client-side-rendered heroes are classic late-discovery failures.
  3. Prioritize it explicitly. Preload the hero and mark it high priority; never lazy-load the LCP element (lazy-loading above-the-fold images is one of the most common self-inflicted LCP wounds).
  4. Shrink it. Serve modern formats (AVIF/WebP) at the actual rendered size via responsive images, from a CDN close to users.
  5. Unblock rendering. Inline critical CSS, defer non-critical scripts, and use font-display: swap so text-based LCP elements don't wait on webfonts.
html
<!-- Discoverable, prioritized, never lazy -->
<link rel="preload" as="image" href="/hero.avif" fetchpriority="high">

<img src="/hero.avif" fetchpriority="high" decoding="async"
     width="1200" height="630" alt="Product dashboard">

Platform note: on template-driven platforms the same fixes apply but the levers differ, app scripts and theme bloat dominate on Shopify, plugins and unoptimized media on WordPress. We cover the platform-specific versions in our Shopify SEO guide and WordPress SEO guide.

Fixing INP: break up the JavaScript

INP is high when the browser's main thread is too busy to respond to the user. The cause is nearly always JavaScript: long tasks that block input handling, heavy event handlers, and excessive DOM updates after an interaction. The leverage points, in order:

  1. Find the slow interactions in the field. Use RUM or the web-vitals library's attribution build to see which elements and scripts are behind your worst interactions, then reproduce them in DevTools' performance panel with CPU throttling on.
  2. Break up long tasks. Any task over 50ms blocks interaction. Chunk big loops and defer non-visual work with scheduler.yield() or setTimeout so the browser can paint between chunks.
  3. Do less on interaction. In the handler itself, do only what's needed to update the UI; push analytics, logging, and state syncing to after the next paint.
  4. Ship less script. Audit third-party tags ruthlessly, tag managers accumulate scripts nobody owns, and code-split so pages load only the JavaScript they use.
  5. Tame rendering cost. Huge DOM sizes and layout-triggering reads inside handlers inflate the “next paint” half of INP. Keep DOM under control and batch style reads/writes.

Fixing CLS: reserve space for everything

Layout shift has one root cause: content rendering without its space being reserved, then pushing everything else when it arrives. The fix is a discipline, not a trick, every late-arriving element gets its dimensions declared up front:

  • Images and video: always set width and height attributes (or CSS aspect-ratio) so the browser reserves the box before the file loads.
  • Ads and embeds: wrap them in fixed-size containers sized to the most common creative; an empty reserved slot is infinitely better than a shift.
  • Dynamic content: never inject banners, notices, or recommendation units above content the user is already reading, insert below the viewport or in reserved space.
  • Webfonts: use font-display: swap with metric-compatible fallback fonts (size-adjust) so the swap doesn't reflow the page.
  • Animations: animate with transform, never with top/left/height, which trigger layout for everything nearby.

Users forgive a page that loads in three seconds. They don't forgive tapping “Cancel” because the button moved under their thumb, and neither does the CLS score.

Once all three metrics are green, protect them: add performance budgets to CI, re-run the checks whenever templates or tags change, and fold CWV review into your recurring SEO audit process alongside the rest of the technical SEO checklist. Regressions arrive with releases, not with algorithm updates.

Key takeaways

  • Core Web Vitals are three user-experience metrics with hard thresholds: LCP ≤ 2.5s (loading), INP ≤ 200ms (responsiveness), CLS ≤ 0.1 (visual stability), judged at the 75th percentile of real users.
  • Only field data (CrUX) counts for the ranking signal; lab tools like Lighthouse are for diagnosis, not scorekeeping. A perfect Lighthouse score can coexist with failing field data.
  • Most LCP failures come down to a late-discovered or unprioritized hero resource plus slow server response, fix TTFB, preload the LCP image, and never lazy-load it.
  • INP replaced FID because it measures every interaction, not just the first: the fix is almost always breaking up long JavaScript tasks and shedding unused script.
  • CLS is an engineering discipline: reserve space for every image, ad, embed, and late-loading element, and never insert content above what the user is reading.

Frequently asked questions

How much do Core Web Vitals affect rankings?

They're a real but modest signal, Google describes page experience as a tiebreaker among results of similar relevance, not a primary factor. The larger business impact is usually direct: better vitals measurably improve conversion, engagement, and abandonment, independent of any ranking movement.

What replaced FID, and why is INP harder to pass?

INP replaced First Input Delay in March 2024. FID measured only the input delay of the first interaction; INP measures the full click-to-paint latency of effectively the worst interaction across the whole visit. Many sites that comfortably passed FID fail INP, usually due to long JavaScript tasks.

Why does Search Console still show failing URLs after I fixed the problem?

Field data is a trailing 28-day window of real-user measurements, so improvements phase in gradually as new sessions replace old ones. Verify the fix immediately with lab tools and your own RUM, then use Search Console's “Validate fix” and expect up to a month for full confirmation.

Should I optimize for Lighthouse scores?

No, optimize field metrics and use Lighthouse for diagnosis. The Lighthouse performance score is a lab simulation that can disagree with real-user data in both directions, and it can't measure INP at all. A page can score 95+ in Lighthouse and still fail the actual assessment in CrUX.

Which metric should I fix first?

Whichever fails in field data for your highest-value templates, but if several fail, LCP usually comes first because its fixes (TTFB, resource priority, image delivery) often improve everything else too. CLS fixes are typically the cheapest engineering-wise, so they make good parallel quick wins.

MS
Mehroz Shafique

Founder & Semantic SEO Lead · Permanent SEO

Writes about entity SEO, topical authority, and how modern and AI-powered search actually rank content.

View full profile

Ready to build permanent rankings?

Book a free strategy call and we'll map your fastest path to durable search authority.