Google retired First Input Delay (FID) and replaced it with Interaction to Next Paint (INP) in March 2024. A year on, most teams we audit still treat Core Web Vitals as a one-time Lighthouse run before launch instead of a metric they engineer for. That gap is exactly where rankings and conversion rate get left on the table.
This is the playbook we use on every LIMINIQ build — what the three metrics measure today, why they slip in production even when local Lighthouse scores look clean, and the specific fixes that move the needle.
The three metrics that actually matter
Largest Contentful Paint (LCP) measures how long it takes the largest visible element — usually a hero image, a heading block, or a banner — to render. Google's threshold for "good" is under 2.5 seconds at the 75th percentile of real user visits, not your fastest test run.
Interaction to Next Paint (INP) replaced FID because FID only measured the delay before the first interaction started processing. INP measures the full latency of every interaction across the page's lifetime — click, tap, or keypress until the next frame paints — and reports the worst one. The bar is 200ms or under. This is why sites with heavy client-side JavaScript that felt "fast enough" under FID are now failing INP: a single janky dropdown or modal late in the session tanks the whole metric.
Cumulative Layout Shift (CLS) scores unexpected layout movement. Under 0.1 is good. Ads, web fonts swapping in, and images without dimensions are still the top three causes we see in 2025, alongside a newer offender: skeleton loaders that resolve to a different height than their final content.
Why lab scores lie and field data doesn't
Lighthouse runs on a single simulated device with a single network throttle profile. Your actual users are on a five-year-old Android phone on 4G, a MacBook on fiber, and everything in between. That's why we always cross-reference two data sources before touching code:
- CrUX (Chrome User Experience Report) — real anonymized field data, available via PageSpeed Insights or the CrUX API, segmented by device and connection type.
- Lab data (Lighthouse / WebPageTest) — useful for reproducing and debugging a specific regression, but never for grading a page.
If your CrUX LCP is failing but Lighthouse looks fine, the problem is almost always device or network related — meaning the fix has to be architectural (less JS, smaller payloads), not cosmetic.
Fixing LCP: kill the render-blocking chain
The most common LCP killer we find in audits is a hero image or heading that's waiting on a chain of blocking resources — a font, a CSS file, a client-side data fetch — before it can paint.
<link
rel="preload"
as="image"
href="/hero.webp"
fetchpriority="high"
/>
Preloading the LCP candidate resource, combined with fetchpriority="high" on the actual <img> tag, routinely shaves 400–900ms off LCP on image-heavy landing pages. Pair this with:
- Serving next-gen formats (AVIF with WebP fallback) at the actual rendered dimensions, not the source upload size.
- Using a CDN with HTTP/2 or HTTP/3 and Brotli compression — TLS handshake and compression overhead compounds badly on slow connections.
- Avoiding client-side data fetching for above-the-fold content. If the hero content depends on an API call that starts after hydration, you've already lost the LCP race. Render it server-side.
Fixing INP: the JavaScript execution problem
INP failures are rarely about a single slow function — they're about long tasks blocking the main thread when a user tries to interact. Any JavaScript task over 50ms is a long task, and if one is running when a click fires, the click waits.
The fix pattern we apply repeatedly:
- Break up long tasks. Use
scheduler.yield()(orsetTimeout(fn, 0)as a fallback) to hand control back to the browser between chunks of expensive work — sorting large lists, parsing large JSON payloads, or running analytics scripts. - Debounce and defer non-critical work. Third-party scripts (chat widgets, analytics, A/B testing tools) are the single biggest INP offender we see. Load them with
next/script'sstrategy="lazyOnload"or after the page reachesrequestIdleCallback. - Reduce hydration cost. In React/Next.js apps, hydrating a large component tree on page load is expensive even if nothing changes visually. Use React Server Components for anything that isn't interactive, and reserve client components for the smallest interactive island possible.
- Avoid synchronous style recalculation in event handlers. Reading
offsetWidth,getBoundingClientRect(), or similar layout-triggering properties inside a click handler forces a synchronous reflow. Batch DOM reads and writes separately.
Fixing CLS: reserve space before content exists
CLS is the cheapest metric to fix and the one most often ignored because it doesn't feel urgent until a user complains about "the page jumping."
- Set explicit
widthandheight(oraspect-ratioin CSS) on every image and video element, even when using responsive layouts. - Reserve space for ads and embeds with a fixed-size container — never let an ad network's iframe dictate layout after load.
- Use
font-display: optionalor preload critical fonts withsize-adjustfallback metrics so swapped-in web fonts don't reflow surrounding text. - Never insert content above existing content in response to a user action unless it's the direct result of that action (e.g., an accordion the user just opened).
Monitoring in production, not just at launch
A Lighthouse score at launch tells you nothing about month three, when marketing has added two more tracking pixels and a chatbot widget. We wire every client site into:
- Vercel Speed Insights or Google Search Console's Core Web Vitals report for ongoing field data at the URL level.
- A CI budget check (Lighthouse CI) that fails a deploy if LCP, INP, or CLS regress past a threshold — this catches "we added one small script" regressions before they ship.
The business case
Core Web Vitals are a confirmed Google ranking signal, but the bigger number is conversion. Every 100ms of LCP improvement has been shown in multiple large-scale studies (Amazon, Walmart, and our own client data) to correlate with measurable lifts in checkout completion and lead form submission. Performance work isn't a developer vanity metric — it's a revenue lever that compounds every month the site stays live.
If your CrUX report shows red or amber on any of the three metrics, the fix is rarely a single tweak — it's usually a rendering strategy problem. That's exactly the kind of architecture work our engineering team handles for clients moving off template-based sites onto performance-first Next.js builds.