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 EventTriggerUsed In
impressionAd tag fetched by player or SSAI session createdFill rate, eCPM
startPlayback begins (0% mark)VCR numerator base
firstQuartile25% of creative duration elapsedQ1 drop-off
midpoint50% of creative duration elapsedQ2 drop-off
thirdQuartile75% of creative duration elapsedQ3 drop-off
complete100% of creative playedVCR numerator
skipViewer skipped (skippable format only)Skip rate
pauseViewer paused playbackEngagement signal
resumeViewer resumed after pauseEngagement signal
muteViewer muted audioMute rate
clickClick-through URL activatedCTR
errorVAST error code fired by playerError 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:

CodeMeaningCommon Cause
100XML parsing errorMalformed VAST response
101VAST schema validation errorVAST version mismatch
200Trafficking error — ad sizeCreative resolution mismatch
300Wrapper errorWrapper chain too long (max 3)
301Timeout fetching wrapperThird-party VAST URL unreachable
400General linear errorMedia file not reachable
401File not foundCDN 404 on creative asset
405Media file not supportedVideo codec/format unsupported by player
500AdSlot not compatibleFloor CPM not met — empty VAST returned
900Undefined errorUnknown 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