Have you ever stared at an LCP number and thought, "Great, now what?" You know your Largest Contentful Paint time is 3.2 seconds. You know that's not good. But a single number doesn't tell you why it's slow, or what to do about it. That's where subparts come in. When you know how to read them, they turn a vague "this page is slow" into a specific, fixable problem.

The general playbook, whether you're chasing LCP or INP:
Below is a practical walkthrough of how to debug LCP and INP using their subparts, plus what to do about CLS (which, annoyingly, doesn't have subparts at all).

Subparts are the phases that make up a Core Web Vitals metric. Instead of one number, you get a breakdown of where the time actually went.
They map to the lifecycle of how your largest content element gets onto the screen:
One important caveat: subparts only apply to images and videos. If your LCP element is text, you'll see dashes instead of a breakdown, because we don't yet have a good way to measure how long something like a web font took to affect that text.
They map to what happens when a visitor interacts with your page:
It's not a time-based metric, so there's nothing to break into phases. We'll cover how to approach it separately, further down.
Here's the process, roughly in the order you'd actually do it:
Start with your Web Vitals dashboard, filtered down to the page or section you care about.
Don't just glance at the topline LCP number – that 75th percentile figure can be deceptively fast-looking or slow-looking depending on what's hiding underneath it. A marketing site that feels fast when you click around can still have a 75th percentile LCP of nearly 3 seconds. Numbers lie by omission; distributions don't.

Once you've found a page worth investigating, drill into the LCP subpart breakdown. This tells you which phase is eating the time.
A common pattern: resource load delay is high, but download time and render time are both fast. That means the browser took a long time to even realize it needed the image – it downloaded quickly once asked.

This is the step people skip, and it's often the most revealing one.
Look at what's actually being detected as your LCP element. You might find that 44% of the time it's a heading (no subparts, since it's text), and 15% of the time it's an unexpected image – like something in the footer. If a chunk of your sessions are landing on a completely different LCP element than you assumed, your aggregates are being pulled around by two (or more) different problems at once.

The same element can behave very differently on desktop vs. mobile. A footer image that's rarely LCP on desktop might be the dominant LCP culprit on mobile, simply because of how the layout stacks.

Once you know the element and the viewport, open DevTools, match the viewport size, throttle CPU and network to approximate what your real users are experiencing, and search for the specific element to confirm it's the one being flagged.
A couple of things to watch for:
High TTFB? Get your HTML back faster. Good is under 800ms by CrUX standards, but honestly, if you're slower than 300ms, there's room to improve.
High resource load delay? This usually means the browser didn't know about your LCP resource soon enough:
fetchpriority="high" on the image. One underrated benefit of using fetchpriority instead of a separate <link rel="preload">: it keeps the priority hint in one place (the image tag itself) instead of two places that can drift out of sync — we've seen sites end up preloading an image that isn't even used on the page anymore.<picture> and srcset instead.High resource load duration? Pick the right format, compress it, and make sure it's not fighting other resources for bandwidth.
High render delay? This one's trickier, because it's often caused by the browser being busy with something else. Ironically, preloading your LCP image can shift time here rather than eliminate it — the image arrives sooner, but there's now a wait between "downloaded" and "displayed." That's not necessarily a red flag; it's usually still a net win. Just know where the trade-off shows up.
INP breaks down the same way conceptually – find the phase, then find the cause.
Same starting point as LCP: look at the distribution, not just the aggregate, and look for spikes over time.
Drill into which specific elements people are clicking on when INP is bad. This tells you where to focus rather than guessing.

This is the good part. LoAF data lets you see which scripts are contributing to slow interactions – both overall, and broken down by which phase they're affecting.

One note on reproducing input delay: it's hard to emulate in DevTools, because it depends entirely on when your visitor clicked and what else happened to be running on the page at that exact moment. That's a case where the real-user data is doing work synthetic testing can't easily replicate.
High input delay? Can the competing script be broken up, run sooner, or deferred to run later? This tends to show up on pages that render content quickly and encourage people to interact immediately – while some background script is still finishing up.
High processing duration? Do less work in the handler, or break it into smaller chunks.
High presentation delay? Reduce style and layout work. Lean on CSS for styling rather than triggering reflows, avoid resizing elements, and check whether handlers like Intersection Observer are doing unnecessary work during the render phase.
CLS doesn't have subparts, but layout shifts generally happen for one of three reasons:
Added and removed elements are the hardest to detect after the fact, since once something's removed, you can no longer query its original size. A few ways to actually dig in:
If you're drilling into a specific page, element, or segment and the data looks grayed out or noisy, you're running into a sample size problem. A few ways to work around it:
It's also worth checking how you're grouping your data in the first place. Two opposite problems show up a lot:
A single Core Web Vitals number tells you that something's wrong. Subparts tell you where to look next. The general playbook, whether you're chasing LCP or INP:
And if the data's too thin to draw conclusions from yet, that's useful information too. Just don't mistake "not statistically significant" for "not worth looking at."
Created by Andy Davies • Last updated 17 Aug 2026