> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pixalate.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pixalate.com/_mcp/server.

# Video viewability and engagement (beta)

> How Pixalate Video Viewability (VV) and Video Engagement (VE) measurement works, the VAST and OM SDK integration requirements, methodology, limitations and troubleshooting, plus how Pixalate uses Open Measurement.

Pixalate's Video Viewability (VV) and Video Engagement (VE) measurement covers programmatic and direct-sold video. It provides 54 metrics across three IVT-filtering tiers, covering video ad delivery, viewability outcomes and engagement. Both reports are under **Reports** in Pixalate Analytics. See [Metrics](/analytics/metrics) for each metric's definition.

Methodology is informed by the MRC Video Viewable Impression Measurement Guidelines (50% of the video player's pixels visible on-screen for at least 2 continuous seconds while the video is playing), with audibility detection powered by Open Measurement SDK (OM SDK) signals.

> **Info**
>
> **Beta.** VV and VE are in beta, reflecting the initial rollout phase. The metrics methodology is stable, and beta status will be lifted when the launch validation cycle is complete. Beta doesn't indicate any limitation in measurement accuracy.

*Video (2 min): set up video viewability and engagement with the OM SDK.*

## How it works

Your video ad's VAST response references Pixalate's standard JavaScript verification script in its `<AdVerifications>` node. The video player runs the script alongside the creative through the OM SDK. The script collects OM SDK viewability and audibility signals and reports them to Pixalate for measurement and reporting in your Analytics dashboard.

Pixalate is **not** a VAST wrapper server. You configure the verification script as a verification provider in your existing VAST chain (through the publisher, SSP or ad server). No SDK is installed, and the ad-serving path doesn't change.

> **Warning**
>
> Don't also fire a Pixalate 1x1 pixel on a VV-measured ad. The impression is counted twice. The verification script carries both the impression and the measurement.

## Before you start

Both of these must be in place for VV and VE metrics to populate:

1. **An OM SDK-compliant delivery chain.** The publisher, SSP or ad server software in your delivery chain must support the Open Measurement SDK.
2. **An `<AdVerifications>` reference in VAST.** Pixalate's JavaScript verification script must be referenced in the VAST `<AdVerifications>` node of the response.

Your Customer Success representative gives you the production script URL.

## VAST version support

VV and VE measurement needs VAST 3.0 or 4.0 and later in practice. The player has to run Pixalate's verification JavaScript through the OM SDK. VAST 4.0 and later support this natively; VAST 3.0 supports it through the `<Extensions>` wrapper shown below. VAST 2.0 predates IAB Open Measurement, and most VAST 2.0 players don't run verification JavaScript at all.

| VAST version                      | Status                     | Where `<AdVerifications>` goes                                                                                         | Notes                                                                                                                                                   |
| --------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **VAST 4.x** (4.0, 4.1, 4.2, 4.3) | Recommended                | Native `<AdVerifications>` element inside `<InLine>` or `<Wrapper>`                                                    | The path for new and upgradeable inventory. VAST 4.1 introduced the standardized `<AdVerifications>` node aligned with the OM SDK; 4.2 and 4.3 keep it. |
| **VAST 3.0**                      | Supported, with caveats    | Wrapped: `<Extensions><Extension type="AdVerifications"><AdVerifications>…</AdVerifications></Extension></Extensions>` | The player must implement the OM SDK and parse the typed `<Extension>` correctly. Validate each player environment before broad rollout.                |
| **VAST 2.0**                      | Not supported in practice  | No mechanism in the spec                                                                                               | Upgrade the VAST response chain to 3.0 or 4.x to get VV and VE on this inventory.                                                                       |
| **VPAID**                         | Deprecated by the industry | —                                                                                                                      | Plan a migration to VAST 4.x with the OM SDK for new integration work.                                                                                  |

The IAB Tech Lab's VAST versions go 3.0, 4.0, 4.1, 4.2, 4.3. There's no VAST 3.1. Use the `<Extensions>` wrapper for any 3.x context and native `<AdVerifications>` for any 4.x context.

## Add the verification script

Replace `PIXALATE_SCRIPT_URL` with the script URL Pixalate gives you.

#### VAST 4.x (recommended)

```xml
<InLine>
  <!-- AdSystem, AdTitle, Creatives, etc. -->
  <AdVerifications>
    <Verification vendor="pixalate.com-omid">
      <JavaScriptResource apiFramework="omid" browserOptional="true">
        <![CDATA[PIXALATE_SCRIPT_URL]]>
      </JavaScriptResource>
    </Verification>
  </AdVerifications>
</InLine>
```

#### VAST 3.0

```xml
<InLine>
  <!-- AdSystem, AdTitle, Creatives, etc. -->
  <Extensions>
    <Extension type="AdVerifications">
      <AdVerifications>
        <Verification vendor="pixalate.com-omid">
          <JavaScriptResource apiFramework="omid" browserOptional="true">
            <![CDATA[PIXALATE_SCRIPT_URL]]>
          </JavaScriptResource>
        </Verification>
      </AdVerifications>
    </Extension>
  </Extensions>
</InLine>
```

Each of these must be exact:

* `vendor="pixalate.com-omid"` (case-sensitive)
* `apiFramework="omid"`
* a `<![CDATA[ ]]>` wrapper around the script URL
* any `#` in the URL left unencoded, as a real URI fragment
* for VAST 3.0, `type="AdVerifications"` on `<Extension>` (case-sensitive)

## Macros in the script URL

The script URL carries two families of macros.

### Ad server macros

Pixalate's verification tag contains template macros that your ad server must replace when it generates the VAST response. The syntax depends on your ad server's templating engine, for example `$!{…}` for Apache Velocity, `${…}` or `%%…%%`. These macros carry the context of each impression, such as campaign ID, creative ID, publisher ID, IP, device, supply type, geo and video length. Pixalate needs them for IVT classification, reporting breakouts and measurement.

The verification script can't read a macro left as a literal template string. Impressions in that state are classified as Undetermined and don't count toward viewability or engagement metrics.

> **Tip**
>
> If your dashboard shows zero for all VV and VE metrics after a structurally correct integration, first check that your ad server replaces its macros before it delivers the VAST.

Your tag template may include extra key-value slots for signals agreed during onboarding. For questions about your tag template, contact your Customer Success representative. For the parameters in general, see [The Pixalate tag and macros](/analytics/tag-and-macros).

### IAB VAST macros

These macros are part of the IAB VAST specification (standardized in VAST 4.1). A VAST-compliant player replaces them when the script loads. Your ad server should leave them as literal bracketed text.

The ones that matter most for VV and VE are `[IFA]` (uniqueness and IVT), `[CONTENTPLAYHEAD]` / `[ADPLAYHEAD]` (quartile detection, which drives every VE metric) and `[PLAYERSIZE]` (viewability geometry). The rest add reporting detail but don't gate measurement.

| Macro                                      | Purpose                                                                                         |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------- |
| `[ERRORCODE]`                              | Verification error reporting                                                                    |
| `[CONTENTPLAYHEAD]` and `[ADPLAYHEAD]`     | Quartile detection (drives the First Quartile, Midpoint, Third Quartile and Completion metrics) |
| `[ASSETURI]`                               | Creative identification                                                                         |
| `[VASTVERSIONS]`                           | The player's declared VAST version                                                              |
| `[IFATYPE]` and `[IFA]`                    | Advertising identifier                                                                          |
| `[CLIENTUA]` / `[SERVERUA]` / `[DEVICEUA]` | User agent strings                                                                              |
| `[DEVICEIP]`                               | Device IP                                                                                       |
| `[LATLONG]`                                | Geo                                                                                             |
| `[DOMAIN]` / `[PAGEURL]`                   | Web context                                                                                     |
| `[PLAYERSIZE]`                             | Player dimensions                                                                               |
| `[REGULATIONS]`                            | GDPR, CCPA and COPPA signals                                                                    |
| `[ADTYPE]`                                 | Linear or non-linear                                                                            |
| `[TRANSACTIONID]`                          | Unique impression identifier                                                                    |
| `[BREAKPOSITION]`                          | Pre-roll, mid-roll or post-roll                                                                 |
| `[APPNAME]`                                | App name (in-app)                                                                               |
| `[PLACEMENTTYPE]`                          | Outstream, instream or CTV                                                                      |

If the player doesn't support IAB VAST 4.1 macro replacement (older or non-compliant players), the bracketed macros pass through as literals. The impression still registers if the ad server macros are correct, but quartile, geo and identifier breakdowns are incomplete for those impressions.

## Player requirements

For VV and VE metrics to populate, the video player must:

1. Implement the Open Measurement SDK at a current build (OMID 1.4.x or later recommended).
2. Parse the `<AdVerifications>` node (native in VAST 4.x, inside `<Extensions>` in VAST 3.0) and pass the `<JavaScriptResource>` to the OM SDK runtime.
3. Start an OM SDK ad session and emit viewability state observer events.
4. Emit OM SDK video events (start, first quartile, midpoint, third quartile, complete) for engagement measurement.
5. Emit OM SDK volume-change signals for audibility measurement.
6. Allow the Pixalate script to load under the player's Content Security Policy and sandbox settings.

A publisher or player vendor that declares "OMID support" is making a metadata claim, not proving correct end-to-end behavior. Common gaps include an `<AdVerifications>` block that's parsed but never started as an OM SDK session, OM SDK version mismatches between the player and the verification script, and Content Security Policy rules that silently block the script. Run a short validation pass in each player environment before broad rollout.

## Methodology

**Video impressions.** Recorded post-buffer as Rendered Video Impressions, per the MRC Video Impression Guidelines: only impressions where video playback has begun.

**Viewability.** A video impression is **Viewable** when 50% or more of the video ad player's pixels are visible on-screen for at least 2 continuous seconds while the video is playing, consistent with the MRC Video Viewable Impression Measurement Guidelines. Each Measured Video Impression is classified as one of:

* **Viewable Video Impression:** a Measured Video Impression that meets the 50% / 2-continuous-second standard
* **Non-Viewable Video Impression:** a Measured Video Impression that doesn't meet the standard
* **Undetermined Video Impression:** a Rendered Video Impression for which Pixalate couldn't collect enough OM SDK signal to decide viewability

**Engagement.** Measured at four VAST quartile milestones (First Quartile, Midpoint, Third Quartile, Completion), plus Average Playback Duration and Audibility Rate.

**Audibility.** Detected through OM SDK signals: whether audio was on during video ad playback.

**IVT filtering.** Every VV and VE metric is reported at three tiers:

* **Gross:** before invalid traffic is removed
* **Net of GIVT:** after general invalid traffic is removed
* **Net of All IVT:** after both general and sophisticated invalid traffic are removed

## Available reports

![Reports menu](/_fern-img/41784679db6bb1186ba775dad765268d2301447f679a8c702cc7d7cb70b0ee9f.webp)

| Tier           | VV metrics | VE metrics | Total  |
| -------------- | ---------- | ---------- | ------ |
| Gross          | 4          | 10         | 14     |
| Net of GIVT    | 10         | 10         | 20     |
| Net of All IVT | 10         | 10         | 20     |
| **Total**      | **24**     | **30**     | **54** |

* **Video Viewability report (24 metrics):** video ad delivery and viewability outcomes across the three IVT-filtering tiers.
* **Video Engagement report (30 metrics):** quartile completion (First Quartile, Midpoint, Third Quartile, Completion), Average Playback Duration and Audibility Rate across the three tiers.

For each metric's definition, see [Metrics](/analytics/metrics).

## Known limitations

* **No historical backfill.** VV and VE reports populate from the date measurement is enabled. Earlier traffic isn't backfilled.
* **Player capability.** Measurement needs a player that supports the OM SDK and correctly starts an OMID ad session. Validate each player environment before broad rollout.
* **VPAID.** Deprecated by the industry. For new integration work, use VAST 4.x with the OM SDK.
* **VAST 2.0.** VV and VE measurement isn't achievable on VAST 2.0 inventory in practice. Upgrade the VAST response chain to 3.0 or 4.x.

## Troubleshooting

| Symptom                                                            | Likely cause                                                                                                                          | What to do                                                                                                                       |
| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| Every VV metric shows zero                                         | Ad server macros aren't replaced (the script URL contains literal `$!{…}` strings), or `dvid=v` isn't set                             | Check that your ad server's templating engine resolves the macros before VAST delivery, and that the literal `dvid=v` is present |
| The script loads, but Measured % is very low                       | The player doesn't fully support the OM SDK                                                                                           | Check the player vendor's OM SDK documentation; the player may need an update                                                    |
| Audibility Rate stays at 0%                                        | The player doesn't emit OM SDK audio signals                                                                                          | Some players support viewability but not audibility. Confirm the player's capabilities.                                          |
| Many impressions are Undetermined                                  | The player runs the script but can't determine viewport state (older player, embedded WebView, Content Security Policy restriction)   | Environment-specific. Isolate by inventory subset and validate each environment.                                                 |
| Wrong URL hostname                                                 | The URL points at a non-production Pixalate hostname                                                                                  | Switch to the production URL from your Customer Success representative                                                           |
| Impressions counted twice                                          | A 1x1 tracking pixel fires alongside the verification script on the same ad                                                           | Remove the 1x1 `<Impression>` node from the ad server templates for VV-measured traffic                                          |
| No data for the weeks before enablement                            | Reports populate from the enablement date                                                                                             | By design; there's no backfill                                                                                                   |
| Average Playback Duration doesn't match the player's playback time | Average Playback Duration is derived from the highest quartile milestone reached times the creative duration, not exact playback time | Align your methodologies. See the metric definitions in [Metrics](/analytics/metrics).                                           |

For anything else, contact your Customer Success representative or [support@pixalate.com](mailto:support@pixalate.com) with a representative test impression URL and a description of what you see compared with what you expect.

## Open Measurement

Open Measurement is a [standard and SDK](https://iabtechlab.com/standards/open-measurement-sdk/) from the IAB Tech Lab. It gives publishers a single, trusted SDK that verification scripts can use for viewability and other signals, instead of including a separate measurement SDK for each vendor.

Pixalate's script-based viewability measurement supports Open Measurement. Pixalate's viewability script checks for the OM SDK first, alongside MRAID and other mechanisms, because it's the most current standard. If it doesn't find the OM SDK, it falls back to the other available mechanisms.

#### Do I need to change my tags to use Open Measurement?

No. Pixalate picks up OM signals wherever they're available, and uses them in the same way as its other viewability signals. Video viewability and engagement is the exception: it needs the verification script in your VAST, as described on this page.

#### Why does Open Measurement support matter?

The OM SDK is widely deployed and is the main measurement standard, so supporting it makes more inventory measurable.

#### Which platforms does Open Measurement support?

Mobile platforms (Android and iOS) were supported first and are the most widely adopted. The OM SDK also supports web and CTV.

## Related

* [Video: the 1x1 tag in VAST](/analytics/video-tag)
* [MRC accreditation](/trust/mrc-accreditation)
* IAB Tech Lab: [VAST](https://iabtechlab.com/standards/vast/) and [Open Measurement SDK](https://iabtechlab.com/standards/open-measurement-sdk/)
* Media Rating Council: [mediaratingcouncil.org](https://www.mediaratingcouncil.org/)
* Pixalate's Description of Methodology: ask your Pixalate account manager for the current version