The ad plays. The buyer's impression pixel fires on the inline. Finance still opens a ticket because the SSP's numbers are half of everyone else's.
The XML you pasted from the bottom of the chain looks fine. What nobody fetched was hop two: a thin wrapper with <AdSystem>, <VASTAdTagURI>, and no <Impression>.
One hop, one beacon
From VAST 2.0 onward, an <InLine> ad must carry at least one <Impression>. The same rule applies to <Wrapper>. Section 2.3.4 treats the wrapper as its own ad delivery record. The impression URL on that node is how this server proves the opportunity passed through this hop before the player follows <VASTAdTagURI>.
That is not redundant with the inline's pixels. Wrapper impressions and inline impressions answer different accounting questions. The reseller logs pass-through; the advertiser logs the served creative. Players that follow wrapper chains correctly fire both, in order, as they resolve redirects.
A wrapper that omits <Impression> is still well-formed enough to redirect. Many QA flows validate only the final inline, or only check that <VASTAdTagURI> returns 200. The missing element is on the document you never saved.
<VAST version="2.0">
<Ad id="reseller-1">
<Wrapper>
<AdSystem>Reseller Ad Server</AdSystem>
<VASTAdTagURI><![CDATA[https://buy-side.example/vast.xml]]></VASTAdTagURI>
</Wrapper>
</Ad>
</VAST>
The buyer inline downstream can include three impression URLs and a full <Linear>. The reseller still counts zero for the leg it controlled.
What breaks in production
Discrepancy meetings love this failure mode because every party has a defensible partial truth. The publisher saw the ad. The DSP has inline impressions. The intermediary wrapper never emitted a beacon, so its dashboard under-reports against the ad server that did log the serve.
Wrapper chains amplify it. Hop one might be clean. Hop three might be clean. The hop without <Impression> disappears from that partner's reporting while adjacent hops look healthy. Without walking the chain, the bug reads as "your player dropped tracking" instead of "this XML never declared tracking for that server."
<AdSystem> on the wrapper has the same structural role: the spec expects a named ad system on every wrapper document, not only on the inline. A wrapper missing identity metadata is a different error, but the same class of problem: the redirect container is incomplete even when the redirect works.
How you catch it
Start from the live tag URL, not the inline fixture in the ticket. The VAST tag tester fetches the response, follows <VASTAdTagURI> redirects, and shows the resolved documents with validation markers. That is where you see whether hop two ever declared an impression.
For depth and handoff between hops, the VAST inspector walks the wrapper chain step by step: which URL returned which document, where an inline finally appears, and where a hop is structurally thin.
On the file or paste path, vastlint flags the missing element as VAST-2.0-wrapper-impression (the same rule id applies across VAST versions that still use <Wrapper>):
$ vastlint check wrapper-no-imp.xml
error VAST-2.0-wrapper-impression
<Wrapper> must contain at least one <Impression>
path: /VAST/Ad[0]/Wrapper
spec: IAB VAST 2.0 ยง2.3.4
An implementation that lets a model emit VAST from a trafficking UI or an agent workflow still has to check the payload on the wire. vastlint (cargo install vastlint, npm install vastlint) is that check for the creative envelope. It is independent of IAB Tech Lab and of AAO; it does not replace your ad server's business rules, but it will not treat "redirect works" as "hop logged."
Where to go next
The wrapper missing impression example walks through the resale scenario, the primary finding, and the fix fragment: add a distinct impression URL on every wrapper so each party measures its own leg.
The VAST-2.0-wrapper-impression rule reference states the requirement and links the spec section. Pair it with VAST-2.0-wrapper-adsystem when you are auditing thin wrappers that lack both tracking and attribution.
For chain behavior (accumulating impressions, depth limits, when inline handoff happens), the VAST wrapper chains guide is the reference I send engineers before they blame the SDK for a missing pixel that was never in the wrapper XML.
Validate every hop. The inline is not a substitute for wrapper-level <Impression>.
Top comments (0)