Scripts per page

How many scripts the page runs and their over-the-wire weight.

Field data PhoneDesktopAll Scope All sites Q2 2026 edition · Phone field outcomes
Metric LCP INP CLS
1

At a glance the headline numbers for Scripts per page

How many scripts the page runs and their over-the-wire weight.

26
Median (p50)
180,899 sites
49
p75
156
p99
Long tail
The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
2

Distribution & median INP site count and median INP at each level of scripts per page — n

0ms 63ms 125ms 188ms 250ms
200ms
0 9927 19854
5–9 10–14 15–19 20–24 25–29 30–34 35–39 40–44 45–49 50–54 55–59 60–64 65–69 70–74 75–79 80+
Good (≤200ms) Needs improvement Poor (>500ms) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
3

Passing INP by scripts per page — n which level passes the INP most often

Scripts per page — nSitesPassing INPINP
5–9 14,865 82% 103ms
10–14 19,854 92% 91ms
15–19 17,447 94% 94ms
20–24 15,796 93% 95ms
25–29 13,865 94% 95ms
30–34 11,862 95% 96ms
35–39 10,243 93% 100ms
40–44 8,512 95% 101ms
45–49 7,105 94% 103ms
50–54 5,958 94% 104ms
55–59 5,141 94% 103ms
60–64 4,201 93% 105ms
65–69 3,530 94% 105ms
70–74 3,664 93% 103ms
75–79 3,602 93% 102ms
80+ 17,893 90% 116ms
Good Needs Improvement Poor Faded rows: under 100 sites

Scripts per page — n 26. p75 49. p99 156. At the low end (5–9): INP 103ms. At the high end (80+): INP 116ms. computed

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

Script weight is the most expensive weight. A kilobyte of JavaScript costs more than a kilobyte of image, because after the download it is parsed, compiled and executed on the main thread. That is the same thread that must answer every click and keystroke, which is why script totals track INP.

The count matters next to the bytes: every script is a potential long task and another spot for the main thread to stall. Most pages would lose nothing by deferring most of their scripts. The ones that truly must run early are rare.

How do scripts affect the Core Web Vitals?

Scripts per page correlates with the INP. Where the script count is low, 82% of sites pass the INP. Where it is high, 90% do. The rise is gradual.

Related signals DOM size → Page weight & requests → Image source mix → Stylesheet loading mix → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (3) — admin only
Query #1: 294.5 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.scripts.total.n, 0.10) AS p10,
            quantile_disc(m.scripts.total.n, 0.25) AS p25,
            quantile_disc(m.scripts.total.n, 0.50) AS p50,
            quantile_disc(m.scripts.total.n, 0.75) AS p75,
            quantile_disc(m.scripts.total.n, 0.90) AS p90,
            quantile_disc(m.scripts.total.n, 0.99) AS p99
            FROM sites WHERE m.scripts.total.n IS NOT NULL;
Query #2: 284.9 ms
SELECT CASE WHEN m.scripts.total.n >= 5 AND m.scripts.total.n < 10 THEN 0 WHEN m.scripts.total.n >= 10 AND m.scripts.total.n < 15 THEN 1 WHEN m.scripts.total.n >= 15 AND m.scripts.total.n < 20 THEN 2 WHEN m.scripts.total.n >= 20 AND m.scripts.total.n < 25 THEN 3 WHEN m.scripts.total.n >= 25 AND m.scripts.total.n < 30 THEN 4 WHEN m.scripts.total.n >= 30 AND m.scripts.total.n < 35 THEN 5 WHEN m.scripts.total.n >= 35 AND m.scripts.total.n < 40 THEN 6 WHEN m.scripts.total.n >= 40 AND m.scripts.total.n < 45 THEN 7 WHEN m.scripts.total.n >= 45 AND m.scripts.total.n < 50 THEN 8 WHEN m.scripts.total.n >= 50 AND m.scripts.total.n < 55 THEN 9 WHEN m.scripts.total.n >= 55 AND m.scripts.total.n < 60 THEN 10 WHEN m.scripts.total.n >= 60 AND m.scripts.total.n < 65 THEN 11 WHEN m.scripts.total.n >= 65 AND m.scripts.total.n < 70 THEN 12 WHEN m.scripts.total.n >= 70 AND m.scripts.total.n < 75 THEN 13 WHEN m.scripts.total.n >= 75 AND m.scripts.total.n < 80 THEN 14 WHEN m.scripts.total.n >= 80 THEN 15 END AS bucket_idx, COUNT(*) AS n,
            quantile_disc(crux."phone".inp, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."phone".inp IS NOT NULL AND crux."phone".inp <= 200) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."phone".inp IS NOT NULL), 0) AS good_pct
            FROM sites WHERE m.scripts.total.n IS NOT NULL GROUP BY bucket_idx;
Query #3: 15.9 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.scripts.total.size, 0.10) AS p10,
            quantile_disc(m.scripts.total.size, 0.25) AS p25,
            quantile_disc(m.scripts.total.size, 0.50) AS p50,
            quantile_disc(m.scripts.total.size, 0.75) AS p75,
            quantile_disc(m.scripts.total.size, 0.90) AS p90,
            quantile_disc(m.scripts.total.size, 0.99) AS p99
            FROM sites WHERE m.scripts.total.size IS NOT NULL;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.58 ms
20260625/loaf-scripts.json 0.72 ms
20260625/menu.json 0.20 ms