VASTlint

VAST examples / Tracking

Multiple <Impression> elements with the same URL

VAST 4.20 errors3 warningsVAST-2.0-duplicate-impression

The scenario

A publisher's ad server appended its impression beacon to a response that already carried the same beacon from an upstream wrapper, so the final document ended up with three identical <Impression> URLs.

The broken tag

<?xml version="1.0" encoding="UTF-8"?>
<!-- WARNING: Duplicate <Impression> elements with same URL — fires VAST-2.0-duplicate-impression -->
<VAST version="4.2">
  <Ad id="1">
    <InLine>
      <AdSystem>Acme</AdSystem>
      <AdTitle>Duplicate Impression Ad</AdTitle>
      <AdServingId>SERVING-001</AdServingId>
      <Impression id="imp1"><![CDATA[https://track.example.com/impression]]></Impression>
      <Impression id="imp2"><![CDATA[https://track.example.com/impression]]></Impression>
      <Impression id="imp3"><![CDATA[https://track.example.com/impression]]></Impression>
      <Creatives>
        <Creative>
          <UniversalAdId idRegistry="ad-id.org">TEST-001</UniversalAdId>
          <Linear>
            <Duration>00:00:30</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720">
                <![CDATA[https://cdn.example.com/video.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

What the validator reports

Running this tag through vastlint produces the following. The primary failure for this example:

warningVAST-2.0-duplicate-impressionIAB VAST 2.0 §2.3.3

Duplicate <Impression> URL found — the same pixel appears more than once

The same tag also surfaces these secondary findings — real tags rarely fail in isolation:

warningVAST-2.0-version-mismatchIAB VAST 2.0 §2.1

VAST version attribute does not match structural signals in the document

warningVAST-2.0-linear-tracking-quartilesIAB VAST 4.1 §3.14.2line 15

<Linear> has no standard quartile tracking events (start/firstQuartile/midpoint/thirdQuartile/complete) — ad will serve but measurement system receives no signal

infoVAST-4.1-mezzanine-recommendedIAB VAST 4.1 §3.9.2line 17

<MediaFiles> has no <Mezzanine> — ad-stitching servers may reject this tag in CTV/SSAI contexts

Why it breaks

The InLine contains multiple <Impression> elements that all point to the exact same URL. The player fires every <Impression> on render, so an identical URL repeated three times is called three times for a single ad view. Distinct impression URLs (first-party plus third-party verification) are normal and expected; identical duplicates are not — they represent the same beacon accidentally added more than once.

What it costs

The duplicated beacon inflates the impression count for that endpoint, so reporting over-states delivery for one ad view. On a CPM buy that can mean over-billing and a reconciliation dispute when the buyer's own count (or the verification vendor's) does not match. Even when caught, it erodes trust between buyer and seller and triggers manual audits.

The fix

De-duplicate identical <Impression> URLs so each beacon appears once. Keep genuinely different impression endpoints (server, verification, partner) — the rule targets exact-URL repeats, not multiple distinct trackers.

<!-- one beacon per distinct endpoint -->
<Impression id="srv"><![CDATA[https://ads.example.com/imp]]></Impression>
<Impression id="verify"><![CDATA[https://verify.example.com/imp]]></Impression>

VAST XML fragment only. This excerpt belongs inside a complete VAST document, so standalone validation will fail until it is wrapped in a full <VAST>response.

Check your own version of this tag

Paste the resolved XML to run the same spec check, test a live tag URL, or inspect the wrapper chain hop by hop.

Related examples

Related reading