Recording which ads a user actually saw lets you build audiences from ad exposure rather than content consumption alone. Typical use cases:
Retargeting — build a cohort of everyone who saw a particular campaign, and target them with a follow-up.
Suppression — stop serving a campaign to users who have already seen it enough times.
Sequential messaging — serve creative B only to users who have already seen creative A.
Measurement — attribute on-site actions back to prior ad exposure.
All of these depend on capturing an identifier that reliably tells you which ad was shown. That turns out to be the hard part, and it is what most of this guide is about.
You need access to your video player’s ad integration code, so you can read ad metadata at impression time.
Confirm how your ad server hosts video creatives (see Which identifier should you use) — this determines which identifiers are available to you.
Scope. This guide covers client-side video, where the Google IMA SDK requests and renders the ad in the user’s browser or app.It does not cover display advertising, which uses different mechanisms, or server-side ad insertion (SSAI/DAI), where the ad is stitched into the video stream before it reaches the player and different metadata is available.Examples throughout use Google Ad Manager, since it is the most common setup, but the underlying behaviour applies to any ad server serving VAST through the IMA SDK.
When a video ad plays, four things happen in sequence:
1
The player requests an ad
Your player asks the ad server for an ad to fill the break.
2
The ad server responds with VAST
VAST (Video Ad Serving Template) is an XML document describing the ad. It comes in two forms. An inline response contains the ad itself, including the video file. A wrapper response contains no video file, only a pointer to another ad server that will supply one.
3
The SDK follows the chain
If the response is a wrapper, the IMA SDK requests the next URL, and repeats until it reaches an inline response. A single ad can involve several hops. Each hop is a separate ad server with its own identifiers for the same ad.
4
You read the metadata and record an event
The SDK exposes the assembled ad metadata through the google.ima.Ad object. You read the identifiers you need and send them to Permutive as a custom event.
The wrapper chain in step three is where most tracking problems originate. Every hop has its own creative ID, and they are unrelated numbers. The identifier you get back depends on which hop the SDK reads from.
The google.ima.Ad object exposes these methods at impression time:
Method
Returns
Which hop
getAdId()
The ad’s ID
Innermost (inline) ad
getCreativeId()
The creative’s ID
Innermost (inline) ad
getAdSystem()
The name of the ad server that served the inline ad
Innermost (inline) ad
getDealId()
The deal / programmatic agreement ID
The deal, where one applies
getWrapperAdIds()
Array of ad IDs, one per wrapper
Every wrapper in the chain
getWrapperCreativeIds()
Array of creative IDs, one per wrapper
Every wrapper in the chain
getWrapperAdSystems()
Array of ad server names, one per wrapper
Every wrapper in the chain
getUniversalAdIds()
Registry-issued creative identifiers, where the advertiser set them
Innermost (inline) ad
getCreativeId() always reads the innermost ad, not your ad server.If your ad server hosts the video file, the innermost ad is your ad server’s, and getCreativeId() returns the ID you see in your own UI.If your ad server redirects to someone else’s, the innermost ad belongs to that other system, and getCreativeId() returns their creative ID. It will look like a perfectly valid ID. It will simply not correspond to anything in your ad server.
The wrapper arrays are ordered innermost first, outermost last. Since your own ad server initiates the chain, it is the outermost wrapper, so its entry is the last element.
Always capture getAdSystem() alongside any creative ID. It tells you whose numbering scheme the ID belongs to, which is the difference between an ID you can use and one you cannot. Google Ad Manager reports as GDFP; Display & Video 360 reports as DBM.
In Google Ad Manager you can check this under Delivery → Creatives, in the Type column. The distinction is simply whether the ad server holds the video file itself or holds a pointer to it.
Direct-sold campaigns are usually trafficked as Video, because the publisher receives the asset and uploads it. Programmatic Guaranteed and other deal-based buys are usually Redirect or Programmatic, because the buyer serves the creative from their own ad server.This is why creative-level video retargeting often works perfectly for direct-sold inventory and returns nothing for programmatic inventory on the same site.
When the chain reaches the player, your ad server’s creative ID is in getWrapperCreativeIds(). Rather than assuming a fixed position, find your ad server by name in getWrapperAdSystems() and read the same index.
/** * Resolve the creative ID belonging to a specific ad server. * @param {google.ima.Ad} ad * @param {string} adServerName - e.g. 'GDFP' for Google Ad Manager * @returns {string|null} */function resolveCreativeId(ad, adServerName) { // The ad server appears as a wrapper in the chain const systems = ad.getWrapperAdSystems(); const index = systems.indexOf(adServerName); if (index !== -1) { return ad.getWrapperCreativeIds()[index]; } // No wrapper: the inline ad is the ad server's own creative if (ad.getAdSystem() === adServerName) { return ad.getCreativeId(); } // Third-party creative with no recoverable ad server creative ID return null;}
This handles all three cases in the table above, and returns null precisely when no usable ID exists, which is the signal to fall back to deal ID.
Google documents the wrapper arrays as containing the full chain with the initiating ad server as the final element. Permutive has not independently verified this behaviour across ad servers, so treat the wrapper path as Google’s stated behaviour and confirm it against your own inventory before relying on it in production. The verification steps below show how.
Some ad servers can resolve the VAST chain on their own servers before responding to the player, returning a single flattened inline ad rather than a chain. In Google Ad Manager this is called Server-Side Unwrapping (SSU). It reduces the number of round trips the player makes, which improves latency and reduces drop-off.The trade-off is that the wrapper chain no longer exists by the time the SDK sees the response.
When server-side unwrapping is enabled, all three wrapper arrays return empty arrays.getWrapperAdIds(), getWrapperCreativeIds() and getWrapperAdSystems() return []. They do not throw and they do not warn. The only ad metadata that reaches the player is the innermost creative, which for third-party creatives belongs to the buyer.In this configuration your ad server’s creative ID cannot be recovered client-side by any means. No SDK change will surface it.
This is easy to misread, because the symptoms look like a coding error rather than a configuration outcome:
The methods exist and return cleanly.
The creative IDs look entirely normal in your ad server’s UI.
Events arrive in Permutive with populated, valid-looking creative IDs.
Cohorts built against those IDs simply never match anyone.
If getWrapperAdSystems() returns an empty array while getAdSystem() returns an ad server that is not yours, server-side unwrapping is the most likely explanation. Confirm with your ad server account team whether it is enabled for your network.
Where the creative ID cannot be recovered, getDealId() is populated for programmatic deals and offers a workable alternative.Deal ID identifies the line item, not the creative. Because a line item can carry several creatives, every creative on that line shares one deal ID, and they cannot be told apart from the deal ID alone.
If you need per-creative granularity with deal ID, each creative must sit on its own line item. This is an operational change in your ad server rather than a code change, and it is worth confirming your trafficking team is willing to work that way before committing to the approach.
title, duration and creative_id are part of the canonical ad event schema. The remaining properties are additions you would need to define in your own event schema first.
If you would rather store a single resolved identifier, use the helper from Reading the ID From the Wrapper Chain and record the fallback alongside it.
Keep deal_id even when creative_id resolves. It costs nothing, and it means you are not re-instrumenting your player if your creative hosting changes later.
VideoAdView and its ad.* properties follow Permutive’s canonical video ad event schema. Use these names where you can, so cohorts and reporting behave consistently across platforms.If you add properties beyond the canonical set, define them in your workspace’s event schema first, and avoid reusing an existing property for a new identifier — cohorts built before and after the change would silently target different things.
Play an ad from the inventory you care about, and log every identifier rather than inspecting them in a debugger. Collapsed arrays in dev tools can be hard to distinguish from empty ones.
If getAdSystem() returns your ad server, the inline creative is yours and getCreativeId() is directly usable. If it returns something else, the creative is third-party and you need the wrapper chain or deal ID.
3
Check whether the wrapper chain survived
A populated getWrapperAdSystems() means the chain reached the player and the wrapper lookup will work. An empty array means it did not, and deal ID is your route.
4
Cross-check the ID against your ad server
Take the creative ID your event recorded and search for it in your ad server. If it does not exist there, you are capturing a third-party identifier. This single check settles the question faster than any other.
5
Confirm the event lands in Permutive
In the Events section of your dashboard, look for your event name and confirm the properties are populated as expected.
6
Test both direct-sold and programmatic inventory
These behave differently. An implementation verified only against direct-sold campaigns can still return unusable identifiers on programmatic inventory.
Why does my ad server show one creative ID and Permutive record a different one?
They are identifiers from two different systems that happen to describe the same video. Your ad server’s creative ID is a record in your account. The buyer’s creative ID is a record in theirs. When the creative is served through a redirect, getCreativeId() reads the buyer’s.Capturing getAdSystem() alongside the ID tells you immediately which one you are holding.
Can I turn off server-side unwrapping to recover creative IDs?
In principle yes, and it would restore the wrapper chain. In practice it is a meaningful trade-off: server-side unwrapping exists to reduce round trips and improve latency and fill.Weigh it against the alternative of splitting creatives onto separate line items and using deal ID, which achieves the same granularity without changing how ads are delivered. Discuss the options with your ad server account team.
Does this affect display advertising too?
No. Display uses a different delivery mechanism and different tracking. This guide is specific to video ads rendered by the IMA SDK.
What about server-side ad insertion (SSAI/DAI)?
SSAI stitches ads into the video stream before it reaches the player, so the metadata available differs from client-side playback. The identifiers described here may not be present. Contact Support to discuss an SSAI setup.
Should I store the wrapper arrays even if I do not use them?
It is worth doing. They are small, and they make it possible to answer questions about historical impressions that you would otherwise need a new live test to investigate. They also make it obvious after the fact whether server-side unwrapping was in play.
Define the custom event schema your video ad events will validate against.
Tracking Off-Site Events with Pixels
Track conversions and impressions that happen away from your own pages.
IMA SDK Ad reference
Google’s full reference for the ad metadata methods used in this guide.
Contact Support
Troubleshoot an implementation or confirm the right approach for your setup.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Permutive","colors":{"primary":"#ff5e99","light":"#f3eefe","dark":"#632ef5"},"logo":{"light":"https://mintcdn.com/permutive/zX9G7jjpccuZZlEf/logo/permutive-logo-light.svg?fit=max\u0026auto=format\u0026n=zX9G7jjpccuZZlEf\u0026q=85\u0026s=ae940c2b1c2eb923f6344b583fef176c","dark":"https://mintcdn.com/permutive/zX9G7jjpccuZZlEf/logo/permutive-logo-dark.svg?fit=max\u0026auto=format\u0026n=zX9G7jjpccuZZlEf\u0026q=85\u0026s=6406296261c92b204e6a6a9f8cca5676"},"favicon":"https://mintcdn.com/permutive/pNhz39ducTVcQczh/favicon.svg?fit=max\u0026auto=format\u0026n=pNhz39ducTVcQczh\u0026q=85\u0026s=a80278bd668352096f35034b78398cb5","navbar":{"primary":{"type":"button","label":"Dashboard","href":"https://dash.permutive.com"}},"footer":{"socials":{"x":"https://x.com/permutive","github":"https://github.com/permutive","linkedin":"https://uk.linkedin.com/company/permutive"}},"styling":{"codeblocks":"dark","latex":true},"variables":{"android_core_release_version":"1.15.0","android_google_ads_release_version":"2.2.0","android_appnexus_release_version":"1.7.0"},"navigation":{"global":{"anchors":[{"anchor":"Support","icon":"life-ring","href":"mailto:technical-services@permutive.com"},{"anchor":"Status","icon":"signal","href":"https://status.permutive.com"},{"anchor":"Changelog","icon":"megaphone","href":"https://changelog.permutive.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"permutive","hasAudioNarration":false,"actualSubdomain":"permutive","customDomains":["docs.permutive.com"],"gitSource":{"type":"github","owner":"permutive","repo":"permutive-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af2098517e487d7b3a6260c","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"Guides","count":143},{"language":"default","tag":"Integrations","count":123},{"language":"default","tag":"Platform","count":102},{"language":"default","tag":"Deployment","count":66},{"language":"default","tag":"Signals","count":48},{"language":"default","tag":"Mobile","count":40},{"language":"default","tag":"Cohorts","count":37},{"language":"default","tag":"APIs","count":35},{"language":"default","tag":"Advertising","count":25},{"language":"default","tag":"Connectivity","count":21}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"styles/custom.css","content":"pre,pre[class*=\"shiki\"],[data-rehype-pretty-code-fragment] pre,div[data-rehype-pretty-code-fragment] pre,figure[data-rehype-pretty-code-figure] pre{background-color:#1A1A1A!important}pre span[style],code span[style]{color:var(--shiki-dark)!important}:not(pre)>code{padding:0.2em 0.4em;border-radius:3px}html:not(.dark) :not(pre)>code{background-color:#EDEDED!important;color:#FA8784!important}html.dark :not(pre)>code{background-color:#1A1A1A!important;color:#F7D0E2!important}[data-callout-type=\"note\"]{border-color:#5BB5E0!important}[data-callout-type=\"note\"] svg{color:#5BB5E0!important}[data-callout-type=\"tip\"]{border-color:#9B7EE8!important}[data-callout-type=\"tip\"] svg{color:#9B7EE8!important}[data-callout-type=\"info\"]{border-color:#9CA3AF!important}[data-callout-type=\"info\"] svg{color:#6B7280!important}[data-callout-type=\"warning\"]{border-color:#E8956A!important}[data-callout-type=\"warning\"] svg{color:#E8956A!important}html:not(.dark) [data-callout-type=\"note\"]{background-color:rgba(199, 232, 249, 0.4)!important}html:not(.dark) [data-callout-type=\"tip\"]{background-color:rgba(203, 182, 255, 0.4)!important}html:not(.dark) [data-callout-type=\"info\"]{background-color:rgba(237, 237, 237, 0.5)!important}html:not(.dark) [data-callout-type=\"warning\"]{background-color:rgba(249, 193, 168, 0.4)!important}html:not(.dark) :is([data-callout-type=\"note\"],[data-callout-type=\"tip\"],[data-callout-type=\"info\"],[data-callout-type=\"warning\"]) [data-component-part=\"callout-content\"]{color:#1A1A1A!important}html.dark [data-callout-type=\"note\"]{background-color:rgba(91, 181, 224, 0.12)!important}html.dark [data-callout-type=\"tip\"]{background-color:rgba(155, 126, 232, 0.14)!important}html.dark [data-callout-type=\"info\"]{background-color:rgba(156, 163, 175, 0.12)!important}html.dark [data-callout-type=\"info\"] svg{color:#9CA3AF!important}html.dark [data-callout-type=\"warning\"]{background-color:rgba(232, 149, 106, 0.12)!important}html.dark :is([data-callout-type=\"note\"],[data-callout-type=\"tip\"],[data-callout-type=\"info\"],[data-callout-type=\"warning\"]) [data-component-part=\"callout-content\"]{color:#E5E7EB!important}html.dark [data-callout-type] :not(pre)>code{background-color:rgba(255, 255, 255, 0.1)!important;color:#F7D0E2!important}.agent-chat-user{display:flex;justify-content:flex-end;margin:1.25rem 0}.agent-chat-user-bubble{max-width:85%;padding:0.75rem 1rem;border-radius:1rem;background-color:#F0F0F0;color:#1A1A1A}.agent-chat-user-bubble>p{margin:0.4rem 0}.agent-chat-agent{margin:1.25rem 0;padding:1rem 1.25rem 0.75rem;border:1px solid #E5E5E5;border-radius:1rem}.agent-chat-tools{font-size:0.8rem;color:#8A8A8A;margin-bottom:0.5rem}html.dark .agent-chat-user-bubble{background-color:#2A2A2A;color:#EDEDED}html.dark .agent-chat-agent{border-color:#333333}.agent-chat-conversation{display:grid;grid-template-columns:minmax(0, 1fr) 16.5rem;column-gap:5.75rem;margin:2rem -22.25rem 3rem 0}body:has(.agent-chat-conversation) #content-side-layout{pointer-events:none}body:has(.agent-chat-conversation) #table-of-contents-layout{pointer-events:auto}.agent-chat-conversation>.agent-chat-turn{grid-column:1;min-width:0;margin-bottom:1.5rem}.agent-chat-conversation{position:relative}.agent-chat-conversation>.agent-chat-rail{position:absolute;top:0;right:0;bottom:calc(-1 * var(--agent-chat-rail-extend, 0px));width:16.5rem}.agent-chat-turn-label{display:none}.agent-chat-rail-list{position:sticky;top:calc(9.5rem + var(--agent-chat-toc-height, 15rem) + 1.5rem);max-height:calc(100vh - 9.5rem - var(--agent-chat-toc-height, 15rem) - 2.5rem);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:none;list-style:none;margin:0;padding:0 0 0 1.25rem}.agent-chat-rail-list::-webkit-scrollbar{display:none}.agent-chat-rail-list::before{content:\"\";position:absolute;left:0;top:0;bottom:0;width:3px;border-radius:3px;background-color:#E5E5E5}.agent-chat-rail-step{position:relative}.agent-chat-rail-step::before{content:\"\";position:absolute;left:-1.25rem;top:0;bottom:0;width:3px;border-radius:3px;background-color:#ff5e99;opacity:0;transition:opacity 0.25s ease}.agent-chat-rail-step.is-active::before{opacity:1}.agent-chat-rail-step{margin:0 0 0.9rem;padding:0;font-size:0.875rem;opacity:0.45;transition:opacity 0.3s ease}.agent-chat-rail-step::marker{content:none}.agent-chat-rail-step.is-done{opacity:0.65}.agent-chat-rail-step.is-active{opacity:1}.agent-chat-rail-step .agent-chat-note-body{display:grid;grid-template-rows:0fr;overflow:hidden;transition:grid-template-rows 0.3s ease}.agent-chat-rail-step .agent-chat-note-body>*{min-height:0}.agent-chat-rail-step.is-active .agent-chat-note-body{grid-template-rows:1fr}.agent-chat-note-title{font-weight:600;margin:0.15rem 0 0.4rem}.agent-chat-note-body code{font-size:0.75rem}html.dark .agent-chat-rail-list::before{background-color:#333333}@media (max-width: 1279px){.agent-chat-conversation{grid-template-columns:minmax(0, 1fr);margin-right:0}.agent-chat-conversation>.agent-chat-rail{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.agent-chat-rail-list{position:relative;top:auto;max-height:none;overflow:visible;-webkit-mask-image:none!important;mask-image:none!important}.agent-chat-rail-step::before{display:none}.agent-chat-rail-step,.agent-chat-rail-step.is-done{opacity:1}.agent-chat-rail-step .agent-chat-note-body{grid-template-rows:1fr}.agent-chat-turn-label{display:none}.agent-chat-conversation{padding-top:var(--agent-chat-floating-space, 0px)}}.agent-chat-excerpt{-webkit-mask-image:linear-gradient(to bottom, black calc(100% - 3rem), transparent);mask-image:linear-gradient(to bottom, black calc(100% - 3rem), transparent)}.agent-chat-body:has(details[open]) .agent-chat-excerpt{display:none}.agent-chat-full>summary{cursor:pointer;list-style:none;font-size:0.8rem;font-weight:600;color:#ff5e99;text-align:center;padding:0.25rem 0}.agent-chat-full>summary::-webkit-details-marker{display:none}.agent-chat-full>summary::after{content:\"Show full response ↓\"}.agent-chat-full[open]>summary::after{content:\"Show less ↑\"}.agent-chat-chart{margin:1rem 0;padding:1rem;border-radius:0.75rem;background-color:#F7F7F7}.agent-chat-chart-caption{margin-bottom:0.75rem}.agent-chat-chart-title{font-weight:600;font-size:0.9rem}.agent-chat-chart-unit{font-size:0.75rem;color:#8A8A8A}.agent-chat-chart-row{display:grid;grid-template-columns:9.5rem minmax(0, 1fr) 4.5rem;align-items:center;gap:0.75rem;font-size:0.8rem;margin:0.3rem 0}.agent-chat-chart-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-chat-chart-track{height:0.9rem}.agent-chat-chart-bar{display:block;height:100%;border-radius:0 4px 4px 0;background-color:#ff5e99}.agent-chat-chart-value{text-align:right;font-variant-numeric:tabular-nums}html.dark .agent-chat-chart{background-color:#222222}@media (max-width: 640px){.agent-chat-chart-row{grid-template-columns:7rem minmax(0, 1fr) 4rem;gap:0.5rem}}.agent-chat-user-bubble [data-as=\"p\"],.agent-chat-body [data-as=\"p\"]{display:block;margin:0.6rem 0}.agent-chat-user-bubble [data-as=\"p\"]:first-child{margin-top:0}.agent-chat-user-bubble [data-as=\"p\"]:last-child{margin-bottom:0}.agent-chat-conversation .agent-chat-user,.agent-chat-conversation .agent-chat-agent{margin:0.5rem 0}.agent-chat-user-bubble,.agent-chat-agent,.agent-chat-attachment{transition:box-shadow 0.25s ease}.agent-chat-turn.is-current .agent-chat-user-bubble,.agent-chat-turn.is-current .agent-chat-agent,.agent-chat-turn.is-current .agent-chat-attachment{box-shadow:0 0 0 2px #ff5e99}.agent-chat-connector{position:fixed;inset:0;z-index:20;pointer-events:none;overflow:visible}.agent-chat-connector path{fill:none;stroke:#ff5e99;stroke-width:2;stroke-linejoin:round}.agent-chat-body table{font-size:0.8125rem}.agent-chat-body table th,.agent-chat-body table td{min-width:0;white-space:normal}.agent-chat-tools a{border-bottom:none}.agent-chat-conversation>.agent-chat-agent{grid-column:1;min-width:0;margin:0.5rem 0 1.5rem}.agent-chat-part{margin:0 -0.75rem;padding:0.25rem 0.75rem;border-radius:0.6rem;transition:box-shadow 0.25s ease}.agent-chat-turn.agent-chat-part.is-current{box-shadow:0 0 0 2px #ff5e99}.agent-chat-attachment-row{display:flex;justify-content:flex-end;margin:0.5rem 0 0.3rem}.agent-chat-conversation>.agent-chat-turn:has(>.agent-chat-attachment-row){margin-bottom:0}.agent-chat-attachment{display:inline-flex;align-items:center;gap:0.5rem;padding:0.5rem 0.75rem;border:1px solid #E5E5E5;border-radius:0.75rem;background:none;font-size:0.8125rem;cursor:zoom-in}.agent-chat-attachment:hover{border-color:#ff5e99}.agent-chat-attachment-kind{font-size:0.65rem;font-weight:600;padding:0.1rem 0.35rem;border-radius:0.3rem;background-color:#F0F0F0;color:#6B6B6B}.agent-chat-document{position:fixed;inset:0;margin:auto;height:fit-content;width:min(52rem, calc(100vw - 2rem));max-height:calc(100vh - 4rem);padding:0;border:1px solid #E5E5E5;border-radius:0.75rem;overflow:auto;background-color:#F7F7F7}.agent-chat-document::backdrop{background-color:rgb(0 0 0 / 0.4)}.agent-chat-document-header{position:sticky;top:0;display:flex;justify-content:space-between;align-items:center;padding:0.6rem 1rem;border-bottom:1px solid #E5E5E5;background-color:#FFFFFF;font-size:0.875rem;font-weight:600}.agent-chat-document-header button{background:none;border:none;cursor:pointer;font-size:1rem;color:#6B6B6B}.agent-chat-document-pages{display:flex;flex-direction:column;gap:1rem;padding:1rem}.agent-chat-document-pages img{width:100%;margin:0;border-radius:0.25rem;box-shadow:0 1px 4px rgb(0 0 0 / 0.15)}html.dark .agent-chat-attachment,html.dark .agent-chat-document,html.dark .agent-chat-document-header{border-color:#333333}html.dark .agent-chat-document{background-color:#1A1A1A}html.dark .agent-chat-document-header{background-color:#222222}html.dark .agent-chat-attachment-kind{background-color:#2A2A2A;color:#AAAAAA}.agent-chat-doc-link{display:block;margin-top:0.4rem;padding:0;border:none;background:none;font-size:0.8125rem;font-weight:600;color:#ff5e99;cursor:pointer}.agent-chat-doc-link:hover{text-decoration:underline}.agent-chat-document-annotated .agent-chat-document-header{background-color:#FFF0F5;border-bottom-color:#FFD1E1;color:#B3245B}.agent-chat-document-annotated .agent-chat-document-pages img{box-shadow:none;border:1px solid #E5E5E5}html.dark .agent-chat-document-annotated .agent-chat-document-header{background-color:#3A1A27;border-bottom-color:#5A2A3D;color:#FF9EC1}.agent-chat-document-annotated .agent-chat-document-pages{gap:0;margin:1rem;padding:1rem;border:1px solid #E5E5E5;border-radius:0.25rem;background-color:#FFFFFF}.agent-chat-document-annotated .agent-chat-document-pages img{border:none;border-radius:0}.agent-chat-document-annotated .agent-chat-document-pages img+img{margin-top:0.75rem;padding-top:0.75rem;border-top:1px dashed #D0D0D0}.agent-chat-attachment-output{justify-content:flex-start;margin:1rem 0 0.5rem}.agent-chat-document-wide{width:min(90rem, calc(100vw - 4rem))}.agent-chat-attachment-label{display:inline-flex;align-items:center;gap:0.5rem;min-width:0}.agent-chat-attachment-card{flex-direction:column;align-items:stretch;gap:0.5rem;width:33%;min-width:14rem;padding:0.5rem 0.5rem 0.6rem}.agent-chat-attachment-card .agent-chat-attachment-thumb{display:block;width:100%;margin:0;border:1px solid #EDEDED;border-radius:0.4rem}.agent-chat-attachment-card .agent-chat-attachment-label{padding:0 0.25rem}.agent-chat-attachment-card .agent-chat-attachment-name{text-align:left}.agent-chat-attachment-card .agent-chat-attachment-kind{margin-left:auto}html.dark .agent-chat-attachment-card .agent-chat-attachment-thumb{border-color:#333333}.agent-chat-document-wide .agent-chat-document-pages img{width:auto;max-width:100%;max-height:calc(100vh - 10rem);margin:0 auto}.agent-chat-card-tags{display:flex;flex-wrap:wrap;gap:0.35rem;margin-top:0.6rem}.agent-chat-card-tags>span{padding:0.1rem 0.45rem;border-radius:0.3rem;background-color:#FFF0F5;color:#B3245B;font-size:0.7rem;font-weight:600}html.dark .agent-chat-card-tags>span{background-color:#3A1A27;color:#FF9EC1}a.agent-chat-note-title{display:block;color:inherit;text-decoration:none;border-bottom:none;cursor:pointer}a.agent-chat-note-title:hover{color:#ff5e99}.agent-chat-turn{scroll-margin-top:9rem}.agent-chat-floating{position:fixed;z-index:30;box-sizing:border-box;padding:0.75rem 1rem;border:1px solid #E5E5E5;border-left:3px solid #ff5e99;border-radius:0.6rem;background-color:#FFFFFF;box-shadow:0 6px 20px rgb(0 0 0 / 0.08);font-size:0.8125rem;line-height:1.45;opacity:0;visibility:hidden;transition:opacity 0.2s ease, visibility 0.2s}.agent-chat-floating.is-visible{opacity:1;visibility:visible}.agent-chat-floating-title{font-weight:600;margin-bottom:0.25rem}.agent-chat-floating-body code{font-size:0.75rem}.agent-chat-floating .agent-chat-doc-link{margin-top:0.3rem}html.dark .agent-chat-floating{background-color:#1A1A1A;border-color:#333333;border-left-color:#ff5e99}@media (min-width: 1280px){.agent-chat-floating{display:none}}.agent-chat-body table code{white-space:nowrap}"}],"page":{"pagePath":"guides/connectivity/events/tracking-video-ad-impressions","slug":"/guides/connectivity/events/tracking-video-ad-impressions","pageMetadata":{"title":"Tracking Video Ad Impressions","description":"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.","href":"/guides/connectivity/events/tracking-video-ad-impressions"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Heading,Info,Note,Step,Steps,Tab,Table,Tabs,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`Recording which ads a user actually saw lets you build audiences from ad exposure rather than content consumption alone. Typical use cases:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Retargeting`}),` — build a cohort of everyone who saw a particular campaign, and target them with a follow-up.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Suppression`}),` — stop serving a campaign to users who have already seen it enough times.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Sequential messaging`}),` — serve creative B only to users who have already seen creative A.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Measurement`}),` — attribute on-site actions back to prior ad exposure.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`All of these depend on capturing an identifier that reliably tells you `,_jsx(_components.em,{children:`which`}),` ad was shown. That turns out to be the hard part, and it is what most of this guide is about.`]}),`\n`,_jsxs(Info,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Before you start`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A custom event schema for your video ad event must exist in your workspace. See `,_jsx(_components.a,{href:`/guides/connectivity/events/create-update-event-schema`,children:`Creating \u0026 Updating Event Schema`}),`, and the `,_jsx(_components.a,{href:`/sdks/ctv/video-tracking#ad-event-properties`,children:`canonical video ad event schema`}),` for the standard `,_jsx(_components.code,{children:`VideoAdView`}),` properties.`]}),`\n`,_jsx(_components.li,{children:`You need access to your video player’s ad integration code, so you can read ad metadata at impression time.`}),`\n`,_jsxs(_components.li,{children:[`Confirm how your ad server hosts video creatives (see `,_jsx(_components.a,{href:`#which-identifier-should-you-use`,children:`Which identifier should you use`}),`) — this determines which identifiers are available to you.`]}),`\n`]})]}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Scope.`}),` This guide covers `,_jsx(_components.strong,{children:`client-side video`}),`, where the `,_jsx(_components.a,{href:`https://developers.google.com/interactive-media-ads`,children:`Google IMA SDK`}),` requests and renders the ad in the user’s browser or app.`]}),_jsx(_components.p,{children:`It does not cover display advertising, which uses different mechanisms, or server-side ad insertion (SSAI/DAI), where the ad is stitched into the video stream before it reaches the player and different metadata is available.`}),_jsxs(_components.p,{children:[`Examples throughout use `,_jsx(_components.strong,{children:`Google Ad Manager`}),`, since it is the most common setup, but the underlying behaviour applies to any ad server serving VAST through the IMA SDK.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`how-video-ad-tracking-works`,children:`How Video Ad Tracking Works`}),`\n`,_jsx(_components.p,{children:`When a video ad plays, four things happen in sequence:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`The player requests an ad`,children:_jsx(_components.p,{children:`Your player asks the ad server for an ad to fill the break.`})}),_jsx(Step,{title:`The ad server responds with VAST`,children:_jsxs(_components.p,{children:[`VAST (Video Ad Serving Template) is an XML document describing the ad. It comes in two forms. An `,_jsx(_components.strong,{children:`inline`}),` response contains the ad itself, including the video file. A `,_jsx(_components.strong,{children:`wrapper`}),` response contains no video file, only a pointer to another ad server that will supply one.`]})}),_jsx(Step,{title:`The SDK follows the chain`,children:_jsx(_components.p,{children:`If the response is a wrapper, the IMA SDK requests the next URL, and repeats until it reaches an inline response. A single ad can involve several hops. Each hop is a separate ad server with its own identifiers for the same ad.`})}),_jsx(Step,{title:`You read the metadata and record an event`,children:_jsxs(_components.p,{children:[`The SDK exposes the assembled ad metadata through the `,_jsx(_components.a,{href:`https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.Ad`,children:_jsx(_components.code,{children:`google.ima.Ad`})}),` object. You read the identifiers you need and send them to Permutive as a custom event.`]})})]}),`\n`,_jsxs(_components.p,{children:[`The wrapper chain in step three is where most tracking problems originate. `,_jsx(_components.strong,{children:`Every hop has its own creative ID, and they are unrelated numbers.`}),` The identifier you get back depends on which hop the SDK reads from.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-identifiers-available-to-you`,children:`The Identifiers Available to You`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`google.ima.Ad`}),` object exposes these methods at impression time:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Returns`}),_jsx(_components.th,{children:`Which hop`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getAdId()`})}),_jsx(_components.td,{children:`The ad’s ID`}),_jsx(_components.td,{children:`Innermost (inline) ad`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getCreativeId()`})}),_jsx(_components.td,{children:`The creative’s ID`}),_jsx(_components.td,{children:`Innermost (inline) ad`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getAdSystem()`})}),_jsx(_components.td,{children:`The name of the ad server that served the inline ad`}),_jsx(_components.td,{children:`Innermost (inline) ad`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getDealId()`})}),_jsx(_components.td,{children:`The deal / programmatic agreement ID`}),_jsx(_components.td,{children:`The deal, where one applies`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getWrapperAdIds()`})}),_jsx(_components.td,{children:`Array of ad IDs, one per wrapper`}),_jsx(_components.td,{children:`Every wrapper in the chain`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getWrapperCreativeIds()`})}),_jsx(_components.td,{children:`Array of creative IDs, one per wrapper`}),_jsx(_components.td,{children:`Every wrapper in the chain`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getWrapperAdSystems()`})}),_jsx(_components.td,{children:`Array of ad server names, one per wrapper`}),_jsx(_components.td,{children:`Every wrapper in the chain`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getUniversalAdIds()`})}),_jsx(_components.td,{children:`Registry-issued creative identifiers, where the advertiser set them`}),_jsx(_components.td,{children:`Innermost (inline) ad`})]})]})]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`getCreativeId()`}),` always reads the innermost ad, not your ad server.`]})}),_jsxs(_components.p,{children:[`If your ad server hosts the video file, the innermost ad `,_jsx(_components.em,{children:`is`}),` your ad server’s, and `,_jsx(_components.code,{children:`getCreativeId()`}),` returns the ID you see in your own UI.`]}),_jsxs(_components.p,{children:[`If your ad server redirects to someone else’s, the innermost ad belongs to that other system, and `,_jsx(_components.code,{children:`getCreativeId()`}),` returns `,_jsx(_components.strong,{children:`their`}),` creative ID. It will look like a perfectly valid ID. It will simply not correspond to anything in your ad server.`]})]}),`\n`,_jsxs(_components.p,{children:[`The wrapper arrays are ordered `,_jsx(_components.strong,{children:`innermost first, outermost last`}),`. Since your own ad server initiates the chain, it is the outermost wrapper, so its entry is the last element.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Always capture `,_jsx(_components.code,{children:`getAdSystem()`}),` alongside any creative ID. It tells you whose numbering scheme the ID belongs to, which is the difference between an ID you can use and one you cannot. Google Ad Manager reports as `,_jsx(_components.code,{children:`GDFP`}),`; Display \u0026 Video 360 reports as `,_jsx(_components.code,{children:`DBM`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`which-identifier-should-you-use`,children:`Which Identifier Should You Use`}),`\n`,_jsx(_components.p,{children:`Find the row that matches how the creative is hosted.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`How the creative is served`}),_jsx(_components.th,{children:`In Google Ad Manager, creative Type is`}),_jsx(_components.th,{children:`Use`}),_jsx(_components.th,{children:`Granularity`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Your ad server hosts the video file`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Video`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`getCreativeId()`})}),_jsx(_components.td,{children:`Per creative`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Third-party creative, wrapper chain reaches the player`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Redirect`}),` or `,_jsx(_components.strong,{children:`Programmatic`})]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`#reading-the-id-from-the-wrapper-chain`,children:`Wrapper chain lookup`})}),_jsx(_components.td,{children:`Per creative`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Third-party creative, wrapper chain flattened server-side`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Redirect`}),` or `,_jsx(_components.strong,{children:`Programmatic`})]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`#falling-back-to-deal-id`,children:`Deal ID`})}),_jsx(_components.td,{children:`Per line item`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`In Google Ad Manager you can check this under `,_jsx(_components.strong,{children:`Delivery → Creatives`}),`, in the `,_jsx(_components.strong,{children:`Type`}),` column. The distinction is simply whether the ad server holds the video file itself or holds a pointer to it.`]}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[`Direct-sold campaigns are usually trafficked as `,_jsx(_components.strong,{children:`Video`}),`, because the publisher receives the asset and uploads it. Programmatic Guaranteed and other deal-based buys are usually `,_jsx(_components.strong,{children:`Redirect`}),` or `,_jsx(_components.strong,{children:`Programmatic`}),`, because the buyer serves the creative from their own ad server.`]}),_jsx(_components.p,{children:`This is why creative-level video retargeting often works perfectly for direct-sold inventory and returns nothing for programmatic inventory on the same site.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`reading-the-id-from-the-wrapper-chain`,children:`Reading the ID From the Wrapper Chain`}),`\n`,_jsxs(_components.p,{children:[`When the chain reaches the player, your ad server’s creative ID is in `,_jsx(_components.code,{children:`getWrapperCreativeIds()`}),`. Rather than assuming a fixed position, find your ad server by name in `,_jsx(_components.code,{children:`getWrapperAdSystems()`}),` and read the same index.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`22`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`22`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`/**`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` * Resolve the creative ID belonging to a specific ad server.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` * `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`@param`}),_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:` {google.ima.Ad}`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` * `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`@param`}),_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:` {string}`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` adServerName`}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` - e.g. 'GDFP' for Google Ad Manager`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` * `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`@returns`}),_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:` {string|null}`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` */`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` resolveCreativeId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`adServerName`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` // The ad server appears as a wrapper in the chain`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:` systems`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getWrapperAdSystems`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:` index`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`systems`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`indexOf`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`adServerName`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`index`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` !== -`}),_jsx(_components.span,{style:{color:`#B5CEA8`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getWrapperCreativeIds`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`()[`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`index`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` // No wrapper: the inline ad is the ad server's own creative`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAdSystem`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`() === `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`adServerName`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getCreativeId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` // Third-party creative with no recoverable ad server creative ID`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` null`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`This handles all three cases in the table above, and returns `,_jsx(_components.code,{children:`null`}),` precisely when no usable ID exists, which is the signal to fall back to deal ID.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Google documents the wrapper arrays as containing the full chain with the initiating ad server as the final element. Permutive has not independently verified this behaviour across ad servers, so treat the wrapper path as Google’s stated behaviour and confirm it against your own inventory before relying on it in production. The `,_jsx(_components.a,{href:`#verifying-your-implementation`,children:`verification steps`}),` below show how.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`when-the-wrapper-chain-is-not-available`,children:`When the Wrapper Chain Is Not Available`}),`\n`,_jsxs(_components.p,{children:[`Some ad servers can resolve the VAST chain on their own servers before responding to the player, returning a single flattened inline ad rather than a chain. In Google Ad Manager this is called `,_jsx(_components.strong,{children:`Server-Side Unwrapping (SSU)`}),`. It reduces the number of round trips the player makes, which improves latency and reduces drop-off.`]}),`\n`,_jsx(_components.p,{children:`The trade-off is that the wrapper chain no longer exists by the time the SDK sees the response.`}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`When server-side unwrapping is enabled, all three wrapper arrays return empty arrays.`})}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`getWrapperAdIds()`}),`, `,_jsx(_components.code,{children:`getWrapperCreativeIds()`}),` and `,_jsx(_components.code,{children:`getWrapperAdSystems()`}),` return `,_jsx(_components.code,{children:`[]`}),`. They do not throw and they do not warn. The only ad metadata that reaches the player is the innermost creative, which for third-party creatives belongs to the buyer.`]}),_jsx(_components.p,{children:`In this configuration your ad server’s creative ID cannot be recovered client-side by any means. No SDK change will surface it.`})]}),`\n`,_jsx(_components.p,{children:`This is easy to misread, because the symptoms look like a coding error rather than a configuration outcome:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The methods exist and return cleanly.`}),`\n`,_jsx(_components.li,{children:`The creative IDs look entirely normal in your ad server’s UI.`}),`\n`,_jsx(_components.li,{children:`Events arrive in Permutive with populated, valid-looking creative IDs.`}),`\n`,_jsx(_components.li,{children:`Cohorts built against those IDs simply never match anyone.`}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`If `,_jsx(_components.code,{children:`getWrapperAdSystems()`}),` returns an empty array while `,_jsx(_components.code,{children:`getAdSystem()`}),` returns an ad server that is `,_jsx(_components.strong,{children:`not`}),` yours, server-side unwrapping is the most likely explanation. Confirm with your ad server account team whether it is enabled for your network.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`falling-back-to-deal-id`,children:`Falling Back to Deal ID`}),`\n`,_jsxs(_components.p,{children:[`Where the creative ID cannot be recovered, `,_jsx(_components.code,{children:`getDealId()`}),` is populated for programmatic deals and offers a workable alternative.`]}),`\n`,_jsxs(_components.p,{children:[`Deal ID identifies the `,_jsx(_components.strong,{children:`line item`}),`, not the creative. Because a line item can carry several creatives, every creative on that line shares one deal ID, and they cannot be told apart from the deal ID alone.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`If you need per-creative granularity with deal ID, each creative must sit on its own line item.`}),` This is an operational change in your ad server rather than a code change, and it is worth confirming your trafficking team is willing to work that way before committing to the approach.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`implementation`,children:`Implementation`}),`\n`,_jsxs(_components.p,{children:[`Capture the identifiers on the ad’s `,_jsx(_components.code,{children:`STARTED`}),` event and send them as a custom event.`]}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Capturing everything`,id:`capturing-everything`,children:[_jsx(_components.p,{children:`Recording all the identifiers, including the ones you do not immediately need, makes future diagnosis much easier and costs very little.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`21`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`21`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`adsManager`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`addEventListener`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` google`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ima`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`AdEvent`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`Type`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:`STARTED`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAd`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` permutive`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`track`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'VideoAdView'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad:`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` // Canonical schema properties`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` title:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getTitle`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` duration:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getDuration`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` creative_id:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getCreativeId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:` // Additional properties for diagnosing identifier issues`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad_system:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAdSystem`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` deal_id:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getDealId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` wrapper_creative_ids:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getWrapperCreativeIds`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` wrapper_ad_systems:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getWrapperAdSystems`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`]})})}),_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`title`}),`, `,_jsx(_components.code,{children:`duration`}),` and `,_jsx(_components.code,{children:`creative_id`}),` are part of the `,_jsx(_components.a,{href:`/sdks/ctv/video-tracking#ad-event-properties`,children:`canonical ad event schema`}),`. The remaining properties are additions you would need to define in your own event schema first.`]})})]}),_jsxs(Tab,{title:`Resolving to one ID`,id:`resolving-to-one-id`,children:[_jsxs(_components.p,{children:[`If you would rather store a single resolved identifier, use the helper from `,_jsx(_components.a,{href:`#reading-the-id-from-the-wrapper-chain`,children:`Reading the ID From the Wrapper Chain`}),` and record the fallback alongside it.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`adsManager`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`addEventListener`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` google`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ima`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`AdEvent`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`Type`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:`STARTED`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAd`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` permutive`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`track`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'VideoAdView'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad:`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` title:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getTitle`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` duration:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getDuration`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` creative_id:`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` resolveCreativeId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'GDFP'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// null when unavailable`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` deal_id:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getDealId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(), `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// fallback for programmatic`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad_system:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAdSystem`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// always worth keeping`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`]})})}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`Keep `,_jsx(_components.code,{children:`deal_id`}),` even when `,_jsx(_components.code,{children:`creative_id`}),` resolves. It costs nothing, and it means you are not re-instrumenting your player if your creative hosting changes later.`]})})]})]}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`VideoAdView`}),` and its `,_jsx(_components.code,{children:`ad.*`}),` properties follow Permutive’s `,_jsx(_components.a,{href:`/sdks/ctv/video-tracking#ad-event-properties`,children:`canonical video ad event schema`}),`. Use these names where you can, so cohorts and reporting behave consistently across platforms.`]}),_jsx(_components.p,{children:`If you add properties beyond the canonical set, define them in your workspace’s event schema first, and avoid reusing an existing property for a new identifier — cohorts built before and after the change would silently target different things.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`verifying-your-implementation`,children:`Verifying Your Implementation`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Log the full ad metadata on a live impression`,children:[_jsx(_components.p,{children:`Play an ad from the inventory you care about, and log every identifier rather than inspecting them in a debugger. Collapsed arrays in dev tools can be hard to distinguish from empty ones.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:` ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAd`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'Ad system:'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getAdSystem`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'Creative ID:'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getCreativeId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'Deal ID:'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getDealId`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'Wrapper systems:'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:`JSON`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`stringify`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getWrapperAdSystems`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`()));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'Wrapper creatives:'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:`JSON`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`stringify`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`ad`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`getWrapperCreativeIds`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`()));`})]}),`\n`]})})})]}),_jsx(Step,{title:`Check the ad system`,children:_jsxs(_components.p,{children:[`If `,_jsx(_components.code,{children:`getAdSystem()`}),` returns your ad server, the inline creative is yours and `,_jsx(_components.code,{children:`getCreativeId()`}),` is directly usable. If it returns something else, the creative is third-party and you need the wrapper chain or deal ID.`]})}),_jsx(Step,{title:`Check whether the wrapper chain survived`,children:_jsxs(_components.p,{children:[`A populated `,_jsx(_components.code,{children:`getWrapperAdSystems()`}),` means the chain reached the player and the wrapper lookup will work. An empty array means it did not, and deal ID is your route.`]})}),_jsx(Step,{title:`Cross-check the ID against your ad server`,children:_jsx(_components.p,{children:`Take the creative ID your event recorded and search for it in your ad server. If it does not exist there, you are capturing a third-party identifier. This single check settles the question faster than any other.`})}),_jsx(Step,{title:`Confirm the event lands in Permutive`,children:_jsxs(_components.p,{children:[`In the `,_jsx(_components.strong,{children:`Events`}),` section of your dashboard, look for your event name and confirm the properties are populated as expected.`]})}),_jsx(Step,{title:`Test both direct-sold and programmatic inventory`,children:_jsx(_components.p,{children:`These behave differently. An implementation verified only against direct-sold campaigns can still return unusable identifiers on programmatic inventory.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`common-failure-modes`,children:`Common Failure Modes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Likely cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cohort returns zero users despite the campaign delivering`}),_jsx(_components.td,{children:`Creative IDs being captured belong to a third-party ad server. Cross-check one against your ad server.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Retargeting works for direct-sold, returns nothing for programmatic`}),_jsx(_components.td,{children:`Expected where programmatic creatives are third-party hosted. Check the creative Type.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`All wrapper arrays return `,_jsx(_components.code,{children:`[]`})]}),_jsxs(_components.td,{children:[`Server-side unwrapping is enabled, or the ad genuinely has no wrapper chain. Check `,_jsx(_components.code,{children:`getAdSystem()`}),` to tell the two apart.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`getCreativeId()`}),` returns a valid-looking ID that matches nothing`]}),_jsxs(_components.td,{children:[`It is the buyer’s creative ID, not your ad server’s. Confirm with `,_jsx(_components.code,{children:`getAdSystem()`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`getDealId()`}),` returns `,_jsx(_components.code,{children:`null`})]}),_jsx(_components.td,{children:`The impression did not come from a deal. Direct-sold and open-auction inventory have no deal ID.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cohort targets the wrong creatives after a change`}),_jsx(_components.td,{children:`An existing property was reused for a new identifier. Cohorts built before the change still reference the old meaning.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No events at all`}),_jsxs(_components.td,{children:[`Event schema not created; listener attached to the wrong event; ad errored before `,_jsx(_components.code,{children:`STARTED`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Why does my ad server show one creative ID and Permutive record a different one?`,id:`why-does-my-ad-server-show-one-creative-id-and-permutive-record-a-different-one`,children:[_jsxs(_components.p,{children:[`They are identifiers from two different systems that happen to describe the same video. Your ad server’s creative ID is a record in your account. The buyer’s creative ID is a record in theirs. When the creative is served through a redirect, `,_jsx(_components.code,{children:`getCreativeId()`}),` reads the buyer’s.`]}),_jsxs(_components.p,{children:[`Capturing `,_jsx(_components.code,{children:`getAdSystem()`}),` alongside the ID tells you immediately which one you are holding.`]})]}),_jsxs(Accordion,{title:`Can I turn off server-side unwrapping to recover creative IDs?`,id:`can-i-turn-off-server-side-unwrapping-to-recover-creative-ids`,children:[_jsx(_components.p,{children:`In principle yes, and it would restore the wrapper chain. In practice it is a meaningful trade-off: server-side unwrapping exists to reduce round trips and improve latency and fill.`}),_jsx(_components.p,{children:`Weigh it against the alternative of splitting creatives onto separate line items and using deal ID, which achieves the same granularity without changing how ads are delivered. Discuss the options with your ad server account team.`})]}),_jsx(Accordion,{title:`Does this affect display advertising too?`,id:`does-this-affect-display-advertising-too`,children:_jsx(_components.p,{children:`No. Display uses a different delivery mechanism and different tracking. This guide is specific to video ads rendered by the IMA SDK.`})}),_jsx(Accordion,{title:`What about server-side ad insertion (SSAI/DAI)?`,id:`what-about-server-side-ad-insertion-ssai-dai`,children:_jsxs(_components.p,{children:[`SSAI stitches ads into the video stream before it reaches the player, so the metadata available differs from client-side playback. The identifiers described here may not be present. Contact `,_jsx(_components.a,{href:`mailto:support@permutive.com`,children:`Support`}),` to discuss an SSAI setup.`]})}),_jsx(Accordion,{title:`Should I store the wrapper arrays even if I do not use them?`,id:`should-i-store-the-wrapper-arrays-even-if-i-do-not-use-them`,children:_jsx(_components.p,{children:`It is worth doing. They are small, and they make it possible to answer questions about historical impressions that you would otherwise need a new live test to investigate. They also make it obvious after the fact whether server-side unwrapping was in play.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next Steps`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Creating \u0026 Updating Event Schema`,icon:`table`,href:`/guides/connectivity/events/create-update-event-schema`,children:_jsx(_components.p,{children:`Define the custom event schema your video ad events will validate against.`})}),_jsx(Card,{title:`Tracking Off-Site Events with Pixels`,icon:`crosshairs`,href:`/guides/connectivity/events/tracking-offsite-events`,children:_jsx(_components.p,{children:`Track conversions and impressions that happen away from your own pages.`})}),_jsx(Card,{title:`IMA SDK Ad reference`,icon:`book`,href:`https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.Ad`,children:_jsx(_components.p,{children:`Google’s full reference for the ad metadata methods used in this guide.`})}),_jsx(Card,{title:`Contact Support`,icon:`envelope`,href:`mailto:support@permutive.com`,children:_jsx(_components.p,{children:`Troubleshoot an implementation or confirm the right approach for your setup.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Tracking Video Ad Impressions","description":"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.","href":"/guides/connectivity/events/tracking-video-ad-impressions"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"How Video Ad Tracking Works","slug":"how-video-ad-tracking-works","depth":2,"children":[]},{"title":"The Identifiers Available to You","slug":"the-identifiers-available-to-you","depth":2,"children":[]},{"title":"Which Identifier Should You Use","slug":"which-identifier-should-you-use","depth":2,"children":[]},{"title":"Reading the ID From the Wrapper Chain","slug":"reading-the-id-from-the-wrapper-chain","depth":2,"children":[]},{"title":"When the Wrapper Chain Is Not Available","slug":"when-the-wrapper-chain-is-not-available","depth":2,"children":[]},{"title":"Falling Back to Deal ID","slug":"falling-back-to-deal-id","depth":2,"children":[]},{"title":"Implementation","slug":"implementation","depth":2,"children":[]},{"title":"Verifying Your Implementation","slug":"verifying-your-implementation","depth":2,"children":[{"title":"Common Failure Modes","slug":"common-failure-modes","depth":3,"children":[]}]},{"title":"FAQ","slug":"faq","depth":2,"children":[]},{"title":"Next Steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/permutive/9a9f86ed1fb0eb1f/agent-chat-rail.js"],"subdomain":"permutive","siteName":"Permutive","title":"Tracking Video Ad Impressions - Permutive","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-09T17:57:35.960Z","originalFileLocation":"guides/connectivity/events/tracking-video-ad-impressions.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Permutive\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Tracking Video Ad Impressions - Permutive\">\u003cmeta data-mint-head property=\"og:description\" content=\"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Permutive\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://permutive.mintlify.site/_mintlify/api/og/v2?division=Events\u0026amp;title=Tracking+Video+Ad+Impressions\u0026amp;description=Capture+video+ad+impressions+from+your+player+as+Permutive+events%2C+and+understand+which+ad+identifiers+you+can+rely+on.\u0026amp;theme=ef3c96350872d4aa4f708194\u0026amp;signature=ef6185380e641cdc07e9f766422d49de57f884209013ffaf98180b492a4c03f0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Tracking Video Ad Impressions - Permutive\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://permutive.mintlify.site/_mintlify/api/og/v2?division=Events\u0026amp;title=Tracking+Video+Ad+Impressions\u0026amp;description=Capture+video+ad+impressions+from+your+player+as+Permutive+events%2C+and+understand+which+ad+identifiers+you+can+rely+on.\u0026amp;theme=ef3c96350872d4aa4f708194\u0026amp;signature=ef6185380e641cdc07e9f766422d49de57f884209013ffaf98180b492a4c03f0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/permutive/_gGnYYOjUBeWUMY8/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Permutive\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ff5e99\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/connectivity/events/tracking-video-ad-impressions.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.permutive.com/#organization\",\"name\":\"Permutive\",\"url\":\"https://docs.permutive.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/permutive/zX9G7jjpccuZZlEf/logo/permutive-logo-light.svg?fit=max\u0026auto=format\u0026n=zX9G7jjpccuZZlEf\u0026q=85\u0026s=ae940c2b1c2eb923f6344b583fef176c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.permutive.com#website\",\"name\":\"Permutive\",\"url\":\"https://docs.permutive.com\",\"publisher\":{\"@id\":\"https://docs.permutive.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions#webpage\",\"url\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions\",\"name\":\"Tracking Video Ad Impressions\",\"description\":\"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.\",\"dateModified\":\"2026-11-09T17:57:35.960Z\",\"isPartOf\":{\"@id\":\"https://docs.permutive.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://docs.permutive.com/guides/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connectivity\",\"item\":\"https://docs.permutive.com/guides/connectivity/events/create-update-event-schema\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Events\",\"item\":\"https://docs.permutive.com/guides/connectivity/events/create-update-event-schema\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Tracking Video Ad Impressions\",\"item\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions#article\",\"headline\":\"Tracking Video Ad Impressions\",\"name\":\"Tracking Video Ad Impressions\",\"description\":\"Capture video ad impressions from your player as Permutive events, and understand which ad identifiers you can rely on.\",\"url\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions\",\"mainEntityOfPage\":{\"@id\":\"https://docs.permutive.com/guides/connectivity/events/tracking-video-ad-impressions#webpage\"},\"dateModified\":\"2026-11-09T17:57:35.960Z\",\"publisher\":{\"@id\":\"https://docs.permutive.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.permutive.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Permutive\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Permutive","nav":{"global":{"anchors":[{"anchor":"Support","icon":"life-ring","href":"mailto:technical-services@permutive.com"},{"anchor":"Status","icon":"signal","href":"https://status.permutive.com"},{"anchor":"Changelog","icon":"megaphone","href":"https://changelog.permutive.com"}]},"tabs":[{"tab":"Platform","pages":[{"title":"Platform","href":"/introduction"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations/overview"}]},{"tab":"Guides","groups":[{"group":"Guides","pages":[{"title":"Guides","href":"/guides/introduction"},{"group":"Connectivity","icon":"plug","pages":[{"group":"Events","pages":[{"title":"Creating \u0026 Updating Event Schema","href":"/guides/connectivity/events/create-update-event-schema"},{"title":"Tracking Off-Site Events with Pixels","description":"Capture conversions, email opens, and ad impressions that happen outside your site, and attribute them to your Permutive users.","href":"/guides/connectivity/events/tracking-offsite-events"},{"title":"Tracking Video Ad Impressions","href":"/guides/connectivity/events/tracking-video-ad-impressions"}]},{"group":"Connections","pages":[{"title":"Connecting to BigQuery","description":"How to set up a connection to Google BigQuery to import data into Permutive","href":"/guides/connectivity/connections/connecting-to-bigquery"},{"title":"Connecting to Snowflake","href":"/guides/connectivity/connections/connecting-to-snowflake"},{"title":"Connecting to Amazon S3","href":"/guides/connectivity/connections/connecting-to-amazon-s3"},{"title":"Connecting to Google Cloud Storage","href":"/guides/connectivity/connections/connecting-to-gcs"}]},{"group":"Imports","pages":[{"group":"Data Warehouse and Lake Imports","pages":[{"title":"Creating an Import","href":"/guides/connectivity/imports/creating-an-import"},{"title":"Importing User Segments (previously Audience Imports)","href":"/guides/connectivity/imports/importing-user-segments"},{"title":"Actioning Updates to Your Source Schema","href":"/guides/connectivity/imports/actioning-updates-to-your-source-schema"}]},{"group":"Second-Party Data","pages":[{"title":"Second-Party Data with Permutive","href":"/guides/connectivity/imports/second-party-data-overview"},{"title":"Configuring Taxonomy","href":"/guides/connectivity/imports/configuring-taxonomy"},{"title":"Ingesting Second-Party Data via LiveRamp","href":"/guides/connectivity/imports/ingesting-data-via-liveramp"},{"title":"Adding Audiences in LiveRamp","href":"/guides/connectivity/imports/adding-audiences-in-liveramp"}]}]},{"group":"Routing","pages":[{"title":"Setting Up Google BigQuery Routing","href":"/guides/connectivity/routing/setting-up-bigquery-routing"},{"title":"Setting Up Snowflake Routing","href":"/guides/connectivity/routing/setting-up-snowflake-routing"},{"title":"Setting Up AWS S3 Streaming Routing","href":"/guides/connectivity/routing/setting-up-s3-streaming-routing"},{"title":"Setting Up AWS S3 Batch Routing","href":"/guides/connectivity/routing/setting-up-s3-batch-routing"}]}]},{"group":"Signals","icon":"wave-pulse","pages":[{"group":"Cohorts","pages":[{"group":"Custom","pages":[{"title":"Creating Custom Cohorts","href":"/guides/signals/cohorts/custom/creating-custom-cohorts"},{"title":"Editing Custom Cohorts","href":"/guides/signals/cohorts/custom/editing-custom-cohorts"},{"title":"Deleting Custom Cohorts","href":"/guides/signals/cohorts/custom/deleting-custom-cohorts"},{"title":"Exporting Custom Cohorts","href":"/guides/signals/cohorts/custom/exporting-custom-cohorts"},{"title":"Targeting Users by ISP","href":"/guides/signals/cohorts/custom/targeting-users-by-isp"},{"title":"Using Audience Imports in Cohorts","href":"/guides/signals/cohorts/custom/using-audience-imports"},{"title":"Creating User Group Cohorts","href":"/guides/signals/cohorts/custom/creating-user-group-cohorts"},{"title":"Bulk Activating Cohorts","href":"/guides/signals/cohorts/custom/bulk-activating-cohorts"}]},{"group":"Contextual","pages":[{"title":"Creating Contextual Cohorts","href":"/guides/signals/cohorts/contextual/creating-contextual-cohorts"},{"title":"Enabling Classification Providers","href":"/guides/signals/cohorts/contextual/enabling-classification-providers"},{"title":"Previewing Classifications","href":"/guides/signals/cohorts/contextual/previewing-classifications"},{"title":"Using XPath Selectors","href":"/guides/signals/cohorts/contextual/using-xpath-selectors"},{"title":"Using Keyword Explorer","href":"/guides/signals/cohorts/contextual/using-keyword-explorer"},{"title":"Activating Contextual Cohorts in Google Ad Manager","href":"/guides/signals/cohorts/contextual/deploying-to-google-ad-manager"},{"title":"Custom Classifications via Webhook","href":"/guides/signals/cohorts/contextual/custom-classifications-via-webhook"}]},{"group":"Lookalike","pages":[{"title":"Creating a Lookalike Model","href":"/guides/signals/cohorts/modeled-lookalike/creating-lookalike-model"},{"title":"Creating Lookalike Cohorts","href":"/guides/signals/cohorts/modeled-lookalike/creating-lookalike-cohorts"},{"title":"Editing a Seed Segment","href":"/guides/signals/cohorts/modeled-lookalike/editing-lookalike-seed"},{"title":"Deleting a Model","href":"/guides/signals/cohorts/modeled-lookalike/deleting-lookalike-model"},{"title":"Using Include/Exclude Segments","href":"/guides/signals/cohorts/modeled-lookalike/lookalike-advanced-filtering"},{"title":"Validating Model Weights","href":"/guides/signals/cohorts/modeled-lookalike/validating-model-weights"}]},{"group":"Classification","pages":[{"title":"Creating Classification Models","href":"/guides/signals/cohorts/modeled/creating-classification-models"},{"title":"Creating Classification Cohorts","href":"/guides/signals/cohorts/modeled/creating-classification-cohorts"},{"title":"Viewing Classification Cohorts","href":"/guides/signals/cohorts/modeled/viewing-classification-cohorts"}]},{"group":"Standard","pages":[{"title":"Configuring Standard Cohorts","href":"/guides/signals/cohorts/standard/configuring-standard-cohorts"}]},{"group":"Standard Contextual","pages":[{"title":"Enabling Standard Contextual Cohorts","href":"/guides/signals/cohorts/standard-contextual/enabling-standard-contextual-cohorts"},{"title":"Activating Standard Contextual Cohorts","href":"/guides/signals/cohorts/standard-contextual/activating-standard-contextual-cohorts"},{"title":"Setting Up Google PPS","href":"/guides/signals/cohorts/standard-contextual/setting-up-google-pps"}]}]},{"group":"Identity","pages":[{"title":"Configuring Identifiers","href":"/guides/signals/identity/configuring-identifiers"},{"title":"Viewing Identifier Details","href":"/guides/signals/identity/viewing-identifier-details"},{"title":"Adding Identities via Identify Endpoint","href":"/guides/signals/identity/adding-identities-via-identify"},{"title":"Importing User Group Memberships","href":"/guides/signals/identity/importing-user-group-memberships"},{"title":"Importing User Identity","href":"/guides/signals/identity/importing-user-identity"},{"title":"Understanding ID Resolution Privacy Considerations","href":"/guides/signals/identity/understanding-id-resolution-privacy"},{"title":"Monitoring Data Ingestion","href":"/guides/signals/identity/monitoring-data-ingestion"},{"title":"Understanding Identity Overlap","href":"/guides/signals/identity/understanding-identity-overlap"},{"title":"Analyzing Domain Overlap","href":"/guides/signals/identity/analyzing-domain-overlap"},{"title":"Accessing Identity Insights","href":"/guides/signals/identity/accessing-identity-insights"}]}]},{"group":"Workflows \u0026 Insights","icon":"chart-line","pages":[{"group":"Planning","pages":[{"title":"Creating a Plan","href":"/guides/planning/creating-a-plan"},{"title":"Building Audiences","href":"/guides/planning/building-audiences"},{"title":"Using Plan Insights","href":"/guides/planning/using-plan-insights"},{"title":"Sharing Plans","href":"/guides/planning/sharing-plans"}]},{"group":"Optimization","pages":[{"title":"GAM API Usage","href":"/guides/platform-guides/gam-api-usage"}]},{"group":"Insights","pages":[{"title":"Pageview Comparisons FAQ","href":"/guides/insights/pageview-comparisons"}]}]},{"group":"Clean Room","icon":"handshake","pages":[{"title":"Setting Up Advertiser Connections","href":"/guides/clean-room/setting-up-advertiser-connections"},{"title":"Creating Clean Room Audiences","href":"/guides/clean-room/creating-clean-room-audiences"},{"title":"Configuring Ad Server Targeting","href":"/guides/clean-room/configuring-ad-server-targeting"},{"title":"Sharing Proposal and Deal Information","href":"/guides/clean-room/sharing-proposal-and-deal-information"},{"title":"Uploading Advertiser Data","href":"/guides/clean-room/uploading-advertiser-data"},{"title":"Configuring Frequency Control","href":"/guides/clean-room/configuring-frequency-control"}]},{"group":"Curation","icon":"wand-magic-sparkles","pages":[{"title":"Configuring Prebid for Curation","href":"/guides/curation/configuring-prebid-for-curation"},{"title":"Configuring Google Curate","href":"/guides/curation/configuring-google-curate"},{"title":"Managing Cohort Exclusions","href":"/guides/curation/managing-cohort-exclusions"}]}]}]},{"tab":"APIs","pages":[{"title":"APIs","href":"/api/introduction"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/api/mcp/introduction"}]}]},"basePath":"","title":"Tracking Video Ad Impressions - Permutive","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":[],"chunks":[]}