← Back to Studio Notes

Core Web Vitals Optimization in 2026: Passing INP, LCP & CLS

A technical guide to passing Google's Core Web Vitals in 2026, focusing on Interaction to Next Paint (INP), Largest Contentful Paint, and Cumulative Layout Shift.

KEHEM / Studio Notes
  KEHEM

Google's Core Web Vitals are a direct search ranking factor.

Websites that pass all Core Web Vitals benchmarks rank higher in Google search results, experience lower bounce rates, and convert more traffic into revenue.

In 2026, the vital metrics you must optimize are:

┌─────────────────────────────────────────────────────────────┐
│ 1. INP (Interaction to Next Paint): Target < 200ms          │
│ 2. LCP (Largest Contentful Paint): Target < 2.5s            │
│ 3. CLS (Cumulative Layout Shift): Target < 0.1              │
└─────────────────────────────────────────────────────────────┘

One clarification that saves months of misdirected effort: Core Web Vitals are assessed on field data, not lab scores. Google uses the 75th percentile of real user experiences over a rolling 28-day window, grouped by URL and by origin. A perfect Lighthouse score on your laptop means nothing if your real visitors on mid-range Android phones are experiencing 4-second LCP. Rank the work accordingly.

Core Web Vitals are also a tiebreaker, not a primary ranking factor. Content relevance and authority still dominate. But when two pages are otherwise comparable — which is exactly the situation in competitive B2B keywords — the faster page wins more often than chance would suggest, and the conversion effect of a faster page is not marginal at all.

The LCP Chain, Broken Into Its Parts

LCP is not a single number you "fix"; it is the sum of four stages, and knowing which stage is slow is the whole job:

StageWhat it isTypical fix
Time to first byteServer response for the HTMLCDN caching, faster origin, database query tuning
Resource load delayTime before the image is requestedDo not lazy-load the hero; preload / fetchpriority="high"
Resource load timeTime to download the imageAVIF/WebP, correct srcset, CDN
Element render delayTime to paint after downloadRemove render-blocking CSS/JS, avoid font blocking

Diagnosing in that order prevents the most common waste of effort: spending a week compressing images when the HTML itself was taking 1.8 seconds to arrive.

1. How to Fix INP (Interaction to Next Paint)

INP measures UI responsiveness when a user clicks a button, opens a modal, or types into a form. * Break Long JavaScript Tasks: Avoid running heavy computation on the main UI thread. Use requestIdleCallback or Web Workers. * Debounce Form Validation: Don't trigger heavy API validation on every keystroke.

What INP Is Measuring

An interaction's latency has three parts: input delay (the main thread was busy when the user clicked), processing time (your handler's own work) and presentation delay (the browser painting the result). Most bad INP scores come from the first — a busy main thread — which means the fix is usually about what else is running, not about the handler itself.

Practical INP Fixes, Highest Impact First

  1. Audit third-party scripts. Tag managers, chat widgets, heat-mapping tools and A/B testing libraries are the largest single cause of poor INP in our audits. Load them after interaction, self-host where possible, and delete the ones nobody uses.
  2. Break up long tasks. Any task over 50ms blocks input. Yield explicitly: javascript async function processLargeList(items) { for (let i = 0; i < items.length; i++) { handle(items[i]); if (i % 50 === 0) await new Promise(r => setTimeout(r, 0)); // yield to input } }
  3. Keep the DOM small. Rendering 5,000 rows will produce a slow interaction somewhere regardless of how clean your JavaScript is. Virtualise long lists and paginate tables.
  4. Avoid layout thrash. Reading offsetHeight in a loop after writing styles forces synchronous reflow. Batch reads, then batch writes.
  5. Use passive listeners ({ passive: true }) for scroll and touch handlers so the browser never waits for them.
  6. Debounce expensive validation, and prefer to validate on blur rather than on every keystroke.
  7. Prefer CSS transitions to JavaScript animation for anything decorative — CSS runs off the main thread in the compositor.

2. How to Optimize LCP (Largest Contentful Paint)

  • Preload Hero Images: <link rel="preload" as="image" href="/hero.webp">
  • Serve Next-Gen Formats: Convert JPG/PNG to AVIF and WebP for 60% smaller file payloads.
  • Edge Caching via Cloudflare: Serve initial HTML directly from edge nodes closest to the user.

The Details That Decide the Score

  • Identify the real LCP element first. In DevTools performance panel, or via a RUM tool, find out which element actually is the largest — it is often a heading or a background image, not the one you assumed.
  • Never lazy-load the hero image. loading="lazy" on the above-the-fold image is one of the most common self-inflicted LCP wounds; it delays the request by design. Use fetchpriority="high" instead.
  • Serve correctly sized images with srcset and sizes. A 2,400px hero sent to a 390px phone wastes bandwidth and time. Let the browser choose.
  • Watch TTFB. If your HTML takes 1.5 seconds to arrive, no image optimisation will rescue you. Cache pages at the edge, and audit the database queries behind the first render.
  • Avoid render-blocking resources. Inline critical CSS for the first viewport, defer the rest, and make sure fonts do not block text rendering.

For a typical B2B marketing page, the realistic order of returns is: fix TTFB, un-lazy the hero, convert to AVIF/WebP, then shave the render-blocking CSS.

3. How to Eliminate CLS (Cumulative Layout Shift)

  • Explicit Width & Height on Images: Always define width="1200" and height="630" to reserve space before images load.
  • Font-Display Swap with Matching Fallbacks: Prevent layout jumps when custom web fonts finish downloading.

The Usual Culprits, Ranked

CauseFix
Images and video without dimensionsSet width/height, or use aspect-ratio
Web fonts swapping with different metricsfont-display: swap plus size-adjust on the fallback, or self-host and preload
Cookie banners injected after loadReserve the space in the initial layout, or render it server-side
Ads, embeds and iframes inserted dynamicallyReserve the container height up front
Content injected above existing contentAppend below, or animate with transform only
Late-loading banners ("we're at the conference!")Load them in the initial HTML, not client-side

Note the font trap specifically: font-display: swap prevents invisible text but can still cause a visible shift if the fallback metrics differ from the custom font. Defining size-adjust, ascent-override and descent-override on a @font-face fallback reduces that shift to near zero, and it is a five-line fix that teams routinely skip.

How to Measure Properly

ToolWhat it tells youWatch out for
Search Console → Core Web VitalsField data, grouped by URL pattern28-day lag; low-traffic URLs may lack data
PageSpeed InsightsField (CrUX) and lab (Lighthouse)Ignore the lab score for ranking purposes
Chrome DevTools Performance panelExactly which task blocked which interactionSimulated, not real devices
Web Vitals JS library + your RUMPer-page, per-device, per-country field dataRequires instrumentation — worth every hour
CrUX Dashboard / BigQueryCompetitor and market comparisonOrigin-level, coarse

If you do one thing beyond fixing the obvious issues, instrument field data yourself. Search Console tells you that 18% of visits are poor. Your own RUM tells you it is specifically the pricing page on Android in Germany, which is a fixable problem rather than a mystery.

A 30-Day Plan, In Priority Order

If you are starting from a slow site, sequence the work like this:

Week 1 — Measure and find the bleeding. - Pull field data from Search Console and CrUX; identify the worst URL groups by traffic value. - Identify your LCP element per template in DevTools, and record TTFB for cached and uncached page loads. - Instrument the Web Vitals library in your own RUM so you can see results by device and country.

Week 2 — Fix the structural issues. - Cache HTML at the edge; if your TTFB is over 800ms, the rest is secondary. - Remove loading="lazy" from above-the-fold images and add fetchpriority="high". - Set explicit dimensions on every image, embed and ad slot; reserve space for cookie banners. - Audit third-party scripts: measure their cost with coverage and long-task data, then defer, self-host or delete.

Week 3 — Payload work. - Convert hero and content images to AVIF with WebP fallback; fix srcset/sizes. - Inline critical CSS, defer the remainder, self-host fonts with size-adjust fallbacks. - Trim JavaScript: check bundle size per route and remove libraries used once.

Week 4 — Verify and lock it in. - Re-check field data expectations (remember the 28-day window) and re-run on throttled mobile. - Add a Lighthouse CI budget to the pipeline so the numbers cannot silently regress. - Document the performance budget: max hero weight, max JS per route, max third-party scripts. A budget nobody wrote down is not a budget.

A Realistic Target

Chasing a 100/100 lab score is usually a waste of time. Aim for these instead:

  • All three vitals in the "good" range at the 75th percentile in Search Console for the pages that matter commercially.
  • TTFB under 200ms for cached pages, under 800ms for dynamic ones.
  • LCP under 2.5s on a mid-range Android over 4G — test with throttling, because that is closer to your median visitor than your desktop.
  • No layout shift from your own code. Third-party embeds will sometimes shift; your own components never should.

Improving those numbers is worth doing for its own sake. Google's ranking benefit is real but modest; the conversion, bounce-rate and ad-quality-score benefits are usually larger, and they appear immediately rather than after a 28-day window.

Related reading: Website performance optimisation is the broader checklist; SSR vs SPA covers the rendering decision behind LCP; and minimalist UI design covers shipping less code in the first place. Achieve a fast, stable, genuinely well-performing website. Hire KEHEM IT for performance optimization.

Failing INP or LCP in Search Console? Send us the URL and we will find what is actually slowing you down.

Have a project in mind?

KEHEM designs and builds thoughtful websites, SaaS products, and business systems.

Talk to KEHEMExplore Services