INP distribution
How INP is distributed across real-user data, plus pass-rate breakdown.
At a glance the headline numbers for INP distribution
How INP is distributed across real-user data, plus pass-rate breakdown.
91.9% of sites pass INP. The typical site's INP is 99ms. The worst 10% are above 183ms.
The INP distribution site count at each INP, from good to poor
The tallest bar is between 80ms and 120ms. 49% of sites are in that one range, 80ms under Google's 200ms limit. Half of all sites are at 99ms or less. The worst 10% are above 183ms and the worst 1% above 392ms. That is 4 times the typical site.
The INP pass rate the share of sites that are good, needs improvement and poor
91.9% of sites pass INP. 7.5% are in the needs improvement band, between 200ms and 500ms. 0.6% are poor, above 500ms. A miss is usually needs improvement, not poor.
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.
How are sites doing on INP?
91.9% of sites have a good INP. The typical site sits at 128ms at the 75th percentile; the slowest 1% pass 392ms.
Chrome field data from 189,915 sites, representing millions of real page loads. How we measured.
Live queries (2) — admin only
SELECT COUNT(*) AS count,
COUNT(*) FILTER (WHERE crux."phone".inp <= 200) * 1.0 / COUNT(*) AS good,
COUNT(*) FILTER (WHERE crux."phone".inp > 200 AND crux."phone".inp <= 500) * 1.0 / COUNT(*) AS needs_improvement,
COUNT(*) FILTER (WHERE crux."phone".inp > 500) * 1.0 / COUNT(*) AS poor,
quantile_disc(crux."phone".inp, 0.10) AS p10,
quantile_disc(crux."phone".inp, 0.25) AS p25,
quantile_disc(crux."phone".inp, 0.50) AS p50,
quantile_disc(crux."phone".inp, 0.75) AS p75,
quantile_disc(crux."phone".inp, 0.90) AS p90,
quantile_disc(crux."phone".inp, 0.99) AS p99
FROM sites WHERE 1=1 AND crux."phone".inp IS NOT NULL;
SELECT CASE WHEN crux."phone".inp >= 0 AND crux."phone".inp < 40 THEN 0 WHEN crux."phone".inp >= 40 AND crux."phone".inp < 80 THEN 1 WHEN crux."phone".inp >= 80 AND crux."phone".inp < 120 THEN 2 WHEN crux."phone".inp >= 120 AND crux."phone".inp < 160 THEN 3 WHEN crux."phone".inp >= 160 AND crux."phone".inp < 200 THEN 4 WHEN crux."phone".inp >= 200 AND crux."phone".inp < 240 THEN 5 WHEN crux."phone".inp >= 240 AND crux."phone".inp < 280 THEN 6 WHEN crux."phone".inp >= 280 AND crux."phone".inp < 320 THEN 7 WHEN crux."phone".inp >= 320 AND crux."phone".inp < 360 THEN 8 WHEN crux."phone".inp >= 360 AND crux."phone".inp < 400 THEN 9 WHEN crux."phone".inp >= 400 AND crux."phone".inp < 440 THEN 10 WHEN crux."phone".inp >= 440 AND crux."phone".inp < 480 THEN 11 WHEN crux."phone".inp >= 480 AND crux."phone".inp < 520 THEN 12 WHEN crux."phone".inp >= 520 AND crux."phone".inp < 560 THEN 13 WHEN crux."phone".inp >= 560 AND crux."phone".inp < 600 THEN 14 WHEN crux."phone".inp >= 600 AND crux."phone".inp < 640 THEN 15 WHEN crux."phone".inp >= 640 AND crux."phone".inp < 680 THEN 16 WHEN crux."phone".inp >= 680 AND crux."phone".inp < 720 THEN 17 WHEN crux."phone".inp >= 720 AND crux."phone".inp < 760 THEN 18 WHEN crux."phone".inp >= 760 AND crux."phone".inp < 800 THEN 19 WHEN crux."phone".inp >= 800 AND crux."phone".inp < 840 THEN 20 WHEN crux."phone".inp >= 840 AND crux."phone".inp < 880 THEN 21 WHEN crux."phone".inp >= 880 AND crux."phone".inp < 920 THEN 22 WHEN crux."phone".inp >= 920 AND crux."phone".inp < 960 THEN 23 WHEN crux."phone".inp >= 960 AND crux."phone".inp < 1000 THEN 24 WHEN crux."phone".inp >= 1000 THEN 25 END AS bucket_idx, COUNT(*) AS count FROM sites WHERE 1=1 AND crux."phone".inp IS NOT NULL GROUP BY bucket_idx;