Cloudflare's BEACON Dataset: What 10,000 Sites of Field Data Reveal About Where Your LCP and INP Time Actually Goes
Cloudflare opened billions of anonymized real-user Core Web Vitals measurements in BigQuery on September 28, 2026. The sub-part tables show image downloads were never your bottleneck — render delay and main-thread work are.
Cloudflare's BEACON Dataset: What 10,000 Sites of Field Data Reveal About Where Your LCP and INP Time Actually Goes
On September 28, 2026, Cloudflare published BEACON: billions of anonymized real-user measurements from the 10,000 largest sites on its network, free in Google BigQuery. And its sub-part tables say something uncomfortable for most performance audits: in the "Poor" band, downloading the resource averages 119ms — exactly the same as in the "Good" band — while render delay hits 2,002ms and the main thread eats 284ms of every failed interaction. Your compressed image was never the bottleneck.
We have started performance audits the same way for a decade: "compress the images." BEACON is probably the largest field dataset ever opened to the public, and the flattest row in its tables is the one we optimize the most.
What BEACON is (and why it isn't CrUX under a new name)
BEACON stands for Browser Experience Across Cloudflare's Observed Network. It is an anonymized dataset built from billions of real-world performance measurements across the 10,000 largest websites on Cloudflare's network, covers every major browser engine, updates daily in Google BigQuery, and follows the standard defined by the community-led RUM Archive, a public Real User Monitoring database that BEACON expands roughly 100-fold. The full announcement is in Cloudflare's September 28, 2026 blog post.
The practical difference from CrUX is not small:
| CrUX (Chrome UX Report) | BEACON | |
|---|---|---|
| Engines | Chrome only | Blink, WebKit and Gecko |
| Scope | Your origin (or domains you pick) | 10,000 aggregated sites by industry/country/device |
| Format | Percentiles per origin | Full histograms (any percentile: p50, p90, p95) |
| LCP and INP sub-parts | Limited | Yes, banded Good/NI/Poor |
| Cost | Free | Free, in BigQuery |
One detail already changes meetings: BEACON publishes full histograms instead of the usual p75. Once you can look at p90 and p95, you find that several industries collapse in the long tail — especially visual stability (CLS) — and that information had been hiding behind a single number.
The LCP table that should reorder your audit
BEACON breaks LCP into four stages and buckets them into Google's three bands:
| LCP sub-part | Good | Needs improvement | Poor |
|---|---|---|---|
| Document TTFB | 598ms | 1,015ms | 1,891ms |
| Load delay (candidate discovery) | 76ms | 1,049ms | 1,485ms |
| Load duration (resource download) | 119ms | 199ms | 119ms |
| Render delay (candidate paint) | 157ms | 437ms | 2,002ms |
The row that should annoy any agency is the third: download time in the "Poor" band (119ms) is identical to the "Good" band (119ms) and lower than "Needs improvement" (199ms). The slowest pages on the web are not downloading slower — they download at the same speed. What separates them is 2,002ms to paint their main content and 1,485ms just to discover which element to paint.
Cloudflare states it plainly: downloading the resource itself — image, font, or video — typically contributes the least to perceived loading time. The bigger opportunities are discovering the LCP candidate and unblocking its render.
Our read is harsher: image compression is the performance task with the best effort-to-impression ratio and the worst effort-to-impact ratio that exists. It takes an afternoon, it demos beautifully in Lighthouse, and in the field it moves a row that was already green. The real work — preload, fetchpriority, removing render-blocking resources, cutting TTFB with edge cache — is less photogenic, and it is where the 2,002ms live.
INP: you are almost never waiting — you are processing and painting badly
The INP breakdown tells the same story from the other side:
| INP sub-part | Good | Needs improvement | Poor |
|---|---|---|---|
| Input delay (waiting on the main thread) | 18ms | 32ms | 84ms |
| Processing time (handlers) | 55ms | 112ms | 284ms |
| Presentation delay (painting the next frame) | 56ms | 111ms | 217ms |
Input delay — the main-thread queue — barely grows (18ms → 84ms). What explodes is processing the interaction (284ms) and painting the result (217ms). In the slowest interactions, JavaScript execution dominates, but Cloudflare highlights the jump in presentation delay, typically driven by complex CSS layout recalculations: deep DOM, expensive selectors, styles that change geometry at click time.
This is where our article on debugging INP with LoAF and scheduler.yield() becomes the natural diagnostic layer: BEACON tells you which stage fails at industry scale, LoAF tells you which script blocks it on your page.
The SPA tradeoff, finally with numbers
BEACON also supports Chrome's new Soft Navigations API, and the numbers in the SPA vs MPA debate are no longer opinions:
| LCP by percentile | P50 | P75 | P90 | P95 |
|---|---|---|---|---|
| Hard navigation (reload) | 791ms | 1,421ms | 2,636ms | 4,122ms |
| Soft navigation (SPA) | 274ms | 582ms | 1,169ms | 1,816ms |
| Landing page (initial load) | 1,370ms | 2,681ms | 5,397ms | 8,940ms |
Soft navigations are two to three times faster at every percentile. Also true: the landing page that enables them costs 2,681ms at p75 — nearly five times the soft navigation that follows it. Cloudflare's conclusion matches what we argued in our analysis of Chrome's ICP and soft-navigation metrics: if users rarely move past the landing page, that heavier first load never pays for itself. The hybrid framework — the one behind this site and the projects we ship with Astro in production — keeps winning this argument because it gets both sides without forcing the debate.
What changed in our checklist (and the one we propose)
Eight months ago we published an analysis of the ad-load metrics Chrome added to CrUX and were already saying something similar: field data is being opened layer by layer. BEACON is the largest layer so far. Our audit order now looks like this:
| Old order (the usual one) | Order rewritten with BEACON |
|---|---|
| 1. Compress and convert images | 1. TTFB: edge cache, static HTML, fast origin |
| 2. CDN and assets | 2. Discovery: preload/fetchpriority on the LCP candidate |
| 3. Defer JavaScript | 3. Render: remove CSS/JS blocking first paint |
| 4. Fix CLS | 4. Main-thread budget: handlers + DOM depth + layout recalcs |
| 5. Cache and edge | 5. Bytes (images, fonts, video) — last, with load duration already green |
Bytes still matter: on projects with heavy video and galleries we keep enforcing strict page-weight budgets. But leaving them in first place was a comfort decision, not a data decision. With BEACON, the client conversation shifts from "let's change the format of 40 images" to "your LCP candidate takes 1.4 seconds to be discovered because it depends on JavaScript."
Where BEACON will mislead you if you are not careful
Three limits we keep in mind before citing it in a meeting:
- It is not your site. These are the 10,000 largest on Cloudflare's network, running enterprise-grade infrastructure. Your SMB client is almost certainly not in the sample, and the aggregated bands do not distinguish CMS or technology.
- It is a benchmark, not your RUM. Use it to prioritize — if your field sub-parts look like the Poor band, you know where to attack — but the only answer to "do we pass Core Web Vitals?" still comes from your own users, measured with
web-vitalsor your RUM dashboard. - There is vendor interest behind it. The announcement itself recommends Smart Hints for resource discovery and Zaraz for third-party JavaScript. The data is open and verifiable; the solutions it suggests are theirs. Read both at the same pace.
What to do this week with BEACON
Open the dataset in BigQuery (Cloudflare ships the queries from every table in this post as templates), run the LCP and INP sub-part tables, and compare them with your own field percentiles. If your page looks like BEACON's "Good" band, leave it alone and spend the time on what actually fails. If it looks like "Poor", you already have the attack order: discovery, render, main thread — and bytes, last.
The question is no longer whether your site is fast on your laptop. It is whether the open data from 10,000 sites says it is fast for everyone.
Frequently Asked Questions
What is the Cloudflare BEACON dataset?
BEACON (Browser Experience Across Cloudflare's Observed Network) is a free, anonymized dataset of billions of real-user performance measurements from the 10,000 largest sites on Cloudflare's network. It covers every major browser engine, updates daily in Google BigQuery, and follows the RUM Archive standard.
How is BEACON different from CrUX or PageSpeed Insights?
CrUX only measures Chrome and reports per-origin; PageSpeed Insights shows you a single page. BEACON crosses all three engines (Blink, WebKit, Gecko), groups by industry, country and device, and publishes full histograms with LCP and INP sub-parts — not just the 75th percentile.
Can BEACON tell me whether MY site passes Core Web Vitals?
No. BEACON is an aggregate benchmark of other sites, not your RUM. Use it to prioritize: if your field sub-parts resemble BEACON's Poor band, you know where to attack first. To know whether your site passes, keep measuring your own users with web-vitals or your RUM dashboard.



