Ad Monitor Changelog
What changed and why

What changed this cycle

No new features. Everything this time was about getting existing measurements right.

Density: we were measuring it wrong

Our ad density calculation had a bug that's been in there for a while. When two ad placements overlapped on the page, we merged those areas and counted only the combined space. That consistently made density look lower than it was.

The spec is clear: count each placement by where it physically sits, independently. A leaderboard at the top and a sidebar strip on the right are two separate contributions. We've fixed it.

Numbers will be higher now. A site that was passing might not be anymore. That's not the site getting worse — that's us finally measuring it right.

Side rail ads were also being skipped entirely. Those are the wide branding strips that frame a desktop page on the left and right edges. Paid placements, real space, not counted. Now they are.


The regression alarm was silently doing nothing

We have a check that fires after each test run and compares compliance against the previous run. If it drops enough, it raises an alarm.

It never did. The bug: it ran too early, before the output file existed, and quietly exited every time.

It's fixed. The check now runs after everything is written to disk, using the rate captured before the run started as its baseline. If compliance drops, you'll hear about it.


One less file to maintain

We had separate instruction files for Claude and Codex (our AI coding agents). Codex now just defers to the Claude file. Nothing exciting, just less to keep in sync.

How we measure ad density

A plain-language explanation of the formula, the edge cases, and the decisions behind them.

Ad density is one of four standards we check on every site, every day. The question is simple: what percentage of the main reading area is ads?

Better Ads sets the limits at 50% for desktop and 30% for mobile. If a sticky video player is on the page, the desktop limit drops to 30% too. Over those numbers and the site fails.

What gets measured

The tests scroll the full page and record every ad — height and position. Ads outside the main editorial area (headers, footers, detached sidebars) are excluded. The spec cares about the reading experience, not the whole page.

The final number: total ad height divided by main content height. Over the threshold, it's a violation.

Each ad is counted separately

If three ads are stacked in a column and each takes up 10% of the content, do you count 30%? Or merge them and count only the unique space they cover?

We count 30%. The spec says "summing the heights of all ads" — that means add them up, not merge. We were merging before. It made density look smaller than it was.

Side rails

Desktop pages on CNC sites often have wide branding strips on the left and right edges — the wallpaper takeover format. These are paid placements. Until recently they weren't being counted. They are now, each as a separate entry.

Sticky ads

An ad fixed to the bottom of the screen is visible at every scroll position. A naive count would multiply its height by the number of scroll steps. We count it once, by its screen footprint. Conservative, and in the site's favor.

Video ads

Pre-roll and in-stream video are under a different section of the Better Ads Standards and aren't included in density. Only display and native formats count.

Why numbers are higher now

Counting each ad separately and adding side rails pushes readings up. Sites that were passing might not be. That's the point — the old numbers were too low.

CNC Ad Monitor Updated April 2026