Click-through rate on a video line item is one of the first metrics a buyer questions when post-view outcomes look fine but engagement looks dead. The creative team insists the landing URL is in the tag. The ad server shows impressions and quartiles. The discrepancy report still prints zero clicks. That pattern often starts in the wrapper, not in the player bug queue.
IAB Tech Lab publishes VAST as the contract between ad servers and players. VideoClicks is where click destinations live. On an InLine creative, ClickThrough is the URL the player should open when the viewer activates the ad. On a Wrapper, the same element looks identical in XML, but version history changed whether players honor it at all. Teams copy wrapper templates across years without re-reading that history.
The failure is quiet. Impression trackers on the wrapper still fire when the chain resolves. Verification on a later hop may still load. Finance sees delivery. Only the click column stays empty because the only ClickThrough the buyer trafficked sat on a hop the player treated as redirect metadata, not as the billable click destination.
On 1 October 2026, Publir described mid-funnel CTV campaigns nesting measurement inside VAST wrapper chains and the player timeouts that follow. That story is usually told as errors 301 and 302 and lost fill. The same depth problem hides click destinations: outer hops still bill impressions while the inline the player decodes never received VideoClicks.
What the metric actually measures
A click in video is not a pixel. It is a navigation decision the player makes after the user presses OK on a remote, taps on mobile, or activates a companion. The player reads VideoClicks from the document it is actually playing, which is usually the InLine at the end of a wrapper chain, unless the integration explicitly merges click destinations from outer hops.
Wrapper hops exist so each seller can record its own impression and add policy flags. They are not a second place to hide the buyer landing page unless the VAST version and player both agree. When they disagree, the outer ClickThrough is inert XML. Dashboards that sum clicks from ad server logs only see events the player emitted. No player event means no click, regardless of how confident trafficking was when the URL was pasted.
NonLinear and Linear paths differ in which VideoClicks child applies, but the wrapper rule is the same class of problem: the element must live where the playing document expects it. A pause ad with NonLinearClickThrough on the wrapper while the InLine only carries tracking beacons will reproduce the same argument with a different element name.
Discrepancy meetings confuse this with macro expansion. An unfilled click macro produces a different failure mode: the player may still attempt a navigation to a malformed URL and log an error. A version-ignored wrapper ClickThrough produces no attempt at all. Ask which case you are in before you ask the publisher to replace the CDN.
How wrappers hide the click URL from the InLine
VAST 4.0 and 4.1 removed ClickThrough from wrapper VideoClicks. Players targeting those versions were written to ignore it even when the XML validates. VAST 4.2 explicitly allowed ClickThrough on wrappers again. A tag that declares version 4.1 with a wrapper ClickThrough is spec-shaped for an older rulebook and behavior-shaped for silence.
Trafficking often receives a wrapper URL from the ad server, not the inline XML. The first fetch returns a Wrapper with ClickThrough and a VASTAdTagURI. The second fetch returns the InLine with media and quartile trackers but no VideoClicks block because the creative vendor assumed the wrapper carried the landing page. Each hop alone looks defensible. The chain is not.
SSAI and server-side stitching add another copy of the problem. The stitcher may normalize wrappers for latency and drop VideoClicks on hops it does not forward. The player then sees only the stitched inline. If the buyer never inspected that inline, they never saw the missing click node.
As ad ops at a DSP, you see the line item, the tag URL, and the discrepancy export. You cannot open the publisher player or the stitcher log. The DSP forwards, wraps, or receives the VAST the buyer will be billed on, so your sample bid response and wrapped tag are the artifacts you can defend in a ticket. When the buyer says clicks are zero, your first question is not creative quality. It is which hop still contains VideoClicks after the version the player claims to support.
<VAST version="4.1"> <Ad id="wrap-1"> <Wrapper> <AdSystem>Buyer Ad Server</AdSystem> <VASTAdTagURI><![CDATA[https://cdn.example.com/inline.xml]]></VASTAdTagURI> <Impression><![CDATA[https://dsp.example.com/imp?aid=991]]></Impression> <Creatives> <Creative> <VideoClicks> <ClickThrough><![CDATA[https://brand.example.com/offer?utm=video]]></ClickThrough> </VideoClicks> </Creative> </Creatives> </Wrapper> </Ad></VAST>The XML above is structurally familiar. Under VAST 4.1 wrapper rules, many players treat VideoClicks on the Wrapper as absent. They follow VASTAdTagURI, merge impressions, and play the InLine. The ClickThrough never enters the click handler because the playing document is the inner file.
If you validate only this hop, a schema checker may still warn depending on rule packs. The production failure is behavioral: zero click events in the player log while impression URLs on the same wrapper succeed. That is the signature to grep for before you accuse the landing page of blocking CTV user agents.
Compare the declared version to the player map in the IO. If the environment is pinned to 4.0 or 4.1, move ClickThrough to the InLine or raise the declared version to 4.2 or newer only if every player in the path supports it. Declaring 4.2 while a middle wrapper downgrades the document breaks other fields too.
<VAST version="4.2"> <Ad id="inline-1"> <InLine> <AdSystem>Creative Host</AdSystem> <Impression><![CDATA[https://dsp.example.com/imp?aid=991]]></Impression> <Creatives> <Creative> <Linear> <Duration>00:00:15</Duration> <MediaFiles> <MediaFile delivery="progressive" type="video/mp4" width="1920" height="1080"> <![CDATA[https://cdn.example.com/ad.mp4]]> </MediaFile> </MediaFiles> <VideoClicks> <ClickThrough><![CDATA[https://brand.example.com/offer?utm=video]]></ClickThrough> </VideoClicks> </Linear> </Creative> </Creatives> </InLine> </Ad></VAST>Get VAST spec updates, platform guides, and release notes in your inbox.
Putting ClickThrough on the Linear creative inside InLine matches what most players implement regardless of wrapper politics. The impression URL can still fire from an outer wrapper hop for the seller chain. The click destination must survive on the document that owns the MediaFile the device decodes.
When you must keep a wrapper ClickThrough for 4.2 and later, treat it as additive, not exclusive. Confirm the inline still carries VideoClicks if any hop in the chain strips wrapper creatives. Inspect the live chain; do not trust the first fetch alone.
ClickTracking URLs are not ClickThrough. A chain of ClickTracking beacons records attempts and redirects for measurement vendors. They do not replace the primary ClickThrough the buyer expects in the DSP UI. Confusing the two produces tags that ping trackers while the primary destination remains missing on the inline.
Trafficking checklist at the DSP
- Record declared VAST version on the line item and the player map from the IO.
- Fetch the tag URL the ad server will call, not only the XML attachment from email.
- If the first response is a Wrapper, inspect until InLine and note which hop holds VideoClicks.
- Reject wrapper-only ClickThrough when the campaign targets VAST 4.0 or 4.1 players.
- Compare click macro expansion on the inline URL after ad server fill, not on the unfilled attachment.
- Split discrepancy tickets: missing click node versus macro versus landing page blocking TV user agents.
- Log error code 301 only after you confirm the player attempted a navigation URL from VideoClicks.
What to send back in a discrepancy ticket
Send the creative team the inline hop number where VideoClicks is missing, not a screenshot of the outer wrapper alone. Send the ad server owner the wrapper URL if VASTAdTagURI returns a different inline host than the attachment they approved. Keep verification and fraud out of the thread until click structure is settled.
vastlint checks whether VideoClicks appears where the declared version allows it and whether wrapper depth and VASTAdTagURI are coherent. It does not prove the player implemented 4.2 wrapper clicks on your device model. It does give you a document-level rebuttal when the buyer trafficked a 4.1 wrapper pattern.
Pair document checks with the inspector when the tag is URL-driven. The validator answers pasted XML. The inspector answers which hop dropped VideoClicks before the inline played. That split mirrors how DSP ad ops actually debug: sample response from the bidder, wrapped tag from the seat, export from the ad server.
Validate the hop that should carry clicks
Paste wrapper or inline XML into the validator. Paste the live tag URL into the tester, then inspect when the first body is a Wrapper.
Check the tagSources
IAB Tech Lab VAST standard landing page.
Version matrix for ClickThrough on wrapper VideoClicks.
VASTAdTagURI, depth, and chain inspection.
OpenRTB delivery versus VAST document quality on the response.
Trade coverage of nested VAST wrappers, latency, and player error codes in CTV.
NonLinearClickThrough on the wrong hop fails the same way on portfolio inventory.