Chrome's ad weight tracks demand. Ad density tracks clutter.
Across 12,154 publisher origins, Ad CPU rises with wrappers, identity providers and refresh. Ad Density rises with the ads-to-content ratio and reseller count.
At a glance
We joined Chrome's new CrUX ad metrics for 12,154 publisher origins to Sincera ad-stack data.
- Ad CPU rises with the demand stack: ρ = 0.59 with header-bidding wrappers. Identity providers, ad units and slot refresh show the same pattern.
- Ad Density rises with the layout: ρ = 0.36 with the Sincera ads-to-content ratio (0.41 on mobile), and slightly negative with the stack.
- The two are different signals: Ad CPU and Ad Density correlate at only 0.19.
- Heavy ads go with slower interaction, not slower loading: poor INP rises from 19.8% to 30.3% across Ad CPU quartiles. Poor LCP falls.
- Dense, heavy sites carry twice the resellers: median 530, against 229 to 292 for every other group.
- Better Ads passes dense pages: 154 passing sites have Ad Density of 30% or more.
What to do: Buyers, stop filtering on ad weight and screen on Ad Density plus reseller count. Publishers, track Ad CPU against INP and cost each wrapper and refresh rule before adding it.
Limits: One 28-day period, so associations, not causes. No CPM or revenue data; demand-stack signals stand in for yield.
Background: Chrome added ad metrics to CrUX on 15 September 2026
Chrome now publishes four experimental ad metrics in the Chrome UX Report (CrUX). The metrics come from real Chrome users. They describe how many ads a user sees and how much of the screen the ads use. They also describe the CPU time and network data that the ads consume. We joined these metrics to Sincera crawl data on ad stacks, ad layout and supply chains.
What Chrome measures
Chrome identifies ad frames with its ad detection logic. It then records four values for each page view. CrUX publishes the 75th percentile (p75) of each value for each origin, over a rolling 28-day period.
| Metric | API key | Unit | What Chrome records |
|---|---|---|---|
| Ad Count | experimental_ad_count | Ad frames | The average number of ad frames in the viewport during the visit |
| Ad Density | experimental_ad_density | Percent of viewport | The average share of the viewport that ad frames cover, sampled one time each second |
| Ad Weight: CPU | experimental_ad_cpu | Milliseconds | The total JavaScript execution time of ad frames and their subresources |
| Ad Weight: Network | experimental_ad_kilobytes | Kilobytes | The total data that ad frames and ad resources transfer |
CrUX publishes the 75th percentile of each value per origin over 28 days. Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026
Four conditions control which origins have data:
- CrUX uses only pages that contain ads.
- The origin must have an
ads.txtfile with at least one authorized seller. - The origin must have sufficient eligible Chrome traffic.
- Chrome on iOS and Android WebView do not contribute data.
The metrics have no "good" or "poor" thresholds. Chrome publishes values, not grades. In this report, "high" and "low" refer to positions in our sample, for example quartiles.
Sources: CrUX ad metrics overview, Ad Density, Ad Weight: CPU, tooling guide.
How we measured
Population
We queried the CrUX API for 19,765 publisher origins in the MediaContext rank-based scope. Of these origins, 12,154 (61.5%) have ad metrics. Of the 12,154 origins, 4,261 also have a Sincera profile with ad-stack and supply-chain data.
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, n = 19,765
The CrUX collection period ends on 27 September 2026 for 9,080 origins and on 20 September 2026 for 3,071 origins. Three origins have other end dates. All analyses use origin-level data for all device types.
Sincera signals
Sincera crawls publisher pages and records their ad stacks, ad layout and supply paths. Its data is independent of Chrome. We use these fields:
| Signal | Definition | Use in this report |
|---|---|---|
| Wrappers | Number of header-bidding wrappers detected, for example Prebid or Amazon APS | Demand stack |
| Identity providers | Number of identity solutions detected | Demand stack |
| Ad units | Number of unique ad slot identifiers (GPIDs) observed | Demand stack |
| Refresh share | Percent of ad slots that refresh, desktop and mobile | Demand stack |
| Video players | Number of video players detected | Demand stack |
| Ads in view | Average number of ad units in the viewport | Layout |
| Ads-to-content ratio | Average share of the page that ads occupy | Layout |
| Supply paths | Number of seller paths to the inventory | Supply chain |
| Resellers | Number of reseller relationships | Supply chain |
| Traffic rank | Position in a public traffic ranking | Control |
We have no CPM, revenue or bid-price data. Demand-stack signals show how much demand a site connects to. They do not show what the demand pays.
Statistics
- We use Spearman rank correlation (ρ), because all metrics have skewed distributions.
- Each 95% confidence interval comes from 1,000 bootstrap samples with a fixed seed.
- We correct p-values for 44 tests with the Benjamini-Hochberg method. All correlations that the text cites have q < 0.05. The correlation chart marks the values with q of 0.05 or more.
- Controlled estimates are standardized regression coefficients (β) on ranks. The controls are traffic rank and publisher type. Standard errors are heteroskedasticity-robust (HC3).
- Quartiles and deciles divide the sample into equal-size groups.
The median origin shows one ad on 14% of the screen
The median origin in the sample has one ad frame in view and ads on 14% of the viewport. It uses 2.5 seconds of ad CPU time and 1.7 MB of ad data. The distributions of CPU and network have long right tails.
Ad Count
p25 0.77 · median 1.01 · p75 1.54
Ad Density (%)
p25 10 · median 14 · p75 20
Ad Weight: CPU (ms)
p25 1,319 · median 2,528 · p75 5,333
Ad Weight: Network (KB)
p25 744 · median 1,735 · p75 3,981
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, n = 12,154
| Metric | p10 | p25 | Median | p75 | p90 |
|---|---|---|---|---|---|
| Ad Count | 0.51 | 0.77 | 1.01 | 1.54 | 2.03 |
| Ad Density (%) | 6 | 10 | 14 | 20 | 29 |
| Ad Weight: CPU (ms) | 762 | 1,319 | 2,528 | 5,333 | 8,790 |
| Ad Weight: Network (KB) | 328 | 744 | 1,735 | 3,981 | 6,920 |
Each value is a distribution across origins of each origin's p75. Of 11,860 origins with Ad Density, 1,105 (9.1%) have a p75 of 30% or more.
Weight and density measure different properties
Ad Weight: CPU and Ad Weight: Network are closely related (ρ = 0.82). Ad Density is weakly related to both (ρ = 0.19 and 0.27). Ad Count is in the middle. It relates to weight (0.57) and to density (0.43).
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, n = 12,154
This pattern shows two separate properties. Weight describes the code and data that ads bring to the page. Density describes the space that ads take on the screen. The next two sections show what each property relates to.
Ad weight rises with wrappers, identity providers and refresh
Ad Weight: CPU increases with each demand-stack signal. The strongest relations are with wrapper count (ρ = 0.59), identity providers (0.56), slot refresh on desktop (0.55) and ad units (0.52). The relations stay almost the same after control for traffic rank and publisher type (β = 0.49 to 0.56).
Ad Weight: CPU
Ad Density
Hollow: not significant after correction (q ≥ 0.05)
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, joined to Sincera profiles, n = 4,261
The median Ad CPU of sites with no detected wrapper is 1,362 ms. With three or more wrappers, the median is 4,984 ms. Ad Density does not increase with wrapper count. It decreases from a median of 18% to 14%.
Ad Weight: CPU (ms)
Ad Density (%)
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, joined to Sincera profiles, n = 4,261
The quartiles of Ad CPU show the same pattern:
| Ad CPU quartile | Range (ms) | Sites with a wrapper | Sites with refresh | Median ad units | Median resellers |
|---|---|---|---|---|---|
| Q1 (lowest) | 118 to 1,221 | 21.6% | 14.9% | 3 | 215 |
| Q2 | 1,223 to 2,208 | 37.7% | 28.9% | 8 | 295 |
| Q3 | 2,210 to 4,622 | 72.1% | 59.2% | 22 | 444 |
| Q4 (highest) | 4,628 to 84,343 | 89.9% | 79.7% | 50 | 330 |
A multivariable model gives the separate contribution of each signal to Ad CPU (n = 3,847, R² = 0.47). Slot refresh has the largest coefficient.
| Signal | β | 95% CI |
|---|---|---|
| Refresh share (desktop) | 0.21 | 0.18 to 0.25 |
| Ads in view | 0.16 | 0.13 to 0.19 |
| Wrappers | 0.15 | 0.10 to 0.20 |
| Identity providers | 0.15 | 0.11 to 0.19 |
| Ad units | 0.10 | 0.07 to 0.14 |
| Video players | 0.08 | 0.05 to 0.11 |
| Traffic rank (log) | 0.03 | 0.01 to 0.06 |
Interpretation. In this sample, high ad weight identifies sites that run more auctions, more identity calls and more refreshes. It does not identify sites with more ad space. Chrome's documentation does not state whether header-bidding code in the main page frame counts as ad CPU. If it does, part of this relation comes from the definition of the metric.
Ad density rises with the ads-to-content ratio, not the stack
Ad Density is the only CrUX ad metric with a clear relation to the Sincera ads-to-content ratio. The two values come from different sources and different methods, but they agree (ρ = 0.36, n = 3,793). The agreement is stronger on mobile pages (ρ = 0.41) than on desktop pages (ρ = 0.28).
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, joined to Sincera profiles, n = 3,793
Ad Density has small negative relations with the demand stack. Examples are wrappers (ρ = −0.14) and desktop slot refresh (ρ = −0.16). It has positive relations with resellers (ρ = 0.14) and with the share of phone traffic (ρ = 0.30). Denser sites also have less traffic (ρ = 0.18 with rank number).
| Ad Density quartile | Range (%) | Sites with a wrapper | Median ads-to-content ratio | Median resellers | Median traffic rank |
|---|---|---|---|---|---|
| Q1 (lowest) | 1 to 10 | 55.1% | 0.09 | 222 | 46,518 |
| Q2 | 11 to 15 | 69.0% | 0.16 | 287 | 49,824 |
| Q3 | 16 to 23 | 64.0% | 0.17 | 426 | 56,301 |
| Q4 (highest) | 24 to 84 | 35.6% | 0.19 | 459 | 70,365 |
Interpretation. The densest sites in the sample are smaller, have more phone traffic and connect to less header-bidding demand. They also sell through more resellers. Ad Density is the CrUX metric that relates most to inventory quality as buyers usually define it.
Sites with heavy ads have slower interaction, not slower loading
We compared each origin's Ad CPU to its Core Web Vitals in the same CrUX record. Interaction to Next Paint (INP) increases with Ad CPU. LCP does not.
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, n = 12,154
| Ad CPU quartile | INP p75 over 200 ms | LCP p75 over 2,500 ms | CLS p75 over 0.1 |
|---|---|---|---|
| Q1 (lowest) | 19.8% | 19.6% | 20.9% |
| Q2 | 19.4% | 16.9% | 27.8% |
| Q3 | 22.4% | 15.7% | 31.5% |
| Q4 (highest) | 30.3% | 12.5% | 23.1% |
Across the ten deciles of Ad CPU, the median INP increases from 119 ms to 166 ms. The rank correlation over all 12,126 origins with INP is 0.21 (95% CI 0.20 to 0.23). After control for traffic rank and publisher type, the coefficient is 0.23 (n = 4,236).
Device mix can affect INP, because phones are slower than desktop computers. CrUX reports device mix for 3,061 of the origins. In that group, the coefficient is 0.11 without the control and 0.11 with the phone-share control. Device mix does not explain the relation. The relation is weaker in this group than in the full sample. We do not know the cause of this difference.
Interpretation. Ad code can compete with the page for the main thread, for example when ad scripts run in the page itself. The data agree with this mechanism, but the data cannot prove it. Lower LCP failure in the heavy quartile probably shows that sites with large ad stacks are also better-engineered sites. Cumulative Layout Shift (CLS) has no consistent direction.
Dense sites with heavy ads carry twice the resellers
We divided the 4,261 matched origins at the median Ad CPU (2,208 ms) and the median Ad Density (15%). The result is four groups of approximately equal size.
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, joined to Sincera profiles, n = 4,261
| Profile | Sites | With a wrapper | With refresh | Median ads-to-content ratio | Median resellers | Median INP (ms) |
|---|---|---|---|---|---|---|
| Light, sparse | 1,102 | 36.4% | 25.7% | 0.09 | 229 | 114 |
| Light, dense | 1,029 | 22.4% | 17.9% | 0.16 | 292 | 136 |
| Heavy, sparse | 1,091 | 84.8% | 74.1% | 0.16 | 257 | 145 |
| Heavy, dense | 1,039 | 77.0% | 64.6% | 0.21 | 530 | 154 |
The heavy, dense group has approximately twice the median reseller count of each other group. The difference is significant (Mann-Whitney U, p < 0.001). The light, dense group has the lowest wrapper adoption and the lowest median traffic rank.
Interpretation. The heavy, sparse group connects to much demand and gives ads a moderate share of the screen. The heavy, dense group combines a large ad stack, a crowded layout and long reseller chains. We have no labelled data for made-for-advertising (MFA) sites. We therefore do not classify any group as MFA.
The Better Ads review passes 154 sites with 30% or more ad density
The Google Ad Experience Report applies the Better Ads Standards. We checked the mobile status of 4,180 origins in the sample.
Checked: 2,375 not reviewed · 1,796 passing · 9 failing
Rated: 1,642 passing below 30% · 154 passing sites have Ad Density p75 of 30% or more · 9 failing (2 at 30% or more)
Source: Chrome UX Report API, 28-day periods ending 20 and 27 September 2026, n = 4,180
- 2,375 origins have no review.
- 1,796 origins pass.
- 9 origins fail.
Of the 1,805 rated origins, 156 (8.6%) have a CrUX Ad Density p75 of 30% or more. Of these 156 origins, 154 pass. The 9 failing origins have Ad Density values from 5% to 41%. The median year of the last status change is 2019. For 52.2% of rated origins, the last change occurred before 2020.
The Better Ads mobile density rule measures ad height against page content height. CrUX measures viewport area over time. The two values are not the same measurement. But the comparison shows that a "passing" status gives little information about the current ad layout.
The results hold across subsets
The main correlations do not change materially in subsets of the data.
| Subset | Sites | Ad CPU and wrappers | Ad CPU and desktop refresh | Ad Density and ads-to-content ratio | Ad Density and wrappers | Ad CPU and INP |
|---|---|---|---|---|---|---|
| All matched | 4,261 | 0.59 | 0.55 | 0.36 | −0.14 | 0.22 |
| Ad-monetized publishers only | 3,279 | 0.59 | 0.55 | 0.35 | −0.11 | 0.24 |
| Period ending 27 September | 3,377 | 0.59 | 0.56 | 0.36 | −0.15 | 0.23 |
| Traffic rank above median | 2,131 | 0.58 | 0.55 | 0.36 | −0.06 | 0.20 |
| Traffic rank below median | 2,130 | 0.60 | 0.55 | 0.36 | −0.19 | 0.24 |
What this data cannot show
- Cross-sectional data. The data cover one 28-day period. They show associations, not causes.
- No yield data. We use demand-stack signals as proxies for yield. A site with many wrappers can still have low prices.
- Selection. CrUX includes only origins with sufficient traffic and an
ads.txtfile. Sincera covers 4,261 of 12,154 origins. Matched origins have lower median Ad CPU (2,208 ms) than unmatched origins (2,734 ms). - Different collection times. The Sincera data and the CrUX periods do not cover the same days.
- Metric definition. Chrome does not document whether main-frame ad scripts count toward Ad Weight: CPU.
- Experimental metrics. Chrome can change the definitions. Later periods may not be comparable.
What to do
For buyers and supply-path teams
- Do not use Ad Weight: CPU or Ad Weight: Network as an inventory-quality filter. In this sample, high weight identifies sites with more header-bidding demand, not sites with more clutter.
- Use Ad Density as the CrUX signal for clutter. Use it together with reseller count, because dense sites with long reseller chains are a separate group.
- Do not use a Better Ads "passing" status as evidence of a clean layout.
For publishers
- Monitor Ad Weight: CPU together with INP. In this sample, the share of origins with poor INP increases from 19.8% to 30.3% between the lowest and highest Ad CPU quartiles.
- Measure the CPU cost of each wrapper, identity provider and refresh rule before you add it. Slot refresh has the largest coefficient in our model.
- Monitor Ad Density p75, especially on mobile. Buyers can now see this value in a public dataset.
For further research
- Join CrUX ad metrics to realized CPM and revenue per session. This step is necessary to measure yield directly.
- Use the CrUX History API to examine changes over time on the same origins, for example after a site removes a wrapper.
How to reproduce this analysis
The CrUX data contains the CrUX fields for each origin in this report. The summary data contains every number in the charts and tables. The calculation script rebuilds the summary with uv run report-002.py. The Sincera data is licensed. We do not republish it at the origin level, so the public files reproduce the CrUX results but not the joined results.
Method note: all random draws use the seed 20261022. We select the origin-level CrUX record for all device types. We join Sincera data by exact domain match. We exclude missing values and do not treat them as zero.
Disclosure
MediaContext sells publisher data and research tools. This report uses data that MediaContext collects. No company paid for or reviewed this research before publication.
Sources
Cite this report
Jatain, V. (2026). Chrome's ad weight tracks demand. Ad density tracks clutter. MediaContext Report 002. https://mediacontext.dev/blog/report-002/
Corrections
Found an error? Email vj@andorlabs.ca with the section and the evidence. We correct errors in place and note the change and its date at the top of the report.
Check the work.
The observations and calculation script are available alongside this report. Bring your own questions.
Back to research