ETag present

Whether responses carry ETag validators.

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

At a glance the headline numbers for ETag present

Whether responses carry ETag validators.

0.0%
Adoption
0 of 0
With (median LCP)
Without (median LCP)
The State of Web Vitals · Q2 2026 · 189,915 sites · desktop field datacorewebvitals.io/state-of-cwv
2

ETag present sites that have it vs sites that don't

ETag present
0%

0.0% of sites send ETag headers (0 of 0). With send: LCP —, 0.0% pass. Without: LCP —, 0.0% pass. computed

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

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

An ETag is a validator. When a cached file expires, the browser can ask the server whether it changed and get a tiny 304 Not Modified back instead of the whole file. Without a validator, an expired file is downloaded again in full.

Validators matter most for the in-between caching strategies: short TTLs with frequent revisits. For hashed, immutable assets they are redundant because the file never changes under its name. One thing to watch on multi-server setups: default ETags can differ per server, and a mismatched ETag silently turns every revalidation into a full download.

Related signals Last-Modified present → Uncompressed text responses → Main CDN → HTTP protocol → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (1) — admin only
Query #1: 32.1 ms
SELECT m.headers.has_etag AS val, COUNT(*) AS n,
            quantile_disc(crux."desktop".lcp, 0.5) AS median,
            COUNT(*) FILTER (WHERE crux."desktop".lcp IS NOT NULL AND crux."desktop".lcp <= 2500) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."desktop".lcp IS NOT NULL), 0) AS good,
            COUNT(*) FILTER (WHERE crux."desktop".lcp IS NOT NULL AND crux."desktop".lcp > 2500 AND crux."desktop".lcp <= 4000) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."desktop".lcp IS NOT NULL), 0) AS ni,
            COUNT(*) FILTER (WHERE crux."desktop".lcp IS NOT NULL AND crux."desktop".lcp > 4000) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."desktop".lcp IS NOT NULL), 0) AS poor
            FROM sites WHERE 1=1 GROUP BY m.headers.has_etag;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.50 ms
20260625/loaf-scripts.json 2.40 ms
20260625/menu.json 0.18 ms