Measurement Methodology
How we measure Better Ads compliance

What This Document Covers

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.

Better Ads Experiences We Test

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.

Desktop Web (from betterads.org)

ExperienceOur MeasurementStatus
Pop-up AdsDetected: yes/noTested
Auto-playing Video Ads with SoundDetected: yes/noTested
Prestitial Ads with CountdownDetected: yes/noTested
Large Sticky Ads>30% of screen heightTested
Ad Density Higher than 50%Height-based formula (see below)Tested
Ad Density Higher than 30% with Sticky Video AdHeight-based formula, stricter thresholdTested

Mobile Web (from betterads.org)

ExperienceOur MeasurementStatus
Pop-up AdsDetected: yes/noTested
Auto-playing Video Ads with SoundDetected: yes/noTested
Prestitial Ads with CountdownDetected: yes/noTested
Ad Density Higher than 30%Height-based formula (see below)Tested
Flashing Animated AdsRapidly changing animations detectedTested
Large Sticky Ads>30% of screen heightTested
Full-screen Scrollover Ads>30% of page, floats on top of contentTested
Postitial Ads with CountdownDetected: yes/noTested
Sticky Pop-out Video AdsDetected: yes/noTested
Sticky Video with Large Inline AdDetected: yes/noTested

Short-Form Video (from betterads.org)

ExperienceOur MeasurementStatus
Long, Non-Skippable Pre-roll AdsCombined pre-roll >31s and skip not available within first 6sTested
Mid-roll AdsDetected during playbackTested
Large Display AdsOverlay >20% of video player area OR in middle third of playerTested

Mobile App (from betterads.org)

ExperienceOur MeasurementStatus
Interruptive InterstitialsDetected in mobile web contextTested (web proxy)
Interruptive Video InterstitialsDetected in mobile web contextTested (web proxy)
Non-skippable Video InterstitialsDetected in mobile web contextTested (web proxy)
Page-load Video InterstitialsDetected in mobile web contextTested (web proxy)

Mobile App standards are tested in mobile web context as a proxy. Results are informative but may differ from native app behavior.

Ad Density — How We Calculate It

"Ad density is determined by summing the heights of all ads within the main content portion of a page, then dividing by the total height of the main content portion of the page."
— Coalition for Better Ads, betterads.org
Ad Density = Sum of ad heights / Main content height × 100 Heights are measured in pixels. Overlapping ads are merged (height union).

Coalition Definition (verbatim)

From betterads.org
  • Ad density is measured against the main content portion of the page, not the viewport.
  • The main content portion of the page excludes headers, footers and site navigation including related articles.
  • Ads below the main content portion of the page are not included in the density calculation. Ads in the siderails of the main content are included.
  • All ad formats count toward ad density, including "sticky" ads and inline ads. The height of each "sticky" ad is counted once.
  • Video ads that appear before ("pre-roll") or during ("mid-roll") video content that is relevant to the content of the page itself are not included.

Our Automation Heuristics

The Coalition defines what to measure but does not prescribe how to automate the measurement. These are our engineering choices:

Main content detection (our heuristic)

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.

Ad discovery (our heuristic)

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.

Sticky deduplication (our heuristic)

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.

Thresholds (from betterads.org)

DeviceViolationSource
Desktop> 50%betterads.org
Mobile> 30%betterads.org
Desktop + Sticky Video> 30%betterads.org

Real Example: e15.cz Article (Desktop) — Three Methods Compared

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.

MethodApproachAd HeightDensityResult
Literal Better AdsAll placements + skins as separate ads5,810 px79.8%FAILView →
Conservative (de-overlapped)Each placement once, skins not counted separately4,310 px59.2%FAILView →
Vertical Union (floor)Merge overlapping vertical ranges3,694 px50.7%FAILView →

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.

Quick Example: blesk.cz Homepage (Desktop)

Measurement Breakdown
Page height24,132 px
Main content element<main>
Main content height22,997 px
Total ad height (union)1,112 px
Viewports scanned23
Threshold50% (desktop)
1,112 / 22,997 = 4.8% — PASS

Our Automation Process

These steps describe our automated implementation. The Coalition defines what to measure; these are our engineering choices for how to automate it.

1

Navigate & Consent

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).

2

Detect Main Content

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.

3

Scroll & Collect Ads

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).

4

Deduplicate & Filter

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.

5

Compute Height Union

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.

6

Compare to Threshold

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.

Measurement Thresholds

Numeric thresholds from the Coalition's published definitions. Binary standards (pop-up, autoplay, etc.) have no numeric threshold — presence alone constitutes a violation.

MeasurementDeviceViolationUnitSource
Ad DensityDesktop> 50%% of main content heightLink
Ad DensityMobile> 30%% of main content heightLink
Ad Density + Sticky VideoDesktop> 30%% of main content heightLink
Large Sticky AdsAll> 30%% of screen heightLink
Scrollover AdsMobile> 30%% of page, floats on topLink
Long Pre-rollVideoCombined >31s AND skip not available within first 6sDuration + skip timingBetter Ads short-form video
Large Display AdsVideo>20% of player area OR in middle third of playerArea or positionBetter Ads short-form video
Pop-up AdsAllPresentBinaryLink
Autoplay Video with SoundAllPresentBinaryLink
Prestitial with CountdownAllPresentBinaryLink
Flashing Animated AdsMobilePresentRapidly flashingLink

Latest Audit Results

30 audits across 8 CNC sites (homepage + article, desktop + mobile). All density values are the spec-correct Better Ads calculation.

SiteDeviceDensityAd HeightContent HeightViewportsResult

How We Detect Ads (Our Automation)

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.

Selector Categories

Google Ads (7 selectors)

iframe[id^="google_ads_iframe"], [data-google-query-id], ins.adsbygoogle, iframe[src*="doubleclick.net"], etc.

CNC-Specific (10 selectors)

[id^="cnc_leaderboard_"], .cnc-ads__within, [class*="cnc-ads--"], .gam-wrapper, #cnc_slide_up_wrapper, .cnc-ad-format--vignette, etc.

Ad Networks (11 selectors)

Amazon, Outbrain, Taboola, Criteo, AppNexus, Rubicon, PubMatic, OpenX, Casale, and others via iframe[src*="..."] patterns.

Video Ad Exclusion (10 selectors)

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.

CNC Better Ads Compliance Monitor Generated with the help of AI by Anthropic