VCR & Impression Tracking: VAST Quartile Beacons
LtvAdx tracks every ad event from impression through completion via VAST 4.2 quartile beacons. This guide covers the event schema, VCR calculation, and reporting API for delivery metrics.
VAST event pipeline
When a VAST ad plays, the player fires HTTP GET requests to LtvAdx beacon URLs embedded in the VAST XML. These events are ingested into a Redis-backed event pipeline and written to the reporting database within 2 minutes. For SSAI integrations, beacons are fired server-side by LtvAdx as segments are delivered.
Event reference
| VAST Event | Trigger | Used In |
|---|---|---|
| impression | Ad tag fetched by player or SSAI session created | Fill rate, eCPM |
| start | Playback begins (0% mark) | VCR numerator base |
| firstQuartile | 25% of creative duration elapsed | Q1 drop-off |
| midpoint | 50% of creative duration elapsed | Q2 drop-off |
| thirdQuartile | 75% of creative duration elapsed | Q3 drop-off |
| complete | 100% of creative played | VCR numerator |
| skip | Viewer skipped (skippable format only) | Skip rate |
| pause | Viewer paused playback | Engagement signal |
| resume | Viewer resumed after pause | Engagement signal |
| mute | Viewer muted audio | Mute rate |
| click | Click-through URL activated | CTR |
| error | VAST error code fired by player | Error rate |
VCR calculation
Video Completion Rate (VCR) is the percentage of ad impressions where the full ad was played. LtvAdx calculates VCR as:
VCR = complete events / start events × 100 Example: starts = 10,000 completes = 7,200 VCR = 72.0% Funnel view: impressions → 12,000 (some fire impression but player never starts) starts → 10,000 (player began playback) Q1 (25%) → 9,600 Q2 (50%) → 8,900 Q3 (75%) → 8,100 completes → 7,200
Impression vs start
Impression fires when the VAST tag is fetched (the ad break started). Start fires when video playback begins. The gap between them reflects players that fetched the tag but buffered, errored, or abandoned before playback. Always report VCR against starts — not impressions — for accurate industry-comparable metrics.
Beacon URL format
All beacon URLs in the VAST response follow this structure. They are pre-signed and must not be modified:
# Impression beacon
GET https://ads.ltvadx.com/track/impression?req={requestId}&sig={hmac}&ts={timestamp}
# Quartile beacons
GET https://ads.ltvadx.com/track/start?req={requestId}&sig={hmac}
GET https://ads.ltvadx.com/track/q1?req={requestId}&sig={hmac}
GET https://ads.ltvadx.com/track/q2?req={requestId}&sig={hmac}
GET https://ads.ltvadx.com/track/q3?req={requestId}&sig={hmac}
GET https://ads.ltvadx.com/track/complete?req={requestId}&sig={hmac}
# Engagement beacons
GET https://ads.ltvadx.com/track/skip?req={requestId}&sig={hmac}
GET https://ads.ltvadx.com/track/click?req={requestId}&sig={hmac}&dest={encodedClickUrl}
GET https://ads.ltvadx.com/track/error?req={requestId}&sig={hmac}&code={vastErrorCode}
# Response: 200 with 1x1 transparent pixel (no-store, no-cache)VAST error codes
When the player cannot play the ad, it fires the error beacon with an IAB VAST error code. Common codes reported in LtvAdx analytics:
| Code | Meaning | Common Cause |
|---|---|---|
| 100 | XML parsing error | Malformed VAST response |
| 101 | VAST schema validation error | VAST version mismatch |
| 200 | Trafficking error — ad size | Creative resolution mismatch |
| 300 | Wrapper error | Wrapper chain too long (max 3) |
| 301 | Timeout fetching wrapper | Third-party VAST URL unreachable |
| 400 | General linear error | Media file not reachable |
| 401 | File not found | CDN 404 on creative asset |
| 405 | Media file not supported | Video codec/format unsupported by player |
| 500 | AdSlot not compatible | Floor CPM not met — empty VAST returned |
| 900 | Undefined error | Unknown player error |
IVT (Invalid Traffic) detection
LtvAdx automatically flags and filters invalid traffic before billing. IVT checks include:
- Beacons received faster than minimum plausible playback speed
- Beacons fired without a corresponding impression event
- Complete events without any quartile events (bot pattern)
- Unusual Q1→complete without Q2/Q3 (player scrub pattern)
- High error rate from the same household/device combination
IVT-flagged events are excluded from billing and reported separately under Reports → Delivery → IVT Breakdown.
Reporting API
Query delivery metrics programmatically. All endpoints require a Bearer token from Dashboard → Settings → API Keys:
# Delivery summary
GET https://api.ltvadx.com/api/v1/reports/delivery
?from=2026-06-01
&to=2026-06-03
&channelId=chan_fast_news_01
&groupBy=day
# Response
{
"rows": [
{
"date": "2026-06-01",
"impressions": 48200,
"starts": 44100,
"q1": 42300,
"q2": 39800,
"q3": 36200,
"completes": 31900,
"skips": 1200,
"clicks": 880,
"vcr": 72.3,
"skipRate": 2.7,
"ctr": 2.0,
"revenue": 144.72
}
],
"totals": { ... }
}
# VCR breakdown by creative
GET https://api.ltvadx.com/api/v1/reports/vcr
?campaignId=camp_xyz
&from=2026-06-01
&to=2026-06-03