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:
| Stage | What it is | Typical fix |
|---|---|---|
| Time to first byte | Server response for the HTML | CDN caching, faster origin, database query tuning |
| Resource load delay | Time before the image is requested | Do not lazy-load the hero; preload / fetchpriority="high" |
| Resource load time | Time to download the image | AVIF/WebP, correct srcset, CDN |
| Element render delay | Time to paint after download | Remove 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
- 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.
- 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 } } - 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.
- Avoid layout thrash. Reading
offsetHeightin a loop after writing styles forces synchronous reflow. Batch reads, then batch writes. - Use passive listeners (
{ passive: true }) for scroll and touch handlers so the browser never waits for them. - Debounce expensive validation, and prefer to validate on blur rather than on every keystroke.
- 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. Usefetchpriority="high"instead. - Serve correctly sized images with
srcsetandsizes. 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"andheight="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
| Cause | Fix |
|---|---|
| Images and video without dimensions | Set width/height, or use aspect-ratio |
| Web fonts swapping with different metrics | font-display: swap plus size-adjust on the fallback, or self-host and preload |
| Cookie banners injected after load | Reserve the space in the initial layout, or render it server-side |
| Ads, embeds and iframes inserted dynamically | Reserve the container height up front |
| Content injected above existing content | Append 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
| Tool | What it tells you | Watch out for |
|---|---|---|
| Search Console → Core Web Vitals | Field data, grouped by URL pattern | 28-day lag; low-traffic URLs may lack data |
| PageSpeed Insights | Field (CrUX) and lab (Lighthouse) | Ignore the lab score for ranking purposes |
| Chrome DevTools Performance panel | Exactly which task blocked which interaction | Simulated, not real devices |
| Web Vitals JS library + your RUM | Per-page, per-device, per-country field data | Requires instrumentation — worth every hour |
| CrUX Dashboard / BigQuery | Competitor and market comparison | Origin-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.