Sharajdev

Core Web Vitals Debugging Checklist for QA Engineers

"The page feels slow" is not a bug report. This checklist turns it into one: which metric is failing, how to reproduce it, where the time actually goes, and what to hand the developer so the fix doesn't bounce back.

By Sharaj Rewoo · Updated 25 September 2026

The three metrics and their thresholds

Core Web Vitals are three user-centric measurements Google uses to describe loading, visual stability and responsiveness. Each has a "good" threshold, and a page passes when it meets that threshold for at least 75% of real page views (the 75th percentile, or p75), measured separately on mobile and desktop.

MetricWhat it measuresGoodNeeds improvementPoor
LCP — Largest Contentful PaintWhen the largest image or text block in the viewport finished rendering≤ 2.5 s2.5–4.0 s> 4.0 s
CLS — Cumulative Layout ShiftHow much visible content unexpectedly moves (largest burst of shifts)≤ 0.10.1–0.25> 0.25
INP — Interaction to Next PaintDelay between a click, tap or key press and the next frame being painted, across the whole visit≤ 200 ms200–500 ms> 500 ms

INP replaced First Input Delay (FID) as a Core Web Vital in March 2024. The difference matters for testing: FID only measured the input delay of the first interaction, so a page could pass FID while every later click stalled. INP looks at essentially every interaction in the visit and reports one of the worst, and it includes processing time and rendering time, not just the wait before your handler starts. If an old test plan still says "check FID", update it.

Lab data vs field data — know which one you're looking at

Most perf arguments between QA and development are really arguments between two data sources.

A green Lighthouse score does not mean the page passes Core Web Vitals, and a red one doesn't mean it fails. Lab runs a cold load on an empty session; users arrive logged in, with a cart, a feature flag and a third-party chat widget. Use field data to decide whether there's a problem and which metric; use lab tools to find out why.

A useful middle ground for QA is measuring your own real sessions while you test. PerfLens does this: it observes the pages you actually browse and reports live LCP, INP and CLS, long tasks, layout shifts and resource weight, entirely on-device, with a DevTools panel for the detail. That lets you attach "measured during this exact flow" numbers to a bug instead of a synthetic score.

Before you start: set up a reproducible environment

LCP checklist

LCP breaks down into four sub-parts. Finding which one is big tells you who owns the fix.

How to reproduce: record a page load in the Performance panel (the reload button in the panel). The LCP marker appears on the timings track; click it to highlight the element. Newer versions of Chrome also show an LCP breakdown in the insights sidebar.

What to check:

CLS checklist

CLS is the one QA catches best, because it's the one users feel as "I clicked the wrong button". It's measured over the whole page lifetime, not just load, and it's reported as the largest burst ("session window") of shifts.

How to reproduce: in the Performance panel, layout shifts appear on their own track; select one to see which elements moved. In the Rendering drawer (⋮ → More tools → Rendering), enable "Layout Shift Regions" to flash shifted areas in blue as they happen. Shifts within 500 ms of a user input are excluded from CLS by design, so a menu opening after a click is fine; content jumping on its own is not.

What to check:

Test at multiple viewport widths. A layout that's stable at 1440px can shift badly at 375px when a line of text wraps.

INP checklist

INP is the hardest to test because it depends on what the user does. Lab tools that only load the page will never find it — you have to interact.

Each interaction has three phases:

How to reproduce: start a Performance recording with CPU throttling on, perform the slow interaction, stop. The Interactions track shows each interaction with its duration; click one to see the phases and the long task underneath it. The live metrics view in the Performance panel also shows INP updating as you interact, with the slowest interaction called out.

What to test and check:

The typical fixes are to show feedback first and do the heavy work after (yield to the main thread, e.g. with setTimeout or scheduler.yield() where supported), debounce input handlers, virtualise long lists, and move expensive computation off the main thread.

Long tasks: the common root cause

A long task is any piece of main-thread work that runs for more than 50 ms. While it runs, the browser can't respond to input or paint — which is why long tasks drive both INP (input delay) and LCP (render delay) problems, and why Lighthouse's TBT correlates with INP.

In the Performance panel, long tasks are marked with a red triangle on the main thread track. Expand one and read the flame chart bottom-up: the widest bars at the bottom are where the time is. The Bottom-Up tab, grouped by domain or by URL, quickly shows whether the time belongs to your bundle or to a third party. That distinction decides who gets the bug — and it's worth writing in the report.

Common offenders: large JavaScript bundles evaluated on load, framework hydration of the whole page, tag managers and analytics, A/B testing scripts that run synchronously in the head, chat widgets, and JSON parsing of large API responses.

How to write a performance bug report that gets fixed

Perf bugs get closed as "can't reproduce" more than any other kind. A good report removes every reason to do that:

Make it part of the regression cycle

Performance regresses quietly, one dependency or one tracking script at a time. A few habits keep it visible:

Quick reference

SymptomLikely metricFirst place to look
Hero appears lateLCPLazy-loaded or late-discovered LCP image, TTFB
Blank page, then everything at onceLCPRender-blocking JS/CSS, client-side rendering waiting on API
Clicked the wrong thingCLSUnsized images, injected banners, font swap
Button does nothing for a momentINP (input delay)Long tasks during load, third-party scripts
Typing lagsINP (processing)Per-keystroke handlers, no debounce
UI freezes after click on big pagesINP (presentation)Large DOM updates, layout thrashing

Related