Core Web Vitals in 2026: How to Optimize LCP, INP & CLS for Better Rankings
A focused guide on improving the three Core Web Vitals that Google uses for ranking. With specific fixes, diagnostic tools, and real-world thresholds for each metric.
MigrateLab Team
Migration Experts

Core Web Vitals: The Three Metrics Google Actually Uses for Rankings
Core Web Vitals are a subset of web performance metrics that Google has designated as ranking signals. Unlike Lighthouse's lab-only performance score, Core Web Vitals are measured on real users via the Chrome User Experience Report (CrUX). As of 2026, there are three:
- Largest Contentful Paint (LCP) — loading speed
- Interaction to Next Paint (INP) — responsiveness
- Cumulative Layout Shift (CLS) — visual stability
INP replaced First Input Delay (FID) in March 2024. Where FID only measured the delay of the first interaction, INP captures the worst interaction latency throughout the entire page session — a much more comprehensive and demanding metric.
To pass Core Web Vitals, at least 75% of your real user visits must meet the 'good' threshold for each metric at the page level (not site-wide). Google groups pages into URL groups for assessment. You can check your current status in Google Search Console under the Core Web Vitals report.
Optimizing LCP: Make the Main Content Appear Fast
LCP measures when the largest visible element finishes rendering in the viewport. Good: under 2.5s. Needs improvement: 2.5-4s. Poor: over 4s.
Step 1: Identify Your LCP Element
Before you can fix LCP, you need to know what your LCP element is. Open Chrome DevTools, go to the Performance panel, and record a page load. Look for the 'LCP' marker in the timeline — it'll highlight which element Lighthouse considers the largest. Common LCP elements:
- Hero images — the most common on marketing pages
- Large headings — common on blog posts and text-heavy pages
- Video poster images — on pages with hero video
- Background images — loaded via CSS background-image (harder to optimize)
You can also use the Web Vitals Chrome extension, which shows the LCP element and timing in real-time as you browse.
Step 2: Optimize the LCP Resource
If LCP is an image: compress it, convert to WebP/AVIF, and add a preload tag in the <head>: <link rel="preload" as="image" href="/hero.webp" fetchpriority="high">. Make sure the image is not lazy-loaded — the LCP image should load eagerly. Use fetchpriority="high" to tell the browser this image is more important than other resources.
If LCP is text: ensure fonts load quickly. Preload the primary font file, use font-display: swap so text is visible immediately, and make sure no JavaScript blocks rendering before the text appears. If the text is rendered client-side (by JavaScript), consider server-side rendering.
If LCP is a CSS background-image: the browser can't discover CSS background images until it has downloaded and parsed the CSS file — adding latency. Consider switching to an inline <img> element that the browser can discover from the HTML. Or preload the image explicitly.
Step 3: Reduce Server Response Time
LCP can't be faster than your TTFB (Time to First Byte). If the server takes 2 seconds to respond, your LCP will be at least 2 seconds regardless of how optimized the image is. Practical fixes:
- Use a CDN: serve pages from edge locations near your users
- Enable caching: server-side caching (Redis, Varnish) or stale-while-revalidate patterns
- Static generation: pre-build pages at deploy time for sub-50ms TTFB (Astro, Next.js SSG)
- Optimize database queries: add indexes, reduce N+1 queries, cache expensive queries
- Edge rendering: run server-side logic at CDN edge locations (Vercel Edge, Cloudflare Workers)
Step 4: Remove Render-Blocking Resources
Even with a fast server and optimized image, LCP is delayed if the browser is blocked downloading render-blocking CSS or synchronous JavaScript. Inline critical CSS, defer non-critical CSS, and use async or defer on scripts that don't need to run before first paint.
Optimizing INP: Make Every Interaction Responsive
INP measures the worst interaction latency during a page visit. When a user clicks, types, or taps, INP measures how long until the browser responds visually. Good: under 200ms. Needs improvement: 200-500ms. Poor: over 500ms.
INP is the hardest Core Web Vital to optimize because it's measured throughout the entire user session, not just during page load. A page can load fast but still have poor INP if interactions trigger expensive JavaScript execution later.
Diagnose INP Issues
Use the Web Vitals Chrome extension to see INP in real-time as you interact with the page. The extension highlights which interactions are slow and shows the exact timing breakdown: input delay (time waiting for the main thread), processing time (event handler execution), and presentation delay (time to paint the visual update).
For deeper debugging, use Chrome DevTools Performance panel. Record a session, interact with the page, and look for long tasks (yellow bars) near your interactions. The Long Tasks overlay shows exactly what code is blocking the main thread.
Fix INP Issues
- Reduce JavaScript: less code = less main thread contention. Every kilobyte of JavaScript is potential INP overhead, even if it's not running during the specific interaction.
- Break long tasks: use
scheduler.yield()(Chrome 129+),requestIdleCallback, orsetTimeout(0)to break expensive operations into smaller chunks that don't block the main thread. - Debounce input handlers: for scroll, resize, and input events, use
requestAnimationFrameor debounce to avoid running handlers more often than the browser can paint. - Use Web Workers: move expensive computation (sorting large lists, text processing, data transformation) to a Web Worker so it doesn't block the main thread.
- Avoid forced synchronous layouts: reading layout properties like
offsetHeightinside a loop forces the browser to recalculate layout on every iteration. - Virtualize long lists: rendering thousands of DOM nodes hurts INP even when the user isn't interacting with those nodes. Libraries like TanStack Virtual render only visible items.
Optimizing CLS: Stop the Page from Jumping
CLS measures visual stability — how much the page content shifts unexpectedly. Good: under 0.1. Needs improvement: 0.1-0.25. Poor: over 0.25. CLS is often the easiest Core Web Vital to fix because the causes are well-known and the solutions are usually straightforward.
Find CLS Offenders
Run a Lighthouse audit and look at the 'Avoid large layout shifts' section — it shows exactly which elements shifted and by how much. The Chrome DevTools Layout Shift Regions overlay (in the Rendering tab) highlights shifts in real-time as you browse. The Performance panel also marks layout shifts with pink bars.
The Most Common CLS Fixes
- Images without dimensions: always include
widthandheightattributes. The browser uses these to calculate aspect ratio before the image loads, reserving the right amount of space. - Web fonts: use
font-display: swapwith a matched fallback (tools like Fontaine generate the right overrides), or usefont-display: optionalto prevent any shift — the font only renders if it loads fast enough. - Ads and embeds: reserve space with CSS
min-heightoraspect-ratioon the container element. For ads, use the expected ad slot dimensions. - Dynamic content injection: cookie banners, notification bars, and in-page alerts should use
position: stickyor overlay positioning instead of inserting into the document flow. - Client-rendered content: content that renders after JavaScript executes can cause shifts. Use server-side rendering or skeleton screens with the correct dimensions.
- CSS animations: use
transformandopacityproperties instead oftop,left,width, ormargin— transform-based animations don't trigger layout recalculation.
Tools for Monitoring Core Web Vitals
You need both lab tools (for debugging) and field tools (for measuring real-world performance):
- Google Search Console: the authoritative source for how Google sees your Core Web Vitals. Shows page-level pass/fail status and groups similar URLs.
- PageSpeed Insights: shows both lab and field data for individual URLs. Field data comes from CrUX.
- Web Vitals Chrome extension: shows real-time INP, LCP, and CLS as you browse your site. Essential for debugging.
- Chrome DevTools Performance panel: detailed timeline for debugging specific issues. Shows long tasks, layout shifts, and resource loading.
- web-vitals JavaScript library: by Google. Add it to your site for custom real-user monitoring. Sends CWV data to your analytics.
- CrUX API / BigQuery: programmatic access to Chrome User Experience Report data. Track trends over time or build custom dashboards.
Platform Limitations: When Optimization Isn't Enough
Some platforms impose a performance floor that you can't optimize below. If your no-code platform ships 300KB+ of JavaScript you can't remove, INP and TBT will always suffer. If the platform generates non-responsive images without modern formats, your LCP will lag. If dynamic elements inject without reserved space, CLS is inevitable.
The question to ask: after you've optimized everything within your control (images, third-party scripts, content structure), are your Core Web Vitals passing the Good threshold for at least 75% of your users? If yes, you're in good shape. If no, the bottleneck is the platform itself — and no amount of optimization will fix an architectural limitation.
| Feature | Core Web Vital | Thresholds |
|---|---|---|
| LCP (Largest Contentful Paint) | Loading speed — when main content is visible | Good: <2.5s · Poor: >4s |
| INP (Interaction to Next Paint) | Responsiveness — delay after user interaction | Good: <200ms · Poor: >500ms |
| CLS (Cumulative Layout Shift) | Visual stability — unexpected element movement | Good: <0.1 · Poor: >0.25 |
Core Web Vitals are measured on real users, not lab tests. Check Google Search Console for your actual field data — that's what affects your rankings. Lab scores from Lighthouse are useful for debugging but don't directly determine your ranking impact.