Pixels · engineers · marketers
VAST start is still an impression pixel
Short answer
A VAST tag is a video creative plus a bundle of collector URLs. Impression is the load beacon. Tracking start, firstQuartile, midpoint, thirdQuartile, complete, skip, and progress are more load-class beacons at playback offsets. ClickThrough is the 302 chain. Mixing those slots is the same trafficking miss as putting a landing page in a display impression pixel.
Validate a pixel Open the rulepack
Three slots, one XML document
Impression fires when the player accepts the ad, often before the first frame. Tracking events fire later, on a clock the player owns. ClickThrough fires on click and should 302 until the advertiser page. A collector that 204s is an impression-class URL. A collector that 302s is a click tracker. Do not reuse the click URL as Impression with a different cache buster.
pixellint validate url on a fired start beacon. It does not parse the VAST parent. If the URL still contains [CACHEBUSTER] or ${CACHEBUSTER}, mark the artifact fired and treat it as an unexpanded macro. The tag-side check (did the XML even declare event=start) lives on the VAST side: https://vastlint.org/docs/vast-tracking-events/start/
Quartiles are not extra impressions
firstQuartile, midpoint, and thirdQuartile are progress beacons, not a second billing impression. Billing still sits on Impression (and sometimes on a vendor-specific start). If your discrepancy meeting treats quartile volume as unpaid impressions, you are mixing two counters. If quartile URLs 404 while Impression 204s, the video played and the progress log is dead.
The player fires them from Linear TrackingEvents. Missing nodes mean the player never has a URL to GET. That is a trafficking omission, not a pixel syntax bug. Event pages: https://vastlint.org/docs/vast-tracking-events/firstQuartile/ https://vastlint.org/docs/vast-tracking-events/midpoint/ https://vastlint.org/docs/vast-tracking-events/thirdQuartile/
Skip and progress only exist if they fire
skip is optional until the creative is skippable and the user skips. A tag with no skip tracker will not tell the vendor the skip happened. progress is offset-based and repeats. A progress URL that 302s to a landing page is the impression-to-click mix-up on a timer.
https://vastlint.org/docs/vast-tracking-events/skip/ https://vastlint.org/docs/vast-tracking-events/progress/
Macros expand at fire time
VAST macros use [NAME] in many insertions. After the player substitutes, the request must still be an absolute https URL with a host. A macro in the hostname is garbage after expansion, the same as display. Consent macros that expand to 1 are still not a TC String.
Which tokens are legal in VAST, and where they may sit: https://vastlint.org/docs/vast-macros/ Validate the fired HAR row with pixellint validate url --state fired. Validate the GAM template with --state template. Do not run one fixture as both.
What each tool sees
Pixellint sees the URL. Status, scheme, macros, mixed syntax, consent placeholders. It will not tell you the wrapper three hops up dropped TrackingEvents. vastlint sees the XML: missing event nodes, empty CDATA, HTTP on an HTTPS player.
Fetch the live tag in the VAST tester when the document still has to unwrap: https://vastlint.org/tester/ Walk hops when the player printed 303: https://vastlint.org/inspect/ Then paste the fired start URL here. Two contracts, two pastes.
A fired start that still says CACHEBUSTER
Copy the start URL from Chrome Network or Charles. If you still see square brackets, the player never expanded, or you copied the template from the ad server UI. That hit did not uniquely count. Fix the player macro map or the trafficking slot. Do not add a second Impression pixel to compensate.
Same miss on display: leftover ord=1, leftover [timestamp]. The VAST name for that token is often CACHEBUSTER. The job is identical.
https://track.example.com/start?cb=[CACHEBUSTER]&adid=[AD_ID]
Check the artifact
Paste the pixel URL or JSON body into the
playground. Same engine as
pixellint validate. Artifacts you test may be stored;
see privacy.