LCP distribution

How LCP is distributed across real-user data, plus pass-rate breakdown.

Field data PhoneDesktopAll Scope All sites Q2 2026 edition · Desktop field outcomes
1

At a glance the headline numbers for LCP distribution

How LCP is distributed across real-user data, plus pass-rate breakdown.

0.0%
of sites pass LCP
Typical site
Worst 10% of sites

0.0% of sites pass LCP. The typical site's LCP is . The worst 10% are above .

The State of Web Vitals · Q2 2026 · 189,915 sites · desktop field datacorewebvitals.io/state-of-cwv
2

LCP Distribution the value at each percentile across all sites

0ms
p10
0ms
p25
0ms
p50
0ms
p75
0ms
p90
0ms
p99
2,500ms
4,000ms
The State of Web Vitals · Q2 2026 · 189,915 sites · desktop field datacorewebvitals.io/state-of-cwv
3

Why this matters for the Core Web Vitals, and where to start fixing it

Largest Contentful Paint is when the biggest thing in the viewport finishes rendering, usually the hero image or a headline. It is the moment the page stops looking blank and starts looking loaded, so it is the metric your visitors feel first. A slow LCP is almost always one of a few things: the server takes too long to respond, the image is too big or discovered too late, or render-blocking CSS and fonts hold everything up.

Start with what paints. Find the LCP element, make sure the browser can discover it early, and give it a clear path to the screen. Preload the hero image, serve it in a modern format at the right size, and keep render-blocking resources out of the way. The server side matters too, but the biggest wins are usually in how the main image and the critical CSS are delivered.

Related signals TTFB → FCP → CLS → INP → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (1) — admin only
Query #1: 35.0 ms
SELECT COUNT(*) AS count,
            COUNT(*) FILTER (WHERE crux."desktop".lcp <= 2500) * 1.0 / COUNT(*) AS good,
            COUNT(*) FILTER (WHERE crux."desktop".lcp > 2500 AND crux."desktop".lcp <= 4000) * 1.0 / COUNT(*) AS needs_improvement,
            COUNT(*) FILTER (WHERE crux."desktop".lcp > 4000) * 1.0 / COUNT(*) AS poor,
            quantile_disc(crux."desktop".lcp, 0.10) AS p10,
            quantile_disc(crux."desktop".lcp, 0.25) AS p25,
            quantile_disc(crux."desktop".lcp, 0.50) AS p50,
            quantile_disc(crux."desktop".lcp, 0.75) AS p75,
            quantile_disc(crux."desktop".lcp, 0.90) AS p90,
            quantile_disc(crux."desktop".lcp, 0.99) AS p99
            FROM sites WHERE 1=1 AND crux."desktop".lcp IS NOT NULL;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.64 ms
20260625/loaf-scripts.json 0.49 ms
20260625/menu.json 0.18 ms