Page weight & requests

Every request the page makes on a cold load: request count and total transfer size over the wire.

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

At a glance the headline numbers for Page weight & requests

Every request the page makes on a cold load: request count and total transfer size over the wire.

71
request count
on the typical page
2.3 MB
page weight
on the typical page
4.5 MB
1 in 4 pages exceed this
page weight
185,486
sites measured
phone field data

The typical page weighs 2.3 MB across 71 requests.

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

Distribution & median CLS site count and median CLS at each level of page weight & requests — n

0.00 0.04 0.08 0.11 0.15
0.1
0 8896 17791
20–29 30–39 40–49 50–59 60–69 70–79 80–89 90–99 100–109 110–119 120–129 130–139 140–149 150–159 160–169 170–179 180–189 190–199 200+
Good (≤0.1) Needs improvement Poor (>0.25) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
3

Passing CLS by page weight & requests — n which level passes the CLS most often

Page weight & requests — nSitesPassing CLSCLS
20–29 17,500 92% 0.00
30–39 15,496 92% 0.00
40–49 15,953 92% 0.00
50–59 15,288 91% 0.00
60–69 14,180 89% 0.00
70–79 12,620 88% 0.00
80–89 11,068 88% 0.00
90–99 9,527 87% 0.00
100–109 7,902 86% 0.00
110–119 6,786 86% 0.00
120–129 5,886 87% 0.00
130–139 4,970 86% 0.00
140–149 4,249 86% 0.00
150–159 3,685 86% 0.00
160–169 3,200 85% 0.00
170–179 2,716 84% 0.00
180–189 2,254 85% 0.00
190–199 2,010 86% 0.00
200+ 17,791 86% 0.00
Good Needs Improvement Poor Faded rows: under 100 sites

Page weight & requests — n 71. p75 120. p99 439. At the low end (20–29): CLS 0.00. At the high end (200+): CLS 0.00. computed

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

Distribution & median CLS site count and median CLS at each level of page weight & requests — size

0.00 0.04 0.08 0.11 0.15
0.1
0 11273 22545
0–499 500–999 1000–1499 1500–1999 2000–2499 2500–2999 3000–3499 3500–3999 4000–4499 4500–4999 5000–5499 5500–5999 6000–6499 6500–6999 7000–7499 7500–7999 8000–8499 8500–8999 9000–9499 9500+
Good (≤0.1) Needs improvement Poor (>0.25) Site count
The State of Web Vitals · Q2 2026 · 189,915 sites · phone field datacorewebvitals.io/state-of-cwv
5

Passing CLS by page weight & requests — size which level passes the CLS most often

Page weight & requests — sizeSitesPassing CLSCLS
0–499 22,545 92% 0.00
500–999 17,750 93% 0.00
1000–1499 20,558 92% 0.00
1500–1999 19,967 90% 0.00
2000–2499 17,316 89% 0.00
2500–2999 14,268 89% 0.00
3000–3499 11,420 87% 0.00
3500–3999 9,259 88% 0.00
4000–4499 7,415 86% 0.00
4500–4999 6,113 87% 0.00
5000–5499 4,998 86% 0.00
5500–5999 4,129 87% 0.00
6000–6499 3,721 85% 0.00
6500–6999 3,032 87% 0.00
7000–7499 2,570 85% 0.00
7500–7999 2,346 84% 0.00
8000–8499 1,936 85% 0.00
8500–8999 1,711 84% 0.00
9000–9499 1,487 87% 0.00
9500+ 17,589 85% 0.00
Good Needs Improvement Poor Faded rows: under 100 sites

Page weight & requests — size 2.3 MB. p75 4.5 MB. p99 33.3 MB. At the low end (0–499 KB): CLS 0.00. At the high end (9500+ KB): CLS 0.00. computed

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

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

Page weight is a bandwidth problem. The network can only move so many bytes per second and every resource on the page competes for that capacity. The LCP image does not load alone. It shares bandwidth with every script, stylesheet and tracking pixel that loads at the same time. A heavier page means the main content arrives later.

Request count matters next to the bytes. Every request adds queueing and scheduling overhead. On a busy connection important requests wait behind unimportant ones. Script bytes keep costing after the download. The main thread has to parse and execute them, and that delays interactions (INP). The resource type breakdown shows where the bytes sit.

Related signals Cookies per site → Stylesheet initiator → Script coverage (used vs unused) → font-display strategy → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (4) — admin only
Query #1: 163.5 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.network.total.n, 0.10) AS p10,
            quantile_disc(m.network.total.n, 0.25) AS p25,
            quantile_disc(m.network.total.n, 0.50) AS p50,
            quantile_disc(m.network.total.n, 0.75) AS p75,
            quantile_disc(m.network.total.n, 0.90) AS p90,
            quantile_disc(m.network.total.n, 0.99) AS p99
            FROM sites WHERE m.network.total.n IS NOT NULL;
Query #2: 173.6 ms
SELECT CASE WHEN m.network.total.n >= 20 AND m.network.total.n < 30 THEN 0 WHEN m.network.total.n >= 30 AND m.network.total.n < 40 THEN 1 WHEN m.network.total.n >= 40 AND m.network.total.n < 50 THEN 2 WHEN m.network.total.n >= 50 AND m.network.total.n < 60 THEN 3 WHEN m.network.total.n >= 60 AND m.network.total.n < 70 THEN 4 WHEN m.network.total.n >= 70 AND m.network.total.n < 80 THEN 5 WHEN m.network.total.n >= 80 AND m.network.total.n < 90 THEN 6 WHEN m.network.total.n >= 90 AND m.network.total.n < 100 THEN 7 WHEN m.network.total.n >= 100 AND m.network.total.n < 110 THEN 8 WHEN m.network.total.n >= 110 AND m.network.total.n < 120 THEN 9 WHEN m.network.total.n >= 120 AND m.network.total.n < 130 THEN 10 WHEN m.network.total.n >= 130 AND m.network.total.n < 140 THEN 11 WHEN m.network.total.n >= 140 AND m.network.total.n < 150 THEN 12 WHEN m.network.total.n >= 150 AND m.network.total.n < 160 THEN 13 WHEN m.network.total.n >= 160 AND m.network.total.n < 170 THEN 14 WHEN m.network.total.n >= 170 AND m.network.total.n < 180 THEN 15 WHEN m.network.total.n >= 180 AND m.network.total.n < 190 THEN 16 WHEN m.network.total.n >= 190 AND m.network.total.n < 200 THEN 17 WHEN m.network.total.n >= 200 THEN 18 END AS bucket_idx, COUNT(*) AS n,
            quantile_disc(crux."phone".cls, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL AND crux."phone".cls <= 0.1) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL), 0) AS good_pct
            FROM sites WHERE m.network.total.n IS NOT NULL GROUP BY bucket_idx;
Query #3: 98.5 ms
SELECT COUNT(*) AS count,
            quantile_disc(m.network.total.size, 0.10) AS p10,
            quantile_disc(m.network.total.size, 0.25) AS p25,
            quantile_disc(m.network.total.size, 0.50) AS p50,
            quantile_disc(m.network.total.size, 0.75) AS p75,
            quantile_disc(m.network.total.size, 0.90) AS p90,
            quantile_disc(m.network.total.size, 0.99) AS p99
            FROM sites WHERE m.network.total.size IS NOT NULL;
Query #4: 91.7 ms
SELECT CASE WHEN m.network.total.size >= 0 AND m.network.total.size < 500 THEN 0 WHEN m.network.total.size >= 500 AND m.network.total.size < 1000 THEN 1 WHEN m.network.total.size >= 1000 AND m.network.total.size < 1500 THEN 2 WHEN m.network.total.size >= 1500 AND m.network.total.size < 2000 THEN 3 WHEN m.network.total.size >= 2000 AND m.network.total.size < 2500 THEN 4 WHEN m.network.total.size >= 2500 AND m.network.total.size < 3000 THEN 5 WHEN m.network.total.size >= 3000 AND m.network.total.size < 3500 THEN 6 WHEN m.network.total.size >= 3500 AND m.network.total.size < 4000 THEN 7 WHEN m.network.total.size >= 4000 AND m.network.total.size < 4500 THEN 8 WHEN m.network.total.size >= 4500 AND m.network.total.size < 5000 THEN 9 WHEN m.network.total.size >= 5000 AND m.network.total.size < 5500 THEN 10 WHEN m.network.total.size >= 5500 AND m.network.total.size < 6000 THEN 11 WHEN m.network.total.size >= 6000 AND m.network.total.size < 6500 THEN 12 WHEN m.network.total.size >= 6500 AND m.network.total.size < 7000 THEN 13 WHEN m.network.total.size >= 7000 AND m.network.total.size < 7500 THEN 14 WHEN m.network.total.size >= 7500 AND m.network.total.size < 8000 THEN 15 WHEN m.network.total.size >= 8000 AND m.network.total.size < 8500 THEN 16 WHEN m.network.total.size >= 8500 AND m.network.total.size < 9000 THEN 17 WHEN m.network.total.size >= 9000 AND m.network.total.size < 9500 THEN 18 WHEN m.network.total.size >= 9500 THEN 19 END AS bucket_idx, COUNT(*) AS n,
            quantile_disc(crux."phone".cls, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL AND crux."phone".cls <= 0.1) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL), 0) AS good_pct
            FROM sites WHERE m.network.total.size IS NOT NULL GROUP BY bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.52 ms
20260625/loaf-scripts.json 0.30 ms
20260625/menu.json 0.10 ms