Ad Viewability Measurement
Served Doesn't Mean Seen
An ad can be fully served by the ad server, billed to the advertiser, and still never appear in a human's actual viewport — loaded below the fold and never scrolled to, rendered in a background tab, or sitting in a 1x1 pixel iframe used purely for tracking. Viewability measurement exists to separate 'the ad was technically delivered' from 'a person had a real opportunity to see it,' and it underpins how CPM billing, brand lift attribution, and fraud detection all get interpreted.
The Standard Viewability Thresholds
The Media Rating Council (MRC), with input from the IAB, established the industry-standard definitions most platforms report against:
- Display: at least 50% of pixels in view for a minimum of 1 continuous second.
- Video: at least 50% of pixels in view for a minimum of 2 continuous seconds.
- Large display ads (242,500+ px²): a lower 30% pixel threshold applies, since a large unit is harder to get fully in-viewport even when clearly visible.
These are minimum bars, not quality signals — a display ad that's 51% visible for exactly 1 second counts as 'viewable' by MRC standard even though a user almost certainly didn't register it consciously.
Viewability ≠ Attention
Viewability Thresholds by Format
| Format | Pixels in View | Minimum Duration |
|---|---|---|
| Standard display | 50% | 1 continuous second |
| Large display (242,500+ px²) | 30% | 1 continuous second |
| Video (in-stream/out-stream) | 50% | 2 continuous seconds |
| Audio (companion display) | N/A — audibility-based, not pixel-based | N/A |
How Viewability Is Technically Measured
Measurement vendors (IAS, DoubleVerify, Moat) inject a verification pixel or JS tag alongside the creative that uses the browser's Intersection Observer API (or, for cross-domain iframes where direct DOM access is blocked, postMessage-based geometry reporting from the creative's own iframe) to continuously track what percentage of the ad's bounding box intersects the visible viewport, combined with a timer that only counts continuous qualifying seconds — a user scrolling the ad out of view and back resets the clock.
const viewabilityThreshold = 0.5; // 50% for standard display
let qualifyingTimer = null;
const observer = new IntersectionObserver(
([entry]) => {
if (entry.intersectionRatio >= viewabilityThreshold) {
if (!qualifyingTimer) {
qualifyingTimer = setTimeout(() => reportViewableImpression(adUnitId), 1000);
}
} else if (qualifyingTimer) {
clearTimeout(qualifyingTimer);
qualifyingTimer = null;
}
},
{ threshold: [viewabilityThreshold] }
);
observer.observe(document.getElementById(adUnitId));Industry Average Viewability Is Lower Than You'd Guess
What's Next?
Viewability is the measurement foundation that MRC standards formalize in more detail, and it connects directly to fraud prevention — invalid traffic detection often starts by flagging impressions that are technically 'viewable' but statistically implausible for a real human.
I build these systems professionally.
Whether it's a RAG pipeline, analytics migration, or AI workflow — let's talk.