Developer

LCP and INP Optimization: What Actually Moves the Score

Google's Core Web Vitals have changed. LCP and INP are what matter now. Here's what actually improves your scores, beyond the generic tips.

8 min readJanuary 22, 2026By FreeToolKit TeamFree to read

Google rolled INP into Core Web Vitals in March 2024 and a lot of sites that thought they were fine suddenly weren't. Here's what's changed and what actually helps your scores.

LCP: It's Almost Always About the Image

For most sites, the LCP element is a hero image. The first thing to do: run Lighthouse and confirm what your actual LCP element is. It's sometimes text, sometimes a video thumbnail, sometimes something you didn't expect.

Once you know what it is, the checklist matters less than the sequence. The browser needs to: discover the image exists, download it, and render it. Preloading the LCP image moves step one to as early as possible:

Don't lazy-load your LCP image. I see this constantly — teams add loading='lazy' to all images globally and accidentally apply it to the hero. That adds 300-500ms to LCP immediately.

INP: The Main Thread Is Your Enemy

INP is slow because JavaScript is blocking the browser's ability to respond to input. The main thread processes both JavaScript and user input — when JS runs, input is queued. Long tasks (tasks over 50ms) cause visible delays.

The fastest fix: reduce JavaScript execution during interactions. If a button click triggers 200ms of JS, the user feels that delay. Profile it with Chrome DevTools → Performance → start recording → click the button → stop recording. You'll see exactly what's running.

Common INP Killers and Fixes

  • React state updates that re-render large trees → use React.memo, useMemo, or startTransition
  • Synchronous filtering/sorting of large arrays in event handlers → move to Web Worker or use deferred rendering
  • Layout thrashing in animations → use transform and opacity only, avoid triggering layout
  • Third-party chat widgets, analytics, and ad scripts → defer them with requestIdleCallback

CLS: The One That's Easiest to Fix

Cumulative Layout Shift is almost always caused by images without explicit dimensions, ads loading and pushing content down, or fonts causing text reflow. Set explicit width and height on every image. Reserve space for ads before they load. Use font-display: swap with a system font fallback that's similar in size to your web font.

Frequently Asked Questions

What replaced FID in Core Web Vitals?+
Interaction to Next Paint (INP) replaced First Input Delay (FID) in March 2024. FID only measured the delay before the browser could start processing the first user interaction. INP measures the entire duration of every interaction throughout the page session — tap, click, keypress — and reports the worst one. INP is a much stricter metric. Many sites that had good FID scores (under 100ms) now struggle with INP because their JavaScript is blocking the main thread during complex interactions, not just on initial load.
What is a good LCP score?+
Under 2.5 seconds is 'Good.' 2.5-4 seconds is 'Needs Improvement.' Over 4 seconds is 'Poor.' But context matters. For e-commerce product pages, you want under 2 seconds because slower pages directly reduce conversion rates. For informational blog posts, 2.4 seconds is fine. The key insight is that LCP measures the largest contentful element — usually your hero image or largest text block. Optimizing that one element often has more impact than general performance improvements across the page.
Why is my INP score bad even though my page loads fast?+
INP measures runtime performance during interactions, not page load speed. A page that loads in 1 second can still have terrible INP if user interactions trigger heavy JavaScript execution. Common culprits: React re-rendering large component trees on every interaction, synchronous data processing in event handlers, layout thrashing caused by alternating reads and writes to DOM properties, and third-party scripts that compete for the main thread. Run Chrome DevTools Performance profiler while performing the interaction that's slow — it'll show you exactly which JavaScript task is blocking the response.
Does image optimization still matter for LCP?+
Yes, substantially. The LCP element is most commonly a hero image, and image size directly affects how quickly it can be downloaded and rendered. Use WebP or AVIF format (30-50% smaller than JPEG at equal quality). Set explicit width and height to prevent layout shift. Use loading='eager' and fetchpriority='high' on your LCP image — don't lazy-load it. Serve images through a CDN. Use responsive images with srcset so mobile devices get smaller files. Preload your LCP image with a link rel='preload' tag. These combined changes can drop LCP by 1-2 seconds on image-heavy pages.

🔧 Free Tools Used in This Guide

FT

FreeToolKit Team

FreeToolKit Team

We build free browser-based tools and write practical guides that skip the fluff.

Tags:

developerperformanceseoweb vitals