INP distribution

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

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

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
99ms
Typical site
183ms
Worst 10% of sites

91.9% of sites pass INP. The typical site's INP is 99ms. The worst 10% are above 183ms.

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

The INP distribution site count at each INP, from good to poor

0 11,074 22,148 33,221 44,295
0ms–40msms72 sites0.1% of all sites
40ms–80msms18,586 sites20.5% of all sites
80ms–120msms44,295 sites48.8% of all sites
120ms–160msms14,949 sites16.5% of all sites
160ms–200msms5,397 sites5.9% of all sites
200ms–240msms2,340 sites2.6% of all sites
240ms–280msms1,489 sites1.6% of all sites
280ms–320msms1,749 sites1.9% of all sites
320ms–360msms690 sites0.8% of all sites
360ms–400msms292 sites0.3% of all sites
400ms–440msms172 sites0.2% of all sites
440ms–480msms110 sites0.1% of all sites
480ms–520msms89 sites0.1% of all sites
520ms–560msms82 sites0.1% of all sites
560ms–600msms68 sites0.1% of all sites
600ms–640msms48 sites0.1% of all sites
640ms–680msms28 sites<0.1% of all sites
680ms–720msms35 sites<0.1% of all sites
720ms–760msms31 sites<0.1% of all sites
760ms–800msms23 sites<0.1% of all sites
800ms–840msms17 sites<0.1% of all sites
840ms–880msms7 sites<0.1% of all sites
880ms–920msms13 sites<0.1% of all sites
920ms–960msms11 sites<0.1% of all sites
960ms–1sms14 sites<0.1% of all sites
1sms and up122 sites0.1% of all sites
p50 = 99ms
p75 = 128ms
p90 = 183ms
p99 = 392ms
0ms–40ms 40ms–80ms 80ms–120ms 120ms–160ms 160ms–200ms 200ms–240ms 240ms–280ms 280ms–320ms 320ms–360ms 360ms–400ms 400ms–440ms 440ms–480ms 480ms–520ms 520ms–560ms 560ms–600ms 600ms–640ms 640ms–680ms 680ms–720ms 720ms–760ms 760ms–800ms 800ms–840ms 840ms–880ms 880ms–920ms 920ms–960ms 960ms–1s 1s+
Good (≤200ms) Needs improvement Poor (>500ms) Percentile markers Total: 90,729 sites

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 State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
3

The INP pass rate the share of sites that are good, needs improvement and poor

INP
91.9%
7.5%
0.6%
Good Needs Improvement 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.

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

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.

Related signals CLS → LCP → FCP → TTFB → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (2) — admin only
Query #1: 79.8 ms
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;
Query #2: 62.7 ms
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;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.74 ms
20260625/loaf-scripts.json 0.49 ms
20260625/menu.json 0.17 ms