SEO11 min read

Core Web Vitals 2026: INP, LCP & CLS Optimization

Master Core Web Vitals in 2026 with actionable fixes for INP, LCP, and CLS. Performance benchmarks, debugging tools, and optimization strategies.

Digital Applied Team
February 15, 2026
11 min read
43%

Sites Failing INP Threshold

2.5s

LCP Good Threshold

0.1

CLS Good Threshold

24%

Lower Bounce Rate (Passing Sites)

Key Takeaways

INP replaced FID as the responsiveness metric: Interaction to Next Paint measures the full lifecycle of an interaction, not just input delay. 43% of sites still fail the 200ms threshold, making INP the most commonly failed Core Web Vital in 2026.
LCP under 2.5 seconds requires systematic optimization: Image preloading, critical CSS inlining, font preloading with display swap, and server-side rendering are the four highest-impact fixes for slow LCP scores.
CLS below 0.1 demands explicit dimensions everywhere: Every image, video, iframe, and ad slot needs explicit width and height attributes. Font-display swap and reserved space for dynamic content eliminate the remaining layout shift sources.
Passing all three metrics correlates with 24% lower bounce rates: Sites that pass all Core Web Vitals thresholds see measurable ranking improvements in organic search plus lower bounce rates and higher engagement metrics.
Real user monitoring beats synthetic testing: Chrome User Experience Report (CrUX) data drives Google rankings, not Lighthouse scores. Set up Real User Monitoring to track the metrics Google actually uses for your page experience signal.

Core Web Vitals have been a Google ranking signal since 2021, but the landscape shifted fundamentally in March 2024 when Interaction to Next Paint (INP) permanently replaced First Input Delay (FID). Two years later, the data tells a sobering story: 43% of websites still fail the INP threshold of 200 milliseconds, making it the most commonly failed Core Web Vital across the web. Meanwhile, LCP and CLS optimization gaps persist even on sites that have been actively working on performance.

This guide covers all three Core Web Vitals in depth — what each metric measures, why sites fail, how to debug issues, and the specific code-level fixes that bring your scores from red to green. Whether you are running a Next.js application, a WordPress site, or a custom React build, the optimization strategies here translate directly to your stack with concrete examples and performance budgets you can implement today.

Core Web Vitals in 2026: What Changed

The most significant change to Core Web Vitals happened in March 2024 when INP officially replaced FID. First Input Delay only measured the delay before the browser could begin processing the very first interaction on a page — a single data point that told you almost nothing about the overall responsiveness of a user's experience. INP captures every interaction (clicks, taps, key presses) throughout the full page lifecycle and reports the worst interaction at the 75th percentile, making it far harder to game and far more representative of actual user experience.

MetricGoodNeeds ImprovementPoor
INP (Interaction to Next Paint)≤ 200ms200-500ms> 500ms
LCP (Largest Contentful Paint)≤ 2.5s2.5-4.0s> 4.0s
CLS (Cumulative Layout Shift)≤ 0.10.1-0.25> 0.25

Current Pass Rates Across the Web

Based on the Chrome User Experience Report (CrUX) data as of early 2026, the pass rate picture reveals where the web still struggles. CLS has the highest pass rate because explicit dimensions are a straightforward fix. LCP sits in the middle — it requires infrastructure-level changes like CDN configuration and server-side rendering. INP has the lowest pass rate because fixing it demands deep JavaScript architecture changes that many teams are not equipped to make quickly.

57%

INP Pass Rate

43% of origins fail the 200ms threshold

68%

LCP Pass Rate

32% of origins exceed the 2.5s threshold

78%

CLS Pass Rate

22% of origins exceed the 0.1 threshold

The ranking impact is cumulative. Sites passing all three Core Web Vitals see measurably better organic performance than sites failing even one metric. Google evaluates page experience at the URL group level using CrUX data, meaning poor performance on high-traffic pages can drag down rankings for your entire site. For a comprehensive technical SEO audit that includes Core Web Vitals, see our SEO optimization services.

INP Deep Dive: Interaction to Next Paint

INP measures the full lifecycle of a user interaction — from the moment the user clicks, taps, or presses a key to the moment the browser paints the visual result of that interaction. This includes three distinct phases: input delay (time waiting for event handlers to start), processing time (time spent executing event handlers), and presentation delay (time from handler completion to the next paint). The reported INP value is the worst interaction at the 75th percentile across a user's session.

Phase 1: Input Delay
Time before event handlers begin executing

Input delay occurs when the main thread is busy executing other JavaScript when the user interacts. Long tasks from third-party scripts, analytics initialization, or framework hydration block the main thread, delaying the start of your event handler. This phase is the most common cause of high INP scores.

Fix: Break up long tasks, defer non-critical scripts, use requestIdleCallback for low-priority work.

Phase 2: Processing Time
Time spent executing event handler callbacks

Processing time covers the actual execution of your click, keypress, or tap event handlers. Expensive DOM reads and writes, synchronous state updates, complex calculations, and forced layout reflows inside handlers all contribute to high processing time. Every millisecond spent in an event handler is a millisecond the user waits for visual feedback.

Fix: Minimize DOM mutations in handlers, use requestAnimationFrame for visual updates, batch state changes.

Phase 3: Presentation Delay
Time from handler completion to the next paint

Presentation delay is the time between when your event handlers finish and when the browser actually renders the updated pixels on screen. Large DOM trees, complex CSS selectors, and excessive rendering work (layout, paint, composite) contribute to this phase. Sites with deeply nested DOM structures often have high presentation delay even with fast event handlers.

Fix: Reduce DOM size, simplify CSS selectors, use content-visibility: auto for off-screen content.

Common INP Offenders

The majority of INP failures trace back to a handful of root causes. Heavy third-party scripts are the most common — analytics platforms, chat widgets, ad scripts, and social embeds all compete for main thread time during interactions. The second most common cause is framework hydration, where JavaScript frameworks re-render the entire component tree after initial load, creating long tasks that block user interactions.

// BAD: Synchronous DOM manipulation in click handler
button.addEventListener('click', () => {
  // Forces layout recalculation (layout thrashing)
  const height = element.offsetHeight;
  element.style.height = height + 100 + 'px';

  // Synchronous loop blocking the main thread
  for (let i = 0; i < items.length; i++) {
    document.getElementById('item-' + i).classList.add('active');
  }
});

// GOOD: Batched async updates with requestAnimationFrame
button.addEventListener('click', () => {
  // Yield to the browser between frames
  requestAnimationFrame(() => {
    element.style.height = element.offsetHeight + 100 + 'px';
  });

  // Batch DOM updates
  requestAnimationFrame(() => {
    const fragment = document.createDocumentFragment();
    for (const item of items) {
      item.classList.add('active');
    }
  });
});

Debugging INP With Chrome DevTools

Chrome DevTools provides the most detailed INP debugging workflow. Open the Performance panel, enable "Web Vitals" in the settings, and record a session where you interact with the page. Each interaction appears as a marker in the timeline. Click on the INP marker to see the three phases (input delay, processing, presentation) broken down individually, along with the specific event handlers that ran during the interaction.

// Use the Web Vitals library to log INP attribution in production
import { onINP } from 'web-vitals/attribution';

onINP((metric) => {
  console.log('INP value:', metric.value, 'ms');
  console.log('INP element:', metric.attribution.interactionTarget);
  console.log('Input delay:', metric.attribution.inputDelay, 'ms');
  console.log('Processing:', metric.attribution.processingDuration, 'ms');
  console.log('Presentation:', metric.attribution.presentationDelay, 'ms');

  // Send to your analytics endpoint
  navigator.sendBeacon('/api/analytics/web-vitals', JSON.stringify({
    metric: 'INP',
    value: metric.value,
    page: window.location.pathname,
    attribution: metric.attribution,
  }));
});

LCP Optimization Strategies

Largest Contentful Paint measures the time from navigation to when the largest visible content element finishes rendering — typically a hero image, heading text, or background image. The 2.5-second threshold sounds generous, but reaching it consistently across mobile devices on 3G/4G networks requires deliberate optimization at every layer: server response time, resource delivery, rendering pipeline, and client-side JavaScript execution.

What Triggers LCP

LCP Element TypeFrequencyPrimary Fix
<img> element~72% of pagesPreload, optimize format, responsive sizes
Text block (h1, p)~18% of pagesFont preload, critical CSS inline
Background image (CSS)~7% of pagesPreload, convert to img tag
Video poster image~3% of pagesPreload poster, use img fallback

High-Impact LCP Fixes

1. Preload the LCP Image
Reduces LCP by 200-800ms on average

The LCP image is often discovered late because the browser must first download HTML, parse CSS, and discover the image reference. Adding a preload hint in the document head tells the browser to start fetching the image immediately, in parallel with CSS and JavaScript resources.

<!-- Add to <head> for above-the-fold hero image -->
<link
  rel="preload"
  as="image"
  href="/images/hero.webp"
  type="image/webp"
  fetchpriority="high"
/>
2. Serve Modern Image Formats
WebP/AVIF reduces file size 25-50% vs JPEG

AVIF offers the best compression (30-50% smaller than JPEG) but has slightly less browser support than WebP. Use the <picture> element to serve AVIF with WebP and JPEG fallbacks, or use a CDN that handles format negotiation automatically via the Accept header.

<picture>
  <source srcset="/hero.avif" type="image/avif" />
  <source srcset="/hero.webp" type="image/webp" />
  <img
    src="/hero.jpg"
    alt="Hero image description"
    width="1200"
    height="630"
    fetchpriority="high"
    decoding="async"
  />
</picture>
3. Preload and Optimize Web Fonts
Prevents font-related render blocking and FOIT

Web fonts block text rendering by default. If text is your LCP element, a slow font download directly increases LCP. Preload critical fonts, use font-display: swap to show fallback text immediately, and self-host fonts to eliminate third-party DNS resolution and connection time.

<!-- Preload critical font in <head> -->
<link
  rel="preload"
  as="font"
  href="/fonts/inter-var.woff2"
  type="font/woff2"
  crossorigin="anonymous"
/>

<!-- font-display: swap in CSS -->
@font-face {
  font-family: 'Inter';
  src: url('/fonts/inter-var.woff2') format('woff2');
  font-display: swap;
  font-weight: 100 900;
}
4. Inline Critical CSS
Eliminates render-blocking CSS requests for above-the-fold content

External CSS stylesheets are render-blocking — the browser will not paint anything until all CSS in the <head> is downloaded and parsed. Inline the critical CSS needed to render above-the-fold content directly in the HTML, and load the remaining CSS asynchronously. This is especially impactful on slower connections where CSS downloads can take hundreds of milliseconds.

5. Use Preconnect Hints for Third-Party Origins
Saves 100-300ms by establishing early connections

If your LCP resource loads from a different origin (CDN, image service, font provider), the browser needs to perform DNS lookup, TCP handshake, and TLS negotiation before downloading the resource. Preconnect hints start this process early, saving 100-300ms per origin.

<!-- Preconnect to critical third-party origins -->
<link rel="preconnect" href="https://cdn.example.com" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />

CLS Fixes: Eliminating Layout Shift

Cumulative Layout Shift measures how much visible content unexpectedly shifts during the page lifecycle. A CLS score of 0.1 or below is considered good. Unlike INP and LCP which measure speed, CLS measures visual stability — users should never have content jump out from under their cursor or tap target. Layout shifts are especially frustrating on mobile where they cause accidental clicks on ads or wrong links.

Top CLS Causes and Fixes

Images and Videos Without Dimensions
The #1 cause of CLS globally

When images and videos load without explicit width and height attributes, the browser cannot reserve space for them in the layout. Once the media loads, everything below shifts downward. Always include width and height attributes on <img>, <video>, and <iframe> elements, or use CSS aspect-ratio to maintain proportions.

<!-- BAD: No dimensions — causes layout shift -->
<img src="/photo.jpg" alt="Product photo" />

<!-- GOOD: Explicit dimensions — browser reserves space -->
<img
  src="/photo.jpg"
  alt="Product photo"
  width="800"
  height="600"
  loading="lazy"
/>

<!-- GOOD: CSS aspect-ratio for responsive images -->
<style>
  .hero-img {
    aspect-ratio: 16 / 9;
    width: 100%;
    height: auto;
    object-fit: cover;
  }
</style>
Web Font Loading (FOUT/FOIT)
Font swap shifts text layout when custom fonts load

When font-display: swap is used (which you should, for LCP reasons), the browser first renders text in the fallback font, then re-renders in the custom font. If the metrics differ significantly between fonts, text reflows and pushes surrounding content around. The fix is to match fallback font metrics to your custom font using CSS override descriptors.

/* Optimized fallback font matching custom font metrics */
@font-face {
  font-family: 'Inter Fallback';
  src: local('Arial');
  size-adjust: 107.64%;
  ascent-override: 90%;
  descent-override: 22.43%;
  line-gap-override: 0%;
}

body {
  font-family: 'Inter', 'Inter Fallback', system-ui, sans-serif;
}
Ad Slots and Dynamic Content
Reserve space before content loads

Ads, newsletter signup forms, cookie consent banners, and dynamically injected content all cause layout shifts if space is not reserved in advance. For ad slots, use min-height to reserve the expected ad size. For dynamic content, use CSS contain-intrinsic-size or fixed-height containers. For cookie banners, overlay them at the top of the viewport with position: fixed so they do not push page content down.

/* Reserve space for ad slots to prevent CLS */
.ad-slot-leaderboard {
  min-height: 90px;   /* Standard 728x90 leaderboard */
  width: 100%;
  background: #f4f4f5; /* Placeholder color */
  contain: layout;
}

.ad-slot-rectangle {
  min-height: 250px;  /* Standard 300x250 rectangle */
  min-width: 300px;
  background: #f4f4f5;
  contain: layout;
}

/* Cookie banner: overlay, do not push content */
.cookie-banner {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 50;
}
Late-Loading CSS Causing Reflows
Async-loaded stylesheets can trigger page-wide layout shifts

When CSS loads after the initial render — either from dynamically injected <link> tags or component-level CSS-in-JS — it can apply new styles that change element sizes and positions. The fix is to either inline critical CSS (so the first render is correct) or use content-visibility: auto on sections where late-loading styles apply, so the browser skips layout calculation for off-screen content until the user scrolls to it.

Measurement & Debugging Tools

Effective Core Web Vitals optimization requires both lab tools (for debugging in controlled conditions) and field tools (for understanding real-user experience). Google uses field data from CrUX for ranking decisions, so your lab scores only matter insofar as they predict real-user outcomes. Here is the complete toolkit for 2026.

ToolTypeMeasuresBest For
PageSpeed InsightsField + LabAll CWV + diagnosticsQuick page-level assessment
Chrome DevToolsLabINP attribution, LCP breakdownDebugging specific interactions
Web Vitals JS LibraryField (RUM)All CWV with attributionProduction monitoring
CrUX DashboardField28-day rolling CWV averagesTrend analysis over months
Search Console CWV ReportFieldSite-wide pass/fail by URL groupIdentifying failing URL patterns
Lighthouse CILabAll CWV + performance auditsCI/CD pipeline integration

Setting Up Real User Monitoring

The Web Vitals JavaScript library is the foundation for capturing real-user Core Web Vitals data. It provides the same metrics Google uses for CrUX, with attribution data that tells you exactly which element caused a poor score and why. Send this data to your analytics platform for analysis.

// Install: npm install web-vitals
import { onCLS, onINP, onLCP } from 'web-vitals/attribution';

function sendToAnalytics(metric) {
  const body = {
    name: metric.name,
    value: metric.value,
    rating: metric.rating, // 'good', 'needs-improvement', 'poor'
    delta: metric.delta,
    id: metric.id,
    page: window.location.pathname,
    // Attribution data for debugging
    ...(metric.attribution && {
      element: metric.attribution.largestShiftTarget  // CLS
        || metric.attribution.interactionTarget       // INP
        || metric.attribution.element,                // LCP
    }),
  };

  // Use sendBeacon for reliable delivery on page unload
  if (navigator.sendBeacon) {
    navigator.sendBeacon('/api/analytics/vitals', JSON.stringify(body));
  }
}

// Capture all three Core Web Vitals
onCLS(sendToAnalytics);
onINP(sendToAnalytics);
onLCP(sendToAnalytics);

For help setting up comprehensive performance monitoring and analytics dashboards, see our analytics and insights services.

Framework-Specific Optimization

Each framework has its own performance characteristics, built-in optimizations, and common pitfalls. Here are the most impactful Core Web Vitals optimizations for the three most popular web frameworks in 2026.

Next.js Optimization
Built-in features that handle Core Web Vitals automatically
  • Image component: Next.js <Image> automatically generates responsive sizes, serves WebP/AVIF, adds width/height for CLS prevention, and lazy-loads below-the-fold images
  • Font optimization: next/font self-hosts Google Fonts, generates fallback metrics automatically, and applies font-display swap — zero CLS from font loading
  • Static generation: Pages built at compile time have near-zero TTFB from CDN edge, giving LCP a massive head start
  • Server Components: React Server Components reduce client-side JavaScript, lowering INP by reducing main thread work during interactions
// Next.js Image component — handles LCP and CLS automatically
import Image from 'next/image';

export default function Hero() {
  return (
    <Image
      src="/hero.jpg"
      alt="Hero image"
      width={1200}
      height={630}
      priority          // Preloads for LCP
      sizes="100vw"     // Prevents unnecessary variants
      quality={85}
    />
  );
}

// next/font — zero CLS font loading
import { Inter } from 'next/font/google';

const inter = Inter({
  subsets: ['latin'],
  display: 'swap',     // Applied automatically
});
React Optimization
Code splitting and Suspense for better INP and LCP
  • Code splitting: Use React.lazy() for route-level and component-level splitting. Only load JavaScript the user needs for the current view
  • Suspense boundaries: Wrap non-critical sections in Suspense to prevent blocking the initial render. Show fallback content instantly while heavier components load
  • useTransition: Wrap non-urgent state updates in startTransition to keep the UI responsive during expensive re-renders, directly improving INP
  • Memoization: Use React.memo and useMemo to prevent unnecessary re-renders that block the main thread during interactions
WordPress Optimization
Caching, plugin audit, and server-level optimizations
  • Page caching: Enable full-page caching with a plugin like WP Super Cache or W3 Total Cache. Cached pages serve static HTML, reducing TTFB from 500-2000ms to under 100ms
  • Plugin audit: Every active plugin adds JavaScript and CSS to every page load. Deactivate plugins you do not actively use, and use conditional loading to load plugin assets only on pages that need them
  • Image optimization: Use a plugin like ShortPixel or Imagify to auto-convert images to WebP, add width/height attributes, and implement lazy loading. WordPress 5.5+ includes native lazy loading
  • CDN: Use Cloudflare or a similar CDN to cache static assets at edge locations worldwide, reducing resource load times by 50-80% for geographically distant visitors

For custom web development with performance built in from the start, see our web development services.

Performance Budgets & Monitoring

Optimization is not a one-time project — it is an ongoing discipline. Performance budgets set measurable limits on resource sizes and metrics that your team commits to maintaining. Without budgets, performance degrades over time as features are added, new scripts are included, and images grow unchecked. Here is how to set and enforce performance budgets in 2026.

Recommended Performance Budgets

Budget CategoryTargetRationale
Total JavaScript (compressed)< 300 KBKeeps main thread free for INP
Total CSS (compressed)< 80 KBReduces render-blocking time
Hero image size< 200 KBCritical for LCP under 2.5s
Total page weight< 1.5 MBEnsures sub-3s load on 4G mobile
Third-party scripts< 5 scriptsEach script adds DNS + connection overhead
LCP target< 2.0sBuffer below 2.5s Google threshold
INP target< 150msBuffer below 200ms Google threshold
CLS target< 0.05Buffer below 0.1 Google threshold

CI/CD Performance Gates

Integrate performance checks into your CI/CD pipeline so that no deploy can regress Core Web Vitals. Lighthouse CI runs a Lighthouse audit on every pull request and fails the build if scores drop below your defined thresholds. This catches performance regressions before they reach production and affect your CrUX scores.

// lighthouserc.json — Lighthouse CI configuration
{
  "ci": {
    "assert": {
      "assertions": {
        "categories:performance": ["error", { "minScore": 0.9 }],
        "interactive": ["error", { "maxNumericValue": 3500 }],
        "largest-contentful-paint": ["error", { "maxNumericValue": 2500 }],
        "cumulative-layout-shift": ["error", { "maxNumericValue": 0.1 }],
        "total-byte-weight": ["warning", { "maxNumericValue": 1500000 }]
      }
    },
    "collect": {
      "numberOfRuns": 3,
      "url": ["http://localhost:3000/", "http://localhost:3000/blog"]
    }
  }
}

Synthetic vs RUM Monitoring

Synthetic Monitoring
Controlled, repeatable tests from fixed locations
  • Consistent baseline for comparison
  • Catches regressions immediately
  • Good for CI/CD integration
  • Does not reflect real user conditions
  • Cannot measure INP (no real interactions)
Real User Monitoring (RUM)
Actual metrics from real visitors on real devices
  • Matches what Google uses for rankings (CrUX)
  • Captures INP from real interactions
  • Shows device and network diversity
  • Identifies worst-performing pages by real traffic
  • Requires traffic volume for meaningful data

Conclusion

Core Web Vitals optimization in 2026 centers on INP — the metric most sites fail and the one requiring the deepest technical changes. While LCP and CLS have well-established fix patterns (preload images, add dimensions, inline critical CSS), INP demands a fundamental shift in how developers think about JavaScript architecture: break long tasks, defer non-critical work, yield to the main thread during interactions, and minimize DOM complexity.

The business case is clear. Sites passing all three Core Web Vitals thresholds see 24% lower bounce rates, measurably better organic rankings, and higher user engagement. The investment in performance optimization pays for itself through improved search visibility and conversion rates. Start with the highest-impact fixes — preloading the LCP image, adding explicit dimensions to all media, and auditing third-party scripts that block the main thread — then build monitoring infrastructure to protect those gains over time.

Ready to Fix Your Core Web Vitals?

Whether you're debugging failing INP scores, optimizing LCP for a content-heavy site, or setting up performance monitoring pipelines, our technical SEO and development team can help you pass all three Core Web Vitals thresholds and keep them green.

Free consultation
Expert guidance
Tailored solutions

Frequently Asked Questions

Related Guides

Continue exploring technical SEO and web performance optimization