INP distribution

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

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

At a glance the headline numbers for INP distribution

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

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

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

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

INP Distribution the value at each percentile across all sites

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

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

Interaction to Next Paint measures how quickly the page responds when someone taps, clicks or types. It is the interactivity metric, and it is the one most sites struggle with, because it is decided by JavaScript. When the main thread is busy parsing and running scripts, it cannot respond to the interaction, and the visitor waits. Third-party tags and heavy frameworks are the usual cause.

Start by finding what runs on the main thread and cutting it down. Remove the scripts you do not need, defer the ones you do, and break up the long tasks that block input. Yielding to the main thread between chunks of work lets the browser handle interactions in between, instead of making the user wait for a long task to finish.

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