BRRH AI Automation
11 min read

How to Improve Core Web Vitals Scores

LCP, INP, and CLS respond to different fixes. Fix LCP first (it is the highest-weighted metric), then INP, then CLS. Here is the short list that gets most sites to passing.

core-web-vitalstechnical-seoperformance
How to Improve Core Web Vitals Scores

You ran PageSpeed Insights, saw a red 47, and now you have no idea which of the fifteen "opportunities" and eight "diagnostics" to touch first. Fixing Core Web Vitals feels like reading a doctor's chart in a language you do not speak.

The good news: there are three metrics that matter, they respond to different fixes, and 80 percent of small-business sites can hit passing scores by working through the same short list.

Key Takeaway: The three Core Web Vitals metrics measure completely different things (loading, responsiveness, visual stability). Do not try to fix them all at once. Fix LCP first — it is the highest-weighted metric and the fixes cascade into INP and CLS improvements.

What each Core Web Vitals metric actually measures

Core Web Vitals are three specific performance metrics Google uses as ranking signals. Each measures a distinct piece of user experience, and the threshold for "Good" is fixed.

MetricMeasuresGood thresholdReal-world meaning
LCP (Largest Contentful Paint)Load speed< 2.5 secondsHow fast the biggest visible element appears
INP (Interaction to Next Paint)Responsiveness< 200 millisecondsHow fast the page reacts to a click or tap
CLS (Cumulative Layout Shift)Visual stability< 0.1How much the page jumps around while loading

INP replaced FID (First Input Delay) as the responsiveness metric on March 12, 2024, per Google's official INP announcement (web.dev, 2024). If any tutorial you find still talks about FID, it is out of date.

Chrome's own developer team walks through the LCP measurement model in more depth here.

Field data vs lab data (and why your Lighthouse score is not what Google uses)

The single most common misunderstanding about Core Web Vitals is that a good Lighthouse score means Google sees a good page. It does not. Google's ranking algorithm reads field data collected from real Chrome users through the Chrome User Experience Report (CrUX). Lighthouse is a lab simulation on your own machine.

A lab test can show 95/100 on a fast laptop while your real users on mid-range Android phones on 4G record LCP times two to three times slower. The CrUX 28-day rolling window is the number that actually matters for ranking. Check it directly in PageSpeed Insights (the "Real user data" panel at the top) or in the Core Web Vitals report inside Google Search Console.

Rule of thumb: your lab (Lighthouse) score should be at least 20 points higher than your target field score to leave headroom for slower devices and networks.

How to fix LCP (Largest Contentful Paint)

LCP is where 80 percent of failing sites live, and it responds to a short list of fixes. Do these in order.

1. Identify the actual LCP element on your page

Open the page in Chrome, open DevTools, go to the Performance panel, click record, reload, stop recording. Look at the "Timings" track for the "LCP" marker. It will highlight the exact element (usually a hero image, headline, or above-fold video poster). You cannot fix LCP without knowing which element you are fixing.

2. Add fetchpriority="high" to that element

If the LCP element is an image, add fetchpriority="high" to the <img> tag. This tells the browser to fetch it before other resources. This one attribute alone often knocks 500 to 1500ms off LCP on image-hero pages, per Google's fetchpriority guidance (web.dev, 2023).

3. Preconnect to the origin serving the LCP element

If your hero image is on a CDN (Vercel Blob, Cloudflare, S3, imgix), add a <link rel="preconnect" href="https://your-cdn.example"> in the document head. The DNS + TLS handshake happens in parallel with HTML parsing instead of serially.

4. Serve LCP images in modern formats at the right size

WebP or AVIF, sized to the actual rendered dimensions plus 2x for retina. A 3000-pixel-wide hero image rendered at 800 pixels wastes bandwidth on every page load. If you are on Next.js, the <Image> component handles both automatically. If you are on WordPress, install a plugin like Imagify or ShortPixel.

5. Do not lazy-load your LCP image

This is the most common self-inflicted LCP wound. loading="lazy" on the hero image defers loading until after LCP measurement completes, and your score drops by 1 to 3 seconds. Above-the-fold images should never carry loading="lazy".

Pro Tip: If you are on Next.js and your hero uses the <Image> component, add the priority prop (equivalent to fetchpriority="high" plus opt-out of lazy-loading). Missing this on the LCP image is the single most common Next.js perf mistake.

How to fix INP (Interaction to Next Paint)

INP measures how long the page's main thread takes to respond to a user interaction. Slow INP almost always means too much JavaScript running when the user clicks or taps.

1. Audit third-party scripts

The biggest INP killers on small-business sites are analytics and pixel scripts loaded synchronously. Facebook Pixel alone can add 150 to 400ms to INP. Move every third-party script to load after page interactive: in Next.js use <Script strategy="lazyOnload">; in Google Tag Manager fire on "Window Loaded" instead of "All Pages" for anything not conversion-critical.

2. Break up long JavaScript tasks

Any single JavaScript task over 50ms blocks user input during its execution. Long tasks show up as red bars in the Performance panel. Common culprits: initial framework hydration (React, Vue), analytics initialization, and third-party widgets. Splitting one 300ms task into six 50ms tasks with setTimeout(0) or scheduler.yield() often fixes INP without removing the underlying work.

3. Use client-side navigation, not full page reloads

Every link that triggers a full document reload also triggers a full round of hydration, script parsing, and rendering. On a Next.js or similar framework site, use the framework's link component (<Link>) so navigation stays client-side.

How to fix CLS (Cumulative Layout Shift)

CLS measures how much content jumps around during page load. Every fix comes down to reserving space for elements before they load.

1. Set explicit width and height on every image and video

Browsers use the aspect ratio (width / height) to reserve space before the image loads. An image without dimensions renders zero-height until it loads, then pushes everything below it down. This is the single largest CLS contributor on most sites.

2. Reserve space for ads, embeds, and iframes

Ad slots and social embeds inject variable-height content asynchronously. Wrap each in a container with a fixed min-height matching the tallest expected variant. The container reserves space; the ad loads inside it without shifting siblings.

3. Use font-display: optional or preload critical fonts

Font swaps cause CLS when the fallback font has different metrics from the web font. Either preload the web font (<link rel="preload" as="font" crossorigin>) so it arrives before first paint, or use font-display: optional so the browser sticks with the fallback if the web font is not ready.

4. Never inject content above existing content

Cookie banners, notification bars, and geo-based promo blocks that render after the page is visible push everything down and rack up CLS. Reserve the space at server-side render or use CSS position: fixed so they overlay rather than displace.

Key Takeaway: CLS is the easiest of the three to fix (add dimensions to images, reserve space for late-loading content) and often the most under-appreciated. A site with LCP at 3.5s and CLS at 0.05 will feel smoother than one with LCP at 2.4s and CLS at 0.25.

The tools you actually need

The stack for measuring and debugging CWV is shorter than most performance blogs will have you believe.

PurposeToolWhy
Real user monitoring (field data)PageSpeed Insights (top panel) or Google Search Console Core Web Vitals reportThis is what Google actually uses for ranking
Lab debuggingChrome DevTools Performance panelShows exactly which element is LCP, which tasks are long, which images shift
Continuous monitoringVercel Speed Insights, Cloudflare Web Analytics, or SpeedCurveWeekly trend visibility so regressions surface before Google's 28-day window catches up
Image optimizationNext.js <Image>, Imagify, or ShortPixelSolves 70 percent of LCP problems on image-heavy sites

Skip paid enterprise APM tools (New Relic, Datadog RUM at $50-$300/mo) unless you have specific compliance or scale requirements. For a site under 100,000 monthly visits, Vercel Speed Insights or Cloudflare Web Analytics gives you the same actionable data for free.

FAQ

How long does it take for Core Web Vitals fixes to affect my rankings?

Google evaluates CWV on a 28-day rolling window of field data from real Chrome users, so ranking impact from a fix does not begin until the improved data starts populating that window. Realistic timeline: fixes go live day one, field data starts reflecting the change in one to two weeks, Google's ranking algorithm has enough new data to shift positions in three to four weeks total. Do not expect same-week ranking movement even from major performance improvements.

Do Core Web Vitals matter more for mobile or desktop rankings?

Mobile CWV are weighted more heavily because Google uses mobile-first indexing (the mobile version of your page is what gets ranked, per Google's Mobile-First Indexing guidance, 2020). If you have to prioritize, fix mobile scores first. Desktop scores matter too, but a passing mobile score with a failing desktop score costs less ranking than the reverse.

What is a good target Lighthouse score if field data is what matters?

Aim for Lighthouse Performance at 90+ on both mobile and desktop as a leading indicator, and specifically LCP under 2.0s in the lab (which typically translates to field LCP under 2.5s). CLS should be 0.05 or lower in lab. INP is only measurable from field data (Lighthouse cannot simulate real user interactions), so use the DevTools Performance panel to check the "Total Blocking Time" metric as a proxy: TBT under 200ms usually predicts passing INP in the field.

Can a slow third-party embed (Calendly, YouTube, chat widget) tank my CWV?

Yes, particularly for INP and LCP. YouTube's default iframe embed loads a ~600KB JavaScript bundle even if the user never clicks play. Replace it with a facade pattern (a lightweight image placeholder that swaps to the real iframe only on click) using a library like lite-youtube-embed. Similar patterns exist for Calendly, Intercom, Drift, and most chat widgets. This one change often drops mobile LCP by a full second on pages with embedded videos or scheduling widgets.

My CWV scores keep fluctuating week to week — is that normal?

Yes, especially for lower-traffic sites. CrUX field data needs a minimum threshold of Chrome users on your URL to publish scores; below that threshold, small changes in visitor device mix (an unusually high share of iPhone SE users on a given week) shift the numbers. Look at the 28-day trend rather than week-to-week noise. If your traffic is under a few thousand monthly visitors, prioritize origin-level CWV (which aggregates across all URLs) over per-page CWV in Search Console.

Where to go from here

Start with the DevTools Performance panel on your slowest page, identify the LCP element, and apply the five LCP fixes in order. That alone will move most small-business sites from failing to passing within one deploy cycle. Come back for INP and CLS once LCP is under 2.5 seconds in the field.

If your content is what is actually holding the site back rather than performance, our guide to structuring blog posts so LLMs actually quote it covers the content-side ranking work that pairs with these performance fixes.

If you would rather have us do the site-speed work and the accompanying custom build, see our web design services for Las Vegas.

GET THE GAME PLAN

Occasional notes on automation and AI — only when something's worth reading.