Guides

Performance guide

Core Web Vitals Explained: A Practical Fix-First Guide

Understand what each metric says about the user experience, then fix the bottleneck it actually measures.

Core Web Vitals are three field metrics for loading, responsiveness, and visual stability: Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS). To pass, aim for the good threshold for all three at the 75th percentile, segmented by mobile and desktop. The current good targets are LCP at 2.5 seconds or less, INP at 200 milliseconds or less, and CLS at 0.1 or less.

The practical rule is simple: measure real users, use lab traces to reproduce the cause, and fix the metric-specific bottleneck rather than chasing a single synthetic score.

How Core Web Vitals are judged

A percentile describes the experience of a slice of page views, not an average. At the 75th percentile, at least three quarters of measured visits are at or below the reported value. Segment results by device, template, geography, connection, and release where the data supports it. A fast desktop average can hide a poor mobile experience.

Field data comes from real browsers and includes device speed, network conditions, user interactions, and the full page lifecycle. Chrome User Experience Report, PageSpeed Insights, Search Console, and a real-user monitoring setup can provide field signals. Lab tools are repeatable and excellent for development, but they simulate a visit and cannot observe real interaction patterns. In a lab, Total Blocking Time is a useful diagnostic proxy for responsiveness; it is not INP.

Start with the worst metric and the most important template

Improving a low-traffic page while a product or checkout template fails in the field may improve a report but not the experience that matters to your business.

LCP: loading the main content

LCP records when the largest visible text block, image, or video poster is painted. It is a user-centered signal for when the main content appears, not a measurement of every resource on the page.

Fix LCP in this order

  1. Lower TTFB. A server response that starts late delays HTML parsing and the discovery of the LCP resource. Inspect DNS, connection setup, CDN status, origin queueing, application time, and database dependencies.
  2. Discover the LCP resource early. Put critical markup in the initial HTML, avoid hiding it behind client-side rendering, and use appropriate preload or fetch priority only when the resource is genuinely critical.
  3. Deliver fewer bytes. Resize the image to its rendered dimensions, use a modern format where appropriate, compress text, and remove redirects from the critical path.
  4. Do not lazy-load the LCP asset. Lazy loading below-the-fold images is useful, but delaying the main visible image creates the very problem LCP is meant to expose.
  5. Reduce render-blocking work. Keep critical CSS focused and defer non-essential JavaScript and third-party code.

The managed CDN and adaptive image guides cover two delivery levers, but neither can compensate for an origin that spends several seconds building the document.

INP: responding to interaction

INP measures the latency between qualifying user interactions and the next visual update throughout a page visit. It captures responsiveness after the initial load, including clicks, taps, and keyboard input. A page can have a good LCP and still feel broken if JavaScript blocks the main thread when users interact.

Fix INP in this order

  • Use DevTools performance traces or field attribution to find the slow interaction and the event handler responsible.
  • Break long tasks into smaller pieces so the browser can paint between units of work.
  • Reduce JavaScript shipped and executed on the route. Remove unused dependencies and delay code for interactions that have not happened.
  • Avoid expensive style recalculation and layout thrashing. Read layout values in batches, then write changes in batches.
  • Keep event handlers short. Move analytics and non-urgent work to a later task or an appropriate idle period.
  • Check third-party widgets, consent tools, chat, personalization, and tag managers. They often compete with application code for the same main thread.

Do not solve INP by adding a CDN rule to JavaScript alone. A faster download helps, but execution and event handling happen on the user's device.

CLS: keeping the page stable

CLS measures unexpected visual movement during the page lifecycle. A low score means users are less likely to lose their place or click the wrong control. Layout shifts caused by a user action, such as opening a menu, are not automatically a problem; unexpected movement is.

Fix CLS in this order

  • Set width and height attributes or an aspect-ratio for images and video.
  • Reserve space for ads, embeds, consent banners, and recommendation slots before their content arrives.
  • Avoid inserting content above existing content after the initial render.
  • Preload only the fonts needed for the first view, use appropriate fallback metrics, and watch for font swaps that move text.
  • Prefer transform-based animation over properties that trigger layout.
  • Reproduce shifts with the Layout Shifts track and identify the element that moved, not only the element that caused it.

A fix-first measurement workflow

1. Establish the baseline

Collect field data for the main templates and record the 75th percentile by mobile and desktop. Add a release marker if your RUM tool supports it. Use PageSpeed Insights or Search Console to locate affected URL groups, then inspect a representative URL rather than assuming every page behaves the same.

2. Reproduce the cause

Run a throttled lab trace with cache state and device class documented. Compare a cold load with a repeat view. Use the Network, Performance, Coverage, and Rendering panels to connect the metric to a request, long task, or layout shift. Measure server timing and cache headers separately from browser rendering.

3. Ship one class of fix

Change one meaningful variable where possible: image priority, server query, JavaScript split, reserved layout space, or caching rule. This makes the result attributable and makes rollback safe. Do not bundle ten unrelated optimizations and then guess which one helped.

4. Verify in the field

Recheck the same templates after the release has enough traffic. Confirm that the 75th percentile improved without regressions in conversion flows, accessibility, localization, consent, authentication, or cache correctness.

Mistakes that create misleading wins

Do not confuse a good first paint with a good LCP. Do not use an average when the target is a percentile. Do not treat CrUX as a debugging trace; it is a broad signal and may lag a release. Do not mark all images as high priority. Do not defer every script without checking interaction behavior. Do not ignore slow server response because the lab waterfall looks acceptable on a nearby test server.

For the server-side part of LCP, read How to reduce TTFB. For delivery policy and cache safety, continue with CDN caching explained. Technical SEO and GEO is also useful when crawl behavior and response reliability are part of the problem.

Validation checklist

Before calling a page healthy, confirm all three metrics at the 75th percentile for each important device segment, verify that the LCP element is understood, inspect the slowest interaction for INP, capture layout-shift sources for CLS, and compare field data with a repeatable lab trace. Keep a performance budget and alert on regressions after deployments and major content changes.

There are only two hard things in Computer Science: cache invalidation and naming things.

Turn Core Web Vitals into a fix list

Talk to our team about measuring the real bottlenecks across your pages, users, and delivery path.

Get Started