Skip to main content
Back to Blog

Core Web Vitals and SEO: What Actually Moves Rankings

Core Web Vitals became a ranking factor in 2021, but how much do they actually matter? A clear-eyed look at LCP, INP, and CLS — what the data shows, what to prioritize, and where performance optimization meets diminishing returns.

By Dynamic SEO TeamPublished March 12, 202612 min read
A performance dashboard showing LCP, INP, and CLS metrics with green passing scores

Google introduced Core Web Vitals as a ranking signal in June 2021. Since then, the SEO community has oscillated between treating them as the single most important ranking factor and dismissing them as irrelevant. Neither position is correct. The reality is more nuanced, and understanding where performance optimization actually matters — and where it does not — is essential for making good decisions about where to spend your time.

This article breaks down each metric, examines what the ranking data actually shows, and provides practical guidance for optimization that delivers real returns.

What Core Web Vitals Are

Core Web Vitals are a set of three metrics that Google uses to measure the user experience of a web page. They focus on loading performance, interactivity, and visual stability. As of March 2024, the three metrics are:

  • Largest Contentful Paint (LCP) — measures loading performance
  • Interaction to Next Paint (INP) — measures interactivity (replaced First Input Delay in March 2024)
  • Cumulative Layout Shift (CLS) — measures visual stability

These metrics are collected from real users through the Chrome User Experience Report (CrUX), which means they reflect actual field performance, not synthetic lab tests. This distinction matters: your Lighthouse score is useful for debugging, but Google uses real-world data for ranking decisions.

Largest Contentful Paint (LCP)

LCP measures how long it takes for the largest visible content element to render on screen. This is typically a hero image, a large text block, or a video poster. It captures the moment when a user can see the main content of the page.

Thresholds

| Rating | Time | |---|---| | Good | 2.5 seconds or less | | Needs Improvement | 2.5 to 4.0 seconds | | Poor | More than 4.0 seconds |

What Causes Poor LCP

The most common causes of poor LCP are slow server response times, render-blocking JavaScript and CSS, slow resource load times for images and fonts, and client-side rendering that delays the main content.

Server response time is often the single largest contributor. If your Time to First Byte (TTFB) is already at 1.5 seconds, you have very little room left to hit the 2.5-second LCP threshold regardless of what else you optimize.

How to Improve LCP

Optimize server response time. Use a CDN, implement server-side caching, and ensure your hosting infrastructure can handle your traffic. If you are on shared hosting with a heavy CMS, this is often the bottleneck.

Eliminate render-blocking resources. Inline critical CSS, defer non-critical JavaScript, and use async or defer attributes on script tags. Every synchronous resource in the <head> delays rendering.

Optimize images. Use modern formats like WebP or AVIF, implement responsive images with srcset, and add fetchpriority="high" to your LCP image. Lazy loading is good for below-the-fold images but should never be applied to the LCP element.

Preload critical resources. Use <link rel="preload"> for the LCP image or font if the browser cannot discover it early in the HTML parsing process. This is particularly important for CSS background images and images referenced inside JavaScript components.

Interaction to Next Paint (INP)

INP replaced First Input Delay (FID) as a Core Web Vital in March 2024. While FID only measured the delay before the browser could begin processing the first user interaction, INP measures the entire lifecycle of all interactions throughout the page visit and reports the worst one (with some statistical smoothing).

This is a significantly harder metric to pass. FID was easy — most sites scored well because it only measured input delay, not processing time or rendering time. INP captures all three phases: the input delay, the processing time of event handlers, and the time to present the next frame.

Thresholds

| Rating | Time | |---|---| | Good | 200 milliseconds or less | | Needs Improvement | 200 to 500 milliseconds | | Poor | More than 500 milliseconds |

What Causes Poor INP

The primary cause of poor INP is JavaScript. Specifically: long tasks on the main thread that block the browser from responding to user input, expensive event handlers that take too long to process, and forced synchronous layouts or style recalculations triggered by DOM manipulation.

Third-party scripts are frequent offenders. Analytics libraries, chat widgets, consent management platforms, and advertising scripts all compete for main thread time. A page that loads six third-party scripts may have perfectly reasonable code of its own yet still fail INP because the accumulated weight of external JavaScript creates long tasks.

How to Improve INP

Break up long tasks. Use requestAnimationFrame, setTimeout, or the scheduler.yield() API to break expensive operations into smaller chunks that give the browser opportunities to process user input between them.

Reduce JavaScript execution time. Audit your bundles. Remove unused code. Consider whether every library you ship is necessary. A 500KB JavaScript bundle that initializes on page load is a direct tax on interactivity.

Minimize event handler work. Keep click, scroll, and input handlers lean. If an interaction triggers complex data processing or DOM manipulation, defer the expensive parts so the browser can paint the immediate visual feedback first.

Evaluate third-party scripts. Load non-essential scripts with async and consider delaying their initialization until after user interaction. If a chat widget is not used by 95% of visitors, there is no reason to load it eagerly for everyone.

Cumulative Layout Shift (CLS)

CLS measures how much the page layout shifts unexpectedly during its lifetime. Every time a visible element moves from one rendered frame to the next without being triggered by a user interaction, the browser calculates a layout shift score based on how much of the viewport was affected and how far the element moved. CLS is the sum of the largest burst of such shifts.

Thresholds

| Rating | Score | |---|---| | Good | 0.1 or less | | Needs Improvement | 0.1 to 0.25 | | Poor | More than 0.25 |

What Causes Poor CLS

Images and iframes without explicit dimensions are the most common culprit. When the browser initially lays out the page, it does not know how tall these elements will be, so it allocates zero space. When the resource loads, everything below it shifts down.

Web fonts that cause a flash of invisible text (FOIT) or flash of unstyled text (FOUT) are another common source. When the custom font loads and replaces the fallback, text can reflow, causing shifts.

Dynamically injected content — ads, banners, cookie consent bars, and late-loading components — frequently cause layout shifts because they insert themselves into the page flow after the initial render.

How to Improve CLS

Always set explicit dimensions on images and videos. Use the width and height HTML attributes or CSS aspect-ratio to reserve space before the resource loads.

Use font-display: swap with matched fallback fonts. The size-adjust, ascent-override, and descent-override CSS descriptors let you match your fallback font's metrics to your web font, minimizing reflow when the swap occurs.

Reserve space for dynamic content. If you inject ads or banners, use min-height on the container so the surrounding content does not shift. For content that loads asynchronously, show a skeleton or placeholder of the correct dimensions.

Avoid inserting content above existing content. This is a design-level decision: banners and notifications should push content down from a fixed-height reserved area or overlay existing content rather than reflowing the entire page.

How Much Do Core Web Vitals Actually Affect Rankings?

This is the question that matters most, and the honest answer is: less than most performance-focused content would have you believe.

Multiple large-scale ranking studies — from Semrush, Ahrefs, Backlinko, and others — have consistently found that Core Web Vitals have a measurable but small correlation with rankings. The effect is most accurately described as a tiebreaker. When two pages have similar content relevance, backlink profiles, and topical authority, the page with better Core Web Vitals may rank slightly higher.

But content relevance, backlink quality, search intent match, and domain authority remain far more influential. A page with excellent content and poor CWV scores will almost always outrank a page with mediocre content and perfect CWV scores.

Google has been relatively transparent about this. Their own documentation describes page experience as one signal among many, and they have explicitly stated that great page experience does not override having great content.

The Real Value of CWV Optimization

If CWV are a minor ranking signal, why bother? Because the real payoff is not in rankings — it is in user behavior.

Faster pages have higher conversion rates. This is consistently demonstrated across industries. Amazon's frequently cited finding that every 100ms of latency costs 1% of sales may be specific to their scale, but the principle holds broadly. Users are more likely to engage with, buy from, and return to sites that feel fast and stable.

Reducing CLS makes your site feel more professional and trustworthy. Improving INP makes interactions feel immediate and responsive. Cutting LCP makes first impressions stronger. These improvements compound into better engagement metrics — lower bounce rates, longer sessions, more page views — which indirectly benefit SEO through better user signals.

The business case for CWV optimization is user experience first, SEO second.

Measuring Core Web Vitals

Field Data (What Google Uses)

Chrome User Experience Report (CrUX) is the definitive data source. It collects anonymized performance data from Chrome users who have opted in to usage statistics. You can access it through the CrUX API, BigQuery, or the CrUX Dashboard.

Google Search Console includes a Core Web Vitals report that groups your pages by status (good, needs improvement, poor) and shows trends over time. This is the most accessible way to see how Google perceives your site's performance.

PageSpeed Insights combines CrUX field data with Lighthouse lab data for a single URL. The field data section at the top is what matters for rankings; the lab data below is useful for diagnostics.

Lab Data (For Debugging)

Lighthouse (in Chrome DevTools, as a CLI, or via PageSpeed Insights) runs synthetic tests that are useful for identifying specific issues. Lab data does not represent real user experience, but it helps you find and fix problems.

The web-vitals JavaScript library lets you collect CWV data from your own users and send it to your analytics platform. This gives you more granular data than CrUX and lets you segment by device, connection type, geography, and page type.

import { onLCP, onINP, onCLS } from 'web-vitals';

onLCP(metric => sendToAnalytics('LCP', metric));
onINP(metric => sendToAnalytics('INP', metric));
onCLS(metric => sendToAnalytics('CLS', metric));

The Diminishing Returns Curve

Not all performance improvements are equal. The relationship between Core Web Vitals scores and their impact follows a clear diminishing returns pattern.

Going from poor to good is high-impact. If your LCP is 6 seconds, cutting it to 2.5 seconds dramatically improves user experience and moves you from the penalty zone into the neutral-to-positive zone for rankings. This is where optimization effort has the highest return.

Going from good to excellent has minimal additional impact. If your LCP is already at 2.2 seconds, spending engineering resources to reduce it to 1.5 seconds will produce negligible ranking benefit and only marginal user experience improvement. Those engineering hours are almost certainly better spent on content, features, or other areas.

The practical implication is clear: aim for the "good" threshold on all three metrics and then move on. Chasing perfect scores is an inefficient use of resources unless you have already exhausted higher-impact optimization opportunities.

Metadata Optimization and Performance

One often-overlooked aspect of page performance is the weight of SEO tooling itself. Client-side SEO solutions that inject metadata, structured data, and tracking scripts via JavaScript add to the page's JavaScript bundle, increase main thread work, and can directly worsen INP and LCP scores.

The most performance-friendly approach to metadata management is server-side rendering. When meta tags, Open Graph tags, and structured data are included in the initial HTML response, they add negligible weight — a few hundred bytes of HTML that the browser parses efficiently. No JavaScript execution is required.

This is one area where the choice of SEO tooling has a direct impact on Core Web Vitals. A metadata management system that generates lightweight, server-rendered HTML tags will always outperform one that relies on client-side JavaScript injection. For sites where performance is a concern — which, at this point, should be most sites — this distinction matters.

Template-based metadata management, where meta tags are computed once and served as static HTML, represents the ideal balance: dynamic, customizable metadata with zero client-side performance cost.

What to Do Next

If you have not looked at your Core Web Vitals data recently, start with Google Search Console. It will tell you whether you have a problem and which pages are affected.

If you are in the "poor" range on any metric, prioritize getting to "good." Focus on the metric that affects the most pages first. For most sites, LCP is the metric with the most room for improvement because it is heavily influenced by server performance and image optimization — both of which tend to have site-wide impact.

Focus your optimization effort where it matters: fix LCP issues on your top 20 landing pages first, then address INP on interactive pages. If your CWV scores are already 'good,' stop optimizing performance and invest that time in content and metadata instead. Diminishing returns are real.

Share

Related Articles