Adding video ads without spoiling playback
Video ads pay better than most display formats, which makes it tempting to add them everywhere. The risk is that viewers leave before the content starts, and a site that loses viewers loses the ad revenue with them. Most of the difference between a good and a bad video ad setup comes down to a few decisions.
Know which layer controls what
A web video player shows ads by requesting an ad tag from an ad server. A VAST response describes a single ad: the media file, its length, when it can be skipped and which tracking URLs to call. A VMAP response describes a schedule: a pre-roll before the content, mid-rolls at set times and a post-roll at the end. Many players use the Google IMA SDK to request and play these ads.
Knowing which layer controls what saves a lot of debugging later. Frequency, for example, can be limited in the ad server, in the VMAP schedule or in the player itself, and the three can contradict each other.
Cap frequency by time, not by play
Showing a pre-roll on every play is the fastest way to lose your most engaged viewers, the people who watch several videos in one visit. A time-based cap works better: after a pre-roll, show none for the next few minutes, whatever the viewer does. A first-party cookie or a local storage value holding a timestamp is enough to implement this in the player. Start with a generous interval and shorten it only if completion rates and pages per session hold up.
Treat pause ads as part of the player
Pause ads, a creative shown when the viewer pauses, can work well because they appear when attention is already on the player. They must disappear the moment playback resumes, must not reopen when the viewer pauses for a second while seeking, and should give the viewer a clear way to close them. Test them on mobile, where a pause is often accidental.
Do not let the ad hold up the page
The player script, the IMA SDK and the ad request should load after the main content is usable. Reserve space for the player so the page does not jump when it appears, which also protects the Cumulative Layout Shift score in Core Web Vitals. If the ad request fails or times out, the content should start anyway. A viewer who stares at a blank player for ten seconds rarely waits for the next one.
Measure requests, impressions and plays separately
Ad servers report impressions; your analytics reports plays. Compare them. If impressions are much higher than plays, something is wrong: ads may be loading in hidden players, or impressions are being inflated by bad traffic. If plays are much higher than ad requests, ads are not being requested when they should be.
Record ad requests, impressions, completions and content starts as separate events, and review them by browser and by country. Problems usually show up in one segment before they show up in the totals.
Judge changes by behaviour, not only revenue
Measure every change by revenue per session and by what viewers do next: content starts, watch time and pages per session. A setup that earns more per thousand impressions but loses a fifth of returning visitors is a step backwards.