Core Web Vitals became a confirmed Google ranking signal in 2021. In 2024, INP replaced FID as the third metric. In 2025, sites that fail CWV thresholds are at a measurable disadvantage against competitors who pass them — particularly on mobile, where Google uses field data from real users to determine ranking eligibility.
This guide covers all three CWV metrics in depth: what they measure, how to diagnose failures, and the exact fixes that move the needle — ordered from highest to lowest impact.
Understanding the Three CWV Metrics
Each metric measures a different dimension of page experience. All three use field data — real measurements from Chrome users — not lab simulations. This distinction matters: you can score 95 on PageSpeed Insights and still fail CWV in GSC if your real users are on slow connections or low-end devices.
PageSpeed Insights shows lab data (simulated) and field data (real CrUX data). Google's ranking signal uses field data only. If your page has insufficient field data (low traffic), Google falls back to lab data. Always check your GSC Core Web Vitals report — not just PageSpeed Insights — to see what Google is actually measuring for your site.
Fixing LCP — Largest Contentful Paint
LCP measures how long it takes for the largest visible element on the page to fully render. On most pages, this is the hero image, H1 heading, or above-the-fold video. LCP is the most impactful CWV fix — it has the strongest correlation with ranking changes after Google updates.
Step 1: Identify your LCP element
Open Chrome DevTools → Performance tab → Record a page load → Look for the "LCP" marker in the timeline. Or use PageSpeed Insights → "Diagnostics" → "Largest Contentful Paint element." The most common LCP elements are: hero images, H1 tags, and above-fold background images.
Step 2: Apply fixes in priority order
- 1Preload the LCP image
Add this in <head> — it's the single highest-impact LCP fix for most sites with an image LCP element.
- 2Convert images to WebP or AVIF
30–50% smaller file sizes with no visible quality loss. Use Squoosh.app for manual conversion or set up server-side conversion with a CDN.
- 3Eliminate render-blocking resources
CSS and JS in <head> that block rendering delay when the browser first paints anything. Inline critical CSS and use
deferorasyncon non-critical scripts. - 4Reduce server response time (TTFB)
TTFB directly feeds into LCP. If TTFB is above 800ms, no amount of frontend optimization will get LCP under 2.5s. Move to a faster host, add a CDN, or implement server-side caching.
- 5Don't lazy-load the LCP image
A common mistake: adding
loading="lazy"to the hero image. This tells the browser to delay loading the image — directly killing LCP. Only lazy-load images below the fold.
<link rel="preload" as="image" href="/images/hero.webp"
imagesrcset="/images/hero-480.webp 480w,
/images/hero-800.webp 800w,
/images/hero.webp 1200w"
imagesizes="100vw" />
Fixing INP — Interaction to Next Paint
INP replaced FID (First Input Delay) in March 2024. It measures the responsiveness of your page to all interactions throughout the page's lifetime — clicks, taps, and key presses. A page with high INP feels sluggish and unresponsive. The culprit is almost always JavaScript blocking the main browser thread.
How to diagnose high INP
Open Chrome DevTools → Performance tab → Enable "Web Vitals" → Interact with the page (click buttons, open menus, use forms) → Look for long tasks (red blocks) in the "Main" thread. Any task blocking the main thread for more than 50ms contributes to high INP.
Fixes for high INP
- Break up long JavaScript tasks: Use
setTimeout,requestIdleCallback, or the Scheduler API to split long tasks into smaller chunks that yield to the main thread between executions. - Defer non-critical third-party scripts: Analytics, chat widgets, A/B testing tools, and ad scripts all compete with user interactions for main thread time. Load them after the page is interactive.
- Reduce JavaScript bundle size: Use code-splitting and tree-shaking in your build tool to avoid shipping unused code. Every kilobyte of JS that doesn't need to parse improves INP.
- Avoid forced synchronous layouts: Reading layout properties (offsetHeight, getBoundingClientRect) inside event handlers triggers layout recalculation and inflates INP.
- Use web workers for heavy computation: Move data processing, sorting, and filtering off the main thread into web workers so user interactions remain responsive.
The fastest INP improvement on most sites is removing or deferring one heavy third-party script. Open Chrome DevTools → Network tab → reload the page → sort by size → identify the largest JS files from third-party origins (analytics, tag managers, chat widgets). Each one you defer after page load directly reduces INP.
Fixing CLS — Cumulative Layout Shift
CLS measures visual stability — how much page content unexpectedly shifts during loading. A high CLS score means buttons move after you tap them, text jumps as you're reading, or form fields shift when ads load. It's a UX nightmare and a confirmed ranking penalty.
Most common causes of CLS
- 1Images without width and height attributes
The most common cause of CLS. When a browser doesn't know an image's dimensions before loading it, it reserves zero space — then the page shifts when the image loads. Fix: always add explicit width and height to every <img> tag.
- 2Web font swap (FOUT / FOIT)
When a custom font loads after the page renders, it can cause text to reflow if the fallback font has different metrics. Fix: use
font-display: optionalorfont-display: swapwith a closely matched fallback font, or preload critical fonts. - 3Dynamically injected content
Ad slots, cookie banners, and newsletter popups injected above existing content push everything down. Fix: pre-reserve space for ads (min-height on ad containers), and show banners as overlays rather than pushing content.
- 4Animations using top/left instead of transform
Animating position properties triggers layout recalculation and contributes to CLS. Use CSS
transformandopacityfor animations — they run on the compositor thread and don't trigger layout.
<!-- ❌ No dimensions — causes CLS --> <img src="product.jpg" alt="Product name"> <!-- ✅ Explicit dimensions — prevents CLS --> <img src="product.jpg" alt="Product name" width="800" height="600"> <!-- ✅ Responsive with aspect ratio preserved --> <img src="product.jpg" alt="Product name" width="800" height="600" style="width:100%;height:auto;">
How to Check Your CWV Status Right Now
- 1Google Search Console → Core Web Vitals
This is your primary source of truth. Shows field data from real Chrome users, broken down by mobile and desktop, with specific failing URL groups. Start here — not PageSpeed Insights.
- 2PageSpeed Insights (pagespeed.web.dev)
Shows both field data (if available) and lab data. Use the "Opportunities" section for specific, actionable fixes with estimated time savings. Run every key page template — homepage, product page, blog post.
- 3Chrome DevTools → Performance
For deep diagnosis of INP and LCP. Record a page load while interacting with the page. The flame chart shows exactly which JavaScript functions are consuming main thread time.
- 4Web Vitals Chrome Extension
Displays real-time CWV metrics as you browse. Useful for quickly checking CWV status on any page without opening DevTools. Shows LCP element, CLS sources, and INP on interaction.
CWV After Fixing: What to Expect
After making CWV fixes, the field data in GSC takes 28 days to fully update — this is the rolling average window Google uses. Don't panic if you don't see immediate improvement in GSC. Track your lab scores in PageSpeed Insights as a leading indicator while field data catches up.
Ranking recovery after CWV improvement typically follows this timeline:
- Days 1–14: Technical fixes deployed, lab scores improve immediately
- Days 14–28: Field data in GSC begins reflecting improvements
- Days 28–60: GSC CWV report updates to "Good" status, ranking signals update
- Days 60–90: Rankings begin recovering for pages that were penalised
Get a Core Web Vitals Audit
We diagnose your LCP, INP, and CLS failures and deliver a developer-ready fix list with estimated ranking impact for each issue.
Get My Free Audit → Takes 2 minutes. No credit card. Response within 24 hours.