On October 5, IAB Europe published its final Connected TV Measurement Framework. Video completion rate and view-through rate are first-class metrics again, with explicit disclosure rules. Those numbers only move if the tag fires the events the player actually schedules. For pause, overlay, squeezeback, and the rest of the CTV Ad Portfolio (finalized July 22, 2026), that schedule is not the linear quartile ladder.
A squeezeback flight I debugged last month looked healthy in the ad server. Impressions counted. The creative rendered in the shrunken frame. The buyer's dashboard showed zero completion and zero time-on-screen. The XML still had <Tracking event="firstQuartile"> sitting under <NonLinearAds>, copied from a :30 instream template.
What the spec assigns to each container
VAST does not forbid arbitrary event names inside <TrackingEvents>. It maintains a vocabulary, and on 4.x both linear and non-linear events live in the same list. firstQuartile, midpoint, and complete are valid strings whether they appear under <Linear> or <NonLinearAds>.
Runtime behavior is container-specific. A linear creative owns a playhead tied to <Duration>. The player advances that clock and fires quartiles against it. A NonLinear creative has no guaranteed playhead. The IAB CTV signaling guidance tells buyers to measure portfolio units with creativeView and overlayViewDuration, plus interaction events such as close when the viewer dismisses the unit.
The Format-to-Signal table in Signaling Implementation Guidelines pairs each portfolio format with NonLinear VAST delivery. Squeezeback uses plcmt = 8 and layout-specific pos values (11 through 17). Overlay uses plcmt = 7. Pause uses plcmt = 5 with playbackmethod 8 or 9. None of those rows describe a linear InLine spot with quartile beacons.
Trafficking systems that reuse mid-roll exports therefore ship structurally legal XML with the wrong measurement contract. The ad can paint pixels. The verification pixel for "75% watched" never fires, because nothing in the NonLinear path subscribed to quartiles.
The copy-paste failure mode
The failure is boring. A creative ops team duplicates a working instream tag, drops AdCOM extensions for plcmt, pos, and playbackmethod, and changes the <Creative> subtree to <NonLinearAds>. Impression URLs stay. Quartile URLs stay. Nobody rewrites tracking because the validator green-lit every event name.
Worse, some teams leave start under NonLinear. Players that do fire start only do so for linear timelines. A NonLinear unit that never receives creativeView looks unviewed in MRC-style counting even when the overlay was on screen for twenty seconds.
Video squeezeback and motion overlay add a second gap. Quartiles and overlayViewDuration need a timeline. A video <MediaFile> under <NonLinear> without <Duration> validates in many pipelines, but VAST-4.4-nonlinear-video-no-duration exists because progress events have nothing to anchor. Static pause images can omit duration when dwell is unknown at response time; full-motion portfolio assets cannot.
Signal mismatches show up separately. Paste squeezeback pos onto a pause plcmt and you get VAST-4.4-adcom-pos-format-mismatch even when tracking looks fine. I walked pause versus squeezeback signal pairs in Netflix pause ads go programmatic. This post is the measurement half: right container, wrong events.
How you catch it before the flight
Schema validation and an LLM rewriting VAST will both accept firstQuartile under NonLinearAds. The wire contract for portfolio inventory is container plus signals plus the NonLinear event set. You still need a deterministic check on the payload the buy claimed.
Start with the live tag, not a pasted fragment. The VAST tag tester fetches the ad server URL, previews the creative, and lists tracking URLs as declared. If every URL says quartile but the creative tree is NonLinear, you found the bug before spend moves.
Wrapper chains hide the same mistake on hop three. The VAST inspector walks each hop and shows where InLine finally appears. Portfolio campaigns that stitch server-side often wrap twice; the broken <TrackingEvents> block may not be in the file your designer exported.
For SIMID or interactive overlay assets, the IAB-style VAST tester (an independent fork, not an IAB Tech Lab product) exercises the handshake and protocol log alongside the media fallback. Interactive portfolio units still owe creativeView when the fallback image renders without SIMID.
CLI checks come after URL-level review:
$ vastlint check squeezeback-brand.xml
warning AdCOM pos is not a position the declared plcmt format supports VAST-4.4-adcom-pos-format-mismatch
warning <NonLinear> delivers a video <MediaFile> but declares no <Duration> VAST-4.4-nonlinear-video-no-duration
0 errors, 2 warnings
vastlint (cargo install vastlint, npm install vastlint) encodes the July 2026 CTV portfolio rules: AdCOM extension shapes, format-to-signal tables, NonLinear media requirements. It does not yet emit a dedicated rule for quartiles under NonLinearAds, because the defect is semantic, not syntactic. CI should assert NonLinear portfolio directories include creativeView and, for timed video, overlayViewDuration, and reject firstQuartile there the same way you reject HTTP media on HTTPS inventory.
An implementation that lets a model emit VAST still has to verify the payload against that contract. vastlint is that check for the creative side. It is independent of IAB Tech Lab and of AAO.
Where to go next
The CTV Ad Portfolio reference maps each format to plcmt, pos, and expected NonLinear delivery. The tracking events index table lists which events belong under <Linear> versus <NonLinearAds>; keep that table open while auditing exports.
When video portfolio tags miss <Duration>, read the rule doc for nonlinear video without duration before you trust quartile or overlay progress URLs. When signals disagree with the asset, fix pos and playbackmethod before you re-traffic tracking.
Programmatic pause and squeezeback inventory is expanding as platforms adopt the six-format signal set. Measurement frameworks now ask for disclosed completion methodology. The cheapest way to fail that disclosure is a valid XML document that bills impressions while reporting an empty quartile column on a unit that never had a linear playhead.
Top comments (0)