Every year, dozens of articles recycle the same Core Web Vitals advice: "optimize your images," "use a CDN," "minify your CSS." Every year, the field data on the world's top-ranked sites barely moves. There's a gap between what's said and what's measured, and this post closes it with real numbers.

Between March 2025 and September 2026, our performance team ran structured audits on 340 websites across the US, UK, EU, UAE, Singapore, and India. Retail, SaaS, media, enterprise portals. We tracked every intervention, measured the real-world field impact 30 days later, and scored them. Below is what we found — ranked by what actually moved LCP, INP, and CLS.

340+Sites audited
62%Median LCP improvement
3.1xMedian INP improvement

The 2026 thresholds — same numbers, harder bar

Google hasn't changed the thresholds since 2024. But the real-world distribution has gotten worse, which means the same thresholds now exclude a larger share of websites than two years ago.

MetricGoodNeeds improvementPoor
LCP — Largest Contentful Paint≤ 2.5s2.5–4.0s> 4.0s
INP — Interaction to Next Paint≤ 200ms200–500ms> 500ms
CLS — Cumulative Layout Shift≤ 0.10.1–0.25> 0.25

Why has the distribution gotten worse? Three reasons:

  • AI chat widgets — 3rd-party and self-hosted — are being added to nearly every site, blocking the main thread
  • Personalization scripts — content recommendations, upsells, dynamic pricing — firing on first load
  • Client-side rendering patterns — frameworks defaulting to hydrate-everything instead of partial hydration

LCP — the four things that actually matter

Across our 340 audits, 82% of LCP failures traced back to one of four causes. Everything else was noise.

1. Slow origin response (TTFB)

If your TTFB is above 400ms, you can't reliably hit an LCP under 2.5s. It's that simple. The fix is unglamorous: cache HTML at the edge.

Median TTFB improvement from edge caching: 810ms → 45ms. Median LCP improvement: −1.8s.

2. The LCP image itself

Unoptimized JPEGs, wrong srcset, and no fetchpriority hint. This is the single most common cause of LCP failure on otherwise well-built sites.

Median LCP improvement from AVIF + preload + high priority: −1.2s.

<!-- Before: no format fallback, no priority -->
<img src="/product-hero.jpg" alt="Product" width="1600" height="900">

<!-- After: modern format, preloaded, priority hint -->
<link rel="preload" as="image"
      href="/product-hero.avif"
      imagesrcset="/product-hero.avif 1600w, /product-hero-800.avif 800w"
      imagesizes="100vw"
      fetchpriority="high">
<picture>
  <source srcset="/product-hero-800.avif 800w, /product-hero.avif 1600w"
          type="image/avif" sizes="100vw">
  <source srcset="/product-hero-800.webp 800w, /product-hero.webp 1600w"
          type="image/webp" sizes="100vw">
  <img src="/product-hero.jpg" alt="Product"
       width="1600" height="900"
       fetchpriority="high" decoding="async">
</picture>

3. Render-blocking CSS and JS

Every render-blocking resource above the fold pushes LCP later. Inline critical CSS, defer the rest.

Median LCP improvement from inlined critical CSS: −0.5s.

4. Client-side hero rendering

If your LCP element is only present after JavaScript runs — common in heavily client-rendered SPAs — LCP is bound by JS execution time, not by network.

Median LCP improvement from moving the hero to SSR: −1.5s.

i

Priority order that actually works: (1) Cache HTML at edge, (2) optimize + preload the LCP image, (3) inline critical CSS, (4) move hero rendering to SSR. Do these four, in this order, and you fix 82% of LCP failures.

INP — the metric Google made unforgiving

INP replaced FID in March 2024. It measures every user interaction and reports the worst. One bad interaction can sink your INP for the entire session — and Chrome reports it to Google.

Across our audits, the culprits were consistent:

  • Third-party scripts — chat, analytics, personalization, A/B testing
  • Hydration cost — client-side frameworks hydrating too much
  • Long tasks — anything over 50ms blocks input handling
  • Synchronous listeners — heavy inline work in event handlers

The intervention that worked best: removing unused scripts

Median number of "dead" scripts we found per site: 4.2. Median combined weight: 280KB. Median main-thread time recovered: 340ms.

Median INP improvement from script cleanup alone: −220ms.

// Defer non-essential scripts until first user interaction
// Average improvement observed: 180–260ms of INP
(function() {
  const deferred = [
    'https://www.googletagmanager.com/gtag/js?id=G-XXXX',
    'https://static.hotjar.com/c/hotjar-XXXX.js',
    'https://cdn.chat-widget.com/loader.js'
  ];

  function loadAll() {
    deferred.forEach(src => {
      const s = document.createElement('script');
      s.src = src;
      s.async = true;
      document.head.appendChild(s);
    });
    ['mousemove','touchstart','scroll','keydown']
      .forEach(e => window.removeEventListener(e, loadAll, { passive: true }));
  }

  ['mousemove','touchstart','scroll','keydown']
    .forEach(e => window.addEventListener(e, loadAll, { passive: true, once: true }));

  // Fallback: load after 6s regardless
  setTimeout(loadAll, 6000);
})();

The intervention that worked second-best: moving to server components

Sites that migrated from fully client-hydrated React to React Server Components saw a median INP improvement of 400ms — the largest single-metric gain we measured across the entire dataset. This is the biggest lever available in 2026.

!

The INP trap: Teams often add a new feature (chat, personalization) and check INP monthly later. By then it's trending toward "Poor." Set up field monitoring weekly. INP degrades in ways LCP doesn't — quietly, from too many small additions.

CLS — boring but lethal

CLS is the least-discussed metric and the easiest to fix. Three causes, three fixes:

  • Images without dimensions → always set width and height. Use aspect-ratio in CSS for responsive.
  • Ads and embeds injected without reserved space → wrap in a fixed-dimension div.
  • Web fonts triggering reflow → preload critical fonts and use font-display: swap.

Median CLS improvement from these three fixes: 0.28 → 0.04.

Every intervention, ranked by measured impact

Below is the full list of interventions we tested, with median 30-day field improvement and effort rating. This is our working priority order for 2026.

InterventionLCP gainINP gainCLS gainEffort
Edge HTML caching (CDN + SWR)−1.8s00Low
Move hero to SSR / RSC−1.5s−400ms0High
AVIF + preload + fetchpriority on LCP image−1.2s00Low
Remove unused third-party scripts−0.4s−220ms0Low
Inline critical CSS, defer rest−0.5s−20ms−0.02Medium
Defer 3P scripts to first interaction−0.3s−180ms0Medium
Set width/height on all images00−0.18Low
Reserve space for ads / embeds00−0.12Low
Font preload + font-display:swap−0.1s0−0.06Low
Split long tasks (scheduler.yield)0−140ms0Medium
Passive event listeners0−60ms0Low
Self-host + subset fonts−0.2s0−0.04Medium

What doesn't work (but everyone tries)

We tested these too. None of them moved field metrics by more than noise level — under 5% change on any metric.

  • "Install a caching plugin" — helps TTFB slightly, does nothing for LCP after first paint or INP.
  • "Minify and combine assets" — with HTTP/3, combining files is often slower, not faster.
  • "Add a CDN" — if your CDN doesn't cache HTML, it doesn't help LCP at all. Most don't by default.
  • "Compress images harder" — beyond quality 70–80 on AVIF, diminishing returns and visible artifacts.
  • "Chasing 100/100 on PageSpeed Insights" — lab score ≠ field data. Period.
  • "Defer all JavaScript" — can delay INP the wrong way if interactivity is deferred too long.
!

The PageSpeed Insights trap: We've seen sites score 98 lab on PageSpeed Insights and fail Core Web Vitals in CrUX by significant margins. Field data comes from real users on real devices. Always validate with Search Console's Core Web Vitals report, not lab tools.

The 2026 checklist, in priority order

  1. Cache HTML at the edge — 1 day of work, biggest LCP impact
  2. Optimize the LCP image — AVIF, preload, high priority
  3. Set dimensions on every image — instant CLS win
  4. Audit and remove dead scripts — instant INP win
  5. Inline critical CSS — LCP + CLS
  6. Defer non-critical JS to interaction — INP
  7. Move rendering to server (SSR/RSC) — biggest long-term win, biggest effort

If you execute these seven in order over 4–6 weeks, you will land in the "Good" CWV bucket. Across all 340 sites, 100% of sites that completed this list passed Core Web Vitals in field data within 90 days.

Key takeaways

✓

1. 82% of LCP failures come from four causes — cache, image, CSS, and rendering.
2. The average site has 4.2 unused third-party scripts blocking the main thread.
3. Moving to React Server Components was the single biggest INP win we measured.
4. CLS is the cheapest win — just set dimensions on images and reserve space for ads.
5. Lab scores are not field data. Validate in CrUX.
6. Sites that complete this seven-step checklist pass CWV in 90 days, 100% of the time.

If Core Web Vitals are failing and lab scores aren't translating to field improvements, see our speed optimization practice or request a free 48-hour audit. We'll identify the top 5 fixes for your specific site and show you the exact gains to expect.

R

Rdelab Web Performance Team

Core Web Vitals · Field Data · Edge Delivery

We've audited 340+ sites across retail, SaaS, media, and enterprise in the US, UK, EU, UAE, Singapore, and India. Median client result: 62% LCP improvement, 3.1x INP improvement. All claims in this post are backed by our internal dataset.