Our methodology is designed to operationalize the Coalition for Better Ads Standards as closely as possible using automated DOM-based measurement. Where the Coalition provides exact definitions, we follow them. Where the Coalition does not prescribe implementation details, we use documented engineering heuristics.
This page explains how each number in our reports is calculated, what comes from the official standards, and what is our automation logic.
The Coalition for Better Ads publishes 23 ad experiences across 4 content environments: Desktop Web (6), Mobile Web (10), Short-Form Video (3), and Mobile App (4). We test a subset of these that apply to CNC web properties.
Note: The Coalition announced additional standards (desktop ad density, sticky video combinations) with program compliance assessed no earlier than May 14, 2026.
| Experience | Our Measurement | Status |
|---|---|---|
| Pop-up Ads | Detected: yes/no | Tested |
| Auto-playing Video Ads with Sound | Detected: yes/no | Tested |
| Prestitial Ads with Countdown | Detected: yes/no | Tested |
| Large Sticky Ads | >30% of screen height | Tested |
| Ad Density Higher than 50% | Height-based formula (see below) | Tested |
| Ad Density Higher than 30% with Sticky Video Ad | Height-based formula, stricter threshold | Tested |
| Experience | Our Measurement | Status |
|---|---|---|
| Pop-up Ads | Detected: yes/no | Tested |
| Auto-playing Video Ads with Sound | Detected: yes/no | Tested |
| Prestitial Ads with Countdown | Detected: yes/no | Tested |
| Ad Density Higher than 30% | Height-based formula (see below) | Tested |
| Flashing Animated Ads | Rapidly changing animations detected | Tested |
| Large Sticky Ads | >30% of screen height | Tested |
| Full-screen Scrollover Ads | >30% of page, floats on top of content | Tested |
| Postitial Ads with Countdown | Detected: yes/no | Tested |
| Sticky Pop-out Video Ads | Detected: yes/no | Tested |
| Sticky Video with Large Inline Ad | Detected: yes/no | Tested |
| Experience | Our Measurement | Status |
|---|---|---|
| Long, Non-Skippable Pre-roll Ads | Combined pre-roll >31s and skip not available within first 6s | Tested |
| Mid-roll Ads | Detected during playback | Tested |
| Large Display Ads | Overlay >20% of video player area OR in middle third of player | Tested |
| Experience | Our Measurement | Status |
|---|---|---|
| Interruptive Interstitials | Detected in mobile web context | Tested (web proxy) |
| Interruptive Video Interstitials | Detected in mobile web context | Tested (web proxy) |
| Non-skippable Video Interstitials | Detected in mobile web context | Tested (web proxy) |
| Page-load Video Interstitials | Detected in mobile web context | Tested (web proxy) |
Mobile App standards are tested in mobile web context as a proxy. Results are informative but may differ from native app behavior.
The Coalition defines what to measure but does not prescribe how to automate the measurement. These are our engineering choices:
We detect main content using semantic HTML elements (<main>, [role="main"], #content) and fall back to heuristic detection of the largest centered content block, excluding headers, footers, navs, and sidebars.
We use 36+ CSS selectors matching definitive ad indicators (Google Ads iframes, CNC ad wrappers, ad network patterns). This is our implementation choice — the Coalition does not specify how to discover ads.
We scroll the page in viewport-height steps with a 3-second settle time per step. Sticky/fixed ads are identified by screen-space coordinates and counted once. Overlapping ad heights are merged using an interval-union algorithm. These are reasonable automation choices, not Coalition-prescribed procedures.
| Device | Violation | Source |
|---|---|---|
| Desktop | > 50% | betterads.org |
| Mobile | > 30% | betterads.org |
| Desktop + Sticky Video | > 30% | betterads.org |
The same page produces different density numbers depending on how "summing the heights" is interpreted. All three methods use the same detected ads and the same content boundaries.
| Method | Approach | Ad Height | Density | Result | |
|---|---|---|---|---|---|
| Literal Better Ads | All placements + skins as separate ads | 5,810 px | 79.8% | FAIL | View → |
| Conservative (de-overlapped) | Each placement once, skins not counted separately | 4,310 px | 59.2% | FAIL | View → |
| Vertical Union (floor) | Merge overlapping vertical ranges | 3,694 px | 50.7% | FAIL | View → |
All three methods agree this page fails the 50% threshold. The range is 50.7% to 79.8% depending on interpretation. Click "View" to see each calculation step by step.
These steps describe our automated implementation. The Coalition defines what to measure; these are our engineering choices for how to automate it.
Load the page with the target device viewport (desktop 1920×1080, mobile 390×844). Accept cookie consent using site-specific CMP handlers (Didomi, CPEx, Seznam, Cookiebot).
Find the main content area using semantic HTML selectors (<main>, #content, [role="main"], etc.). Validates the element is at least 50% of viewport width and has meaningful height. Falls back to heuristic detection of the largest centered block, excluding headers, footers, navs, and sidebars.
Scroll the full page top to bottom in viewport-height steps. At each position, wait 3 seconds for lazy-loaded ads to render, then detect all ad elements using 36+ high-confidence selectors (Google Ads iframes, CNC ad wrappers, ad network patterns, data attributes).
Sticky/fixed ads are identified and deduplicated using screen-space coordinates (counted once regardless of how many scroll positions they appear in). Video pre-roll/mid-roll ads are excluded. Ads outside the main content vertical range are clipped.
All remaining ad intervals are merged: overlapping ads don't double-count. The result is the total pixel height occupied by ads within the main content. This is divided by the main content height to get the density percentage.
The single density number is compared against the Better Ads threshold for the device: >50% desktop, >30% mobile. Pass or fail. No warning levels — only the thresholds defined by the Coalition for Better Ads.
Numeric thresholds from the Coalition's published definitions. Binary standards (pop-up, autoplay, etc.) have no numeric threshold — presence alone constitutes a violation.
| Measurement | Device | Violation | Unit | Source |
|---|---|---|---|---|
| Ad Density | Desktop | > 50% | % of main content height | Link |
| Ad Density | Mobile | > 30% | % of main content height | Link |
| Ad Density + Sticky Video | Desktop | > 30% | % of main content height | Link |
| Large Sticky Ads | All | > 30% | % of screen height | Link |
| Scrollover Ads | Mobile | > 30% | % of page, floats on top | Link |
| Long Pre-roll | Video | Combined >31s AND skip not available within first 6s | Duration + skip timing | Better Ads short-form video |
| Large Display Ads | Video | >20% of player area OR in middle third of player | Area or position | Better Ads short-form video |
| Pop-up Ads | All | Present | Binary | Link |
| Autoplay Video with Sound | All | Present | Binary | Link |
| Prestitial with Countdown | All | Present | Binary | Link |
| Flashing Animated Ads | Mobile | Present | Rapidly flashing | Link |
30 audits across 8 CNC sites (homepage + article, desktop + mobile). All density values are the spec-correct Better Ads calculation.
| Site | Device | Density | Ad Height | Content Height | Viewports | Result |
|---|
The Coalition does not prescribe how to discover ads on a page. We use 36+ CSS selectors matching definitive ad indicators in the DOM. This is our engineering implementation.
iframe[id^="google_ads_iframe"], [data-google-query-id], ins.adsbygoogle, iframe[src*="doubleclick.net"], etc.
[id^="cnc_leaderboard_"], .cnc-ads__within, [class*="cnc-ads--"], .gam-wrapper, #cnc_slide_up_wrapper, .cnc-ad-format--vignette, etc.
Amazon, Outbrain, Taboola, Criteo, AppNexus, Rubicon, PubMatic, OpenX, Casale, and others via iframe[src*="..."] patterns.
Google IMA SDK, VP Player (GJIRAFA), JW Player, video.js ad containers. These are tagged as video ads and excluded from density per Better Ads spec.