{"id":7413,"date":"2026-09-14T12:00:00","date_gmt":"2026-09-14T12:00:00","guid":{"rendered":"https:\/\/www.5centscdn.net\/blog\/?p=7413"},"modified":"2026-09-11T06:39:13","modified_gmt":"2026-09-11T06:39:13","slug":"who-fills-vast-ad-macros","status":"publish","type":"post","link":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/","title":{"rendered":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server"},"content":{"rendered":"<div style=\"margin-top: 0px; margin-bottom: 0px;\" class=\"sharethis-inline-share-buttons\" ><\/div>\n<p class=\"wp-block-paragraph\">Here is a confusion that costs streaming publishers real time and real ad revenue, and almost everyone hits it at least once. An ad isn&#8217;t targeting correctly, or a stream of ad requests is going out with device information missing, and the finger-pointing begins. The publisher assumes their ad-insertion provider generates those values. The ad provider correctly says they don&#8217;t fill them. And somewhere in the middle, the actual answer \u2014 that some of those values were supposed to come from the publisher&#8217;s own app and be passed through ad macros all along \u2014 goes unnoticed while everyone blames the wrong layer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This happens because video ad delivery involves at least three distinct parties, each responsible for a different job, and the boundaries between them are genuinely easy to misread. The core mechanism at the center of the confusion is the ad macro: a placeholder in an ad request URL that gets swapped for a real value at request time. Understanding which party supplies each value, which party substitutes it into the macro, and which party simply receives it is the difference between smooth targeting and a frustrating multi-day support thread that ends with everyone realizing the fix was upstream the whole time. This guide explains how ad macros work, walks through who is responsible for what, and uses a common real-world mix-up to make the boundaries concrete.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-1024x576.jpg\" alt=\"An ad tag with [DEVICEIP] and [DEVICEUA] macros substituted with real values at request time\" class=\"wp-image-7415\" srcset=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-1024x576.jpg 1024w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-300x169.jpg 300w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-768x432.jpg 768w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-1536x864.jpg 1536w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-2048x1152.jpg 2048w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-800x450.jpg 800w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-1200x675.jpg 1200w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-10-600x338.jpg 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><strong>How a macro becomes a real value<\/strong><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What an Ad Macro Actually Is<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start with the mechanism, because the responsibility question only makes sense once the mechanism is clear.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When a video player or streaming platform requests an ad, it calls an ad tag \u2014 a URL that returns a <a href=\"https:\/\/www.5centscdn.net\/blog\/what-is-vast-video-ad-serving-template\/\">VAST<\/a> response describing the ad. But a single static ad tag has to work for millions of different viewers, on different devices, in different places, under different privacy rules. It cannot hard-code the specifics of any one viewer. Instead, the tag is written with placeholders \u2014 macros \u2014 that stand in for values that are only known at the exact moment a real viewer requests a real ad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A macro looks like a token wrapped in square brackets sitting inside the URL, such as [DEVICEIP], [DEVICEUA], or [IFA] (the identifier for advertising). These tokens are standardized so that any compliant party can recognize them. When the ad is requested, whichever party is making that request is expected to replace the entire placeholder, brackets included, with the actual value for that viewer \u2014 the real IP address, the real user-agent string, the real advertising ID. A tag containing ?ip=[DEVICEIP]&amp;ua=[DEVICEUA] becomes ?ip=8.8.8.8&amp;ua=Mozilla%2F5.0&#8230; before it reaches the ad server. That swap is macro substitution, and it is how one static tag turns into a live, per-viewer request carrying the context an ad server needs to choose and measure an ad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The critical thing to notice, and the seed of the whole confusion, is that substitution is only half the story. A macro can only be filled with a value that someone actually knows and provides. If the real value never reaches the party doing the substitution, there is nothing to substitute, and the macro either goes out empty or, worse, goes out as a raw unreplaced placeholder. So the real question is never just &#8220;who fills the macro&#8221; \u2014 it is &#8220;who *knows* the value, and did they pass it to the party that fills the macro?&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>The Three Parties and Their Three Different Jobs<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Video ad delivery in a server-side world involves three roles, and each has a job the others cannot do for it. Keeping them straight is the entire point.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-1024x576.jpg\" alt=\"Client app supplies values, SSAI layer substitutes macros, ad server receives and responds\" class=\"wp-image-7417\" srcset=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-1024x576.jpg 1024w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-300x169.jpg 300w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-768x432.jpg 768w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-1536x864.jpg 1536w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-2048x1152.jpg 2048w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-800x450.jpg 800w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-1200x675.jpg 1200w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-1-9-600x338.jpg 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><strong>The three parties and their jobs<\/strong><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The client app: supplies the values only it knows<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The application the viewer is actually using \u2014 a Roku channel, a mobile app, a smart-TV app, a web player \u2014 is the only party that knows certain things about the viewing environment. It knows the device&#8217;s advertising identifier, because that ID is provided by the device platform to the app. It knows the device make and model, the app bundle or store ID, the user&#8217;s consent and privacy choices, and details about the content the viewer selected. These are environment facts that live on the client and nowhere else. For them to be used in an ad request, the app has to read them and pass them along \u2014 typically by appending them to the playback or ad-session URL it uses to start the stream. If the app doesn&#8217;t collect and forward a value, no downstream party can conjure it, because no downstream party has access to it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The SSAI layer: substitutes the values into the ad request<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The server-side ad insertion platform sits between the app and the ad server. When an ad break arrives, the <a href=\"https:\/\/www.5centscdn.net\/blog\/what-is-ssai-server-side-ad-insertion\/\">SSAI<\/a> layer is the party that performs the actual VAST request to the ad server on the viewer&#8217;s behalf, and therefore it is the party that performs the macro substitution. It takes the values it has \u2014 the ones the app forwarded to it, plus a few it can observe itself, like the requesting IP in some configurations \u2014 and it writes them into the macros in the ad tag before calling the ad server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is a substitution role, not a generation role. The SSAI layer fills [DEVICEMAKE] with the make the app told it about; it does not know, and cannot invent, a make that the app never sent. This distinction is precisely where publishers most often go wrong: they assume the SSAI platform is <em>producing<\/em> the device data, when in fact it is <em>relaying and formatting<\/em> device data that originated in the app.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The ad provider or SSP: receives the request and returns an ad<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The ad server, supply-side platform, or demand partner is the party the request is ultimately sent to. It receives the fully-substituted ad request, reads the values it was given, uses them to decide which ad to serve, and returns the VAST response. Crucially, in the standard model this party does *not* fill in the standardized device and environment macros \u2014 those are expected to arrive already populated by the party that made the request. The ad provider consumes those values; it does not source them. This is why an ad provider can quite correctly say &#8220;we don&#8217;t fill those values&#8221; \u2014 because under the industry&#8217;s own guidance, filling standardized VAST player macros is the job of whoever performs the VAST request, which is the player or the SSAI server, not the ad server receiving it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is a genuine subtlety worth naming here, because it is a second source of confusion. Ad servers do have their *own* proprietary macros that they populate internally \u2014 but those are a different category from the standardized VAST player macros that carry device and environment data. When someone says &#8220;the ad server fills macros,&#8221; they may be thinking of those proprietary ad-server macros, which is true but unrelated to the device-level values that have to come from the client. Two different macro systems, two different owners, one very easy conflation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>A Concrete Example: The Roku Parameters Mix-Up<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abstract roles are easy to nod along to and hard to apply, so here is the kind of real situation where they matter, told in general terms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A publisher running a Roku channel notices that certain values in their ad requests \u2014 the advertising identifier, the device make, the device model \u2014 look like query parameters being generated somewhere in the delivery chain. Seeing those parameters appear alongside the ad request, the publisher reasonably assumes the SSAI provider is generating them, and when targeting looks off, they raise it with the ad provider. The ad provider checks and responds, correctly, that they do not fill those values \u2014 they have no macro-substitution role for device data; they simply receive whatever arrives and respond with an ad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both of those observations are true, and yet the problem persists, because the actual source of the values was never the SSAI layer *or* the ad provider. On Roku, as on other connected-TV platforms, the advertising identifier, device make, and device model are values the *app* is responsible for reading from the platform and appending to the playback URL it hands to the SSAI layer. The SSAI layer then substitutes those app-provided values into the ad-request macros. If the app is the thing populating them \u2014 which it is \u2014 then a gap or a mismatch in those parameters is an app-side configuration question, not something the SSAI provider generates from nothing or the ad provider fills in. The values were the client&#8217;s to supply all along; the SSAI layer&#8217;s role was only to carry them into the macros, and the ad provider&#8217;s role was only to read them once they arrived.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The resolution, in this pattern, is not to escalate further with the ad provider, who has correctly said the values aren&#8217;t theirs to fill, nor to ask the SSAI layer to generate data it has no access to. It is to confirm that the app is correctly reading the device advertising ID, make, and model from the platform and appending them to the session it opens \u2014 because that is the one link in the chain where those particular values actually originate.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-1024x576.jpg\" alt=\"Decision flow: is the value a device fact, a server-observable, or an ad decision\" class=\"wp-image-7418\" srcset=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-1024x576.jpg 1024w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-300x169.jpg 300w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-768x432.jpg 768w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-1536x864.jpg 1536w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-2048x1152.jpg 2048w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-800x450.jpg 800w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-1200x675.jpg 1200w, https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/explanation_template-2-8-600x338.jpg 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><strong>Tracing a missing value to its owner<\/strong><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to Tell Which Party a Value Belongs To<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Roku example generalizes into a simple diagnostic you can apply to any missing or wrong value in an ad request. The question to ask is: where does this value physically originate?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the value is a fact about the viewer&#8217;s device or environment \u2014 the advertising ID, device make and model, app identifier, consent and privacy signals, the specific content selected \u2014 it originates on the client, and the app must collect and forward it. No server-side party can create it. If the value is something observable at the moment the server makes the request \u2014 such as the requesting IP address or a server-side user-agent in certain setups \u2014 the SSAI layer can supply it directly. And if the value is a decision about *which* ad to serve, that belongs to the ad server or demand partner, which produces it in the VAST response. Trace the value to its true origin, and the responsible party becomes obvious; skip that step, and you end up asking a party to provide something they never had.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A useful habit is to inspect the actual ad-request URL when something looks wrong. If you see a raw, unreplaced macro like a literal [IFA] or [DEVICEMAKE] still sitting in brackets in the outgoing request, that tells you the substitution step didn&#8217;t happen or the value wasn&#8217;t available to substitute \u2014 which points you at whether the app forwarded the value and whether the substituting layer received it. If you see the macro replaced but with an empty or clearly wrong value, the substitution happened but the source value was missing or bad, which again points upstream to whoever was supposed to supply it. Reading the request itself turns a finger-pointing exercise into a factual one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why This Model Exists at All<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It is fair to ask why the responsibility is split this way instead of having one party handle everything. The answer is that the split follows access and trust, and once you see that, the design stops looking arbitrary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Device and environment facts are split off to the client because the client is the only party with legitimate access to them \u2014 the app is where the viewer&#8217;s device and consent choices actually live, and platform rules increasingly require that this data be sourced there rather than inferred elsewhere. Substitution is handed to whoever performs the request because that party is the one assembling the actual HTTP call, and it would be redundant and error-prone to have anyone else try to rewrite the URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And ad selection stays with the ad server because that is the party with the campaigns, the pricing, and the targeting logic. The industry&#8217;s shared <a href=\"https:\/\/iabtechlab.com\/wp-content\/uploads\/2020\/11\/IABTechLab_SSAI_VAST_Macros_v1.0-Nov-2020.pdf\">guidance for server-side ad insertion macros<\/a>, published by the IAB Tech Lab, formalizes exactly this division, precisely so that different platforms and vendors can interoperate without renegotiating who does what every time \u2014 a party performing the VAST request fills the standardized player macros, using values the client environment provides, and the ad server consumes them. The standardization is what lets a publisher combine an app on one platform, an SSAI layer from another vendor, and an ad provider from a third, and still have the whole chain work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Getting It Right the First Time<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The single most useful mental model here is to stop thinking of ad values as something a single black box &#8220;generates&#8221; and start thinking of each value as having a specific origin and a specific journey. Device and environment values start life in the client app and must be forwarded by it. The SSAI layer substitutes those forwarded values into the ad request and adds what it can legitimately observe. The ad server receives the assembled request and returns an ad. When a value is missing or wrong, the fix lives at the point where that specific value was supposed to originate \u2014 and for device-level data on connected-TV platforms, that point is almost always the app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Internalizing this saves the multi-day support threads, the misdirected escalations, and the quiet targeting and revenue losses that come from asking the wrong layer to do a job it was never responsible for. The ad provider isn&#8217;t withholding values it should be filling; the SSAI layer isn&#8217;t failing to generate data it never had; the app simply needs to send what only it can know.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5centsCDN operates the SSAI and delivery layer of this chain \u2014 the part that reads your ad break, performs the VAST request, substitutes the values your app provides into the ad macros, and stitches the returned ad into your stream. If you are setting up ad insertion and want the macro flow configured correctly from the start, or you are debugging why certain values aren&#8217;t reaching your ad server, our <a href=\"https:\/\/5centscdn.net\/monetization\/ad-insertion\/\">ad insertion<\/a> and <a href=\"https:\/\/5centscdn.net\/monetization\/ad-manager\/\">ad manager<\/a> tooling handles the substitution and routing side, and you can validate what your tags actually carry with our <a href=\"https:\/\/www.5centscdn.net\/vast-validator\/\">VAST validator<\/a>. For the wider picture of who decides which ad wins, our guide to <a href=\"https:\/\/www.5centscdn.net\/blog\/dsp-vs-ssp-vs-ad-exchange\/\">DSP vs SSP vs ad exchange<\/a> maps the demand side. When you want a second set of eyes on where a value is going missing in your chain, <a href=\"https:\/\/5centscdn.net\/contact-us\">talk to our team<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<div class=\"wp-block-aioseo-faq\" data-schema-only=\"false\"><h3 class=\"aioseo-faq-block-question\"><strong>Does the SSAI provider generate the device advertising ID and device make\/model?<\/strong><\/h3><div class=\"aioseo-faq-block-answer\">\n<p class=\"wp-block-paragraph\">No. The SSAI layer substitutes those values into ad macros, but it can only use values the client app supplies. The advertising ID, make, and model originate in the app and must be appended to the playback\/session URL.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-aioseo-faq\" data-schema-only=\"false\"><h3 class=\"aioseo-faq-block-question\"><strong>Who fills in VAST macros?<\/strong><\/h3><div class=\"aioseo-faq-block-answer\">\n<p class=\"wp-block-paragraph\">Per IAB Tech Lab guidance, standardized VAST player macros are filled by the party that performs the VAST request \u2014 the player or the SSAI server on its behalf \u2014 not the ad server receiving the request.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-aioseo-faq\" data-schema-only=\"false\"><h3 class=\"aioseo-faq-block-question\"><strong>Why does the ad provider say they don&#8217;t fill these values?<\/strong><\/h3><div class=\"aioseo-faq-block-answer\">\n<p class=\"wp-block-paragraph\">Because they&#8217;re correct: standardized device\/environment macros are filled by whoever makes the VAST request (player\/SSAI), not the ad server. The ad server consumes those values to pick an ad; it doesn&#8217;t source them.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-aioseo-faq\" data-schema-only=\"false\"><h3 class=\"aioseo-faq-block-question\"><strong>Where do Roku device values come from in an ad request?<\/strong><\/h3><div class=\"aioseo-faq-block-answer\">\n<p class=\"wp-block-paragraph\">On Roku and other CTV platforms, the app reads the advertising identifier, device make, and model from the platform and appends them to the session URL. The SSAI layer then substitutes them into the ad macros.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-aioseo-faq\" data-schema-only=\"false\"><h3 class=\"aioseo-faq-block-question\"><strong>How do I debug a missing value in an ad request?<\/strong><\/h3><div class=\"aioseo-faq-block-answer\">\n<p class=\"wp-block-paragraph\">Inspect the outgoing ad-request URL. A raw unreplaced [MACRO] means substitution didn&#8217;t happen or the value was unavailable; an empty\/wrong value means the source value was missing. Trace the value to where it originates \u2014 usually the app for device data.<\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.<\/p>\n","protected":false},"author":123478,"featured_media":7414,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[201],"tags":[],"class_list":["post-7413","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ott-monetization"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO Pro 5.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.\" \/>\n\t<meta name=\"robots\" content=\"noarchive, notranslate, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"Fahad Anwar Muneer\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 5.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"5centsCDN | Video Live Streaming | CDN | Restream - Live streaming platform and restreaming to YouTube and Facebook. IP cam restreaming with restreaming.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\" \/>\n\t\t<meta property=\"og:description\" content=\"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"161\" \/>\n\t\t<meta property=\"og:image:height\" content=\"58\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-09-14T12:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-11T06:39:13+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/5centscdn\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@5centscdn\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@5centscdn\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#blogposting\",\"name\":\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\",\"headline\":\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\",\"author\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/author\\\/fahad5centscdn-ca\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-image_temeplate-8-scaled.jpg\",\"width\":2560,\"height\":1440},\"datePublished\":\"2026-09-14T12:00:00+00:00\",\"dateModified\":\"2026-09-11T06:39:13+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#webpage\"},\"articleSection\":\"OTT &amp; Monetization\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/category\\\/ott-monetization\\\/#listItem\",\"name\":\"OTT &amp; Monetization\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/category\\\/ott-monetization\\\/#listItem\",\"position\":2,\"name\":\"OTT &amp; Monetization\",\"item\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/category\\\/ott-monetization\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#listItem\",\"name\":\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#listItem\",\"position\":3,\"name\":\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/category\\\/ott-monetization\\\/#listItem\",\"name\":\"OTT &amp; Monetization\"}}]},{\"@type\":\"FAQPage\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#faq\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Does the SSAI provider generate the device advertising ID and device make\\\/model?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. The SSAI layer substitutes those values into ad macros, but it can only use values the client app supplies. The advertising ID, make, and model originate in the app and must be appended to the playback\\\/session URL.\"}},{\"@type\":\"Question\",\"name\":\"Who fills in VAST macros?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Per IAB Tech Lab guidance, standardized VAST player macros are filled by the party that performs the VAST request \\u2014 the player or the SSAI server on its behalf \\u2014 not the ad server receiving the request.\"}},{\"@type\":\"Question\",\"name\":\"Why does the ad provider say they don't fill these values?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Because they're correct: standardized device\\\/environment macros are filled by whoever makes the VAST request (player\\\/SSAI), not the ad server. The ad server consumes those values to pick an ad; it doesn't source them.\"}},{\"@type\":\"Question\",\"name\":\"Where do Roku device values come from in an ad request?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"On Roku and other CTV platforms, the app reads the advertising identifier, device make, and model from the platform and appends them to the session URL. The SSAI layer then substitutes them into the ad macros.\"}},{\"@type\":\"Question\",\"name\":\"How do I debug a missing value in an ad request?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Inspect the outgoing ad-request URL. A raw unreplaced [MACRO] means substitution didn't happen or the value was unavailable; an empty\\\/wrong value means the source value was missing. Trace the value to where it originates \\u2014 usually the app for device data.\"}}],\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#breadcrumblist\"}},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/#organization\",\"name\":\"5centsCDN | Video Live Streaming | CDN | Restream\",\"description\":\"Live streaming platform and restreaming to YouTube and Facebook. IP cam restreaming with restreaming.\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/\",\"email\":\"hello@5centscdn.com\",\"telephone\":\"+13025203418\",\"foundingDate\":\"2021-04-08\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":1,\"maxValue\":50},\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/Logo.svg\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#organizationLogo\",\"width\":161,\"height\":58},\"image\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/facebook.com\\\/5centscdn\",\"https:\\\/\\\/x.com\\\/5centscdn\",\"https:\\\/\\\/instagram.com\\\/5centscdn\",\"https:\\\/\\\/tiktok.com\\\/@5centscdn\",\"https:\\\/\\\/pinterest.com\\\/5centscdn\",\"https:\\\/\\\/youtube.com\\\/5centscdn\",\"https:\\\/\\\/linkedin.com\\\/in\\\/5centscdn\",\"https:\\\/\\\/bsky.app\\\/profile\\\/5centscdn\",\"https:\\\/\\\/threads.com\\\/@5centscdn\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/author\\\/fahad5centscdn-ca\\\/#author\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/author\\\/fahad5centscdn-ca\\\/\",\"name\":\"Fahad Anwar Muneer\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#webpage\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/\",\"name\":\"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server\",\"description\":\"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/author\\\/fahad5centscdn-ca\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/author\\\/fahad5centscdn-ca\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-image_temeplate-8-scaled.jpg\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#mainImage\",\"width\":2560,\"height\":1440},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/who-fills-vast-ad-macros\\\/#mainImage\"},\"datePublished\":\"2026-09-14T12:00:00+00:00\",\"dateModified\":\"2026-09-11T06:39:13+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/\",\"name\":\"5centsCDN | Video Live Streaming | CDN | Restream\",\"alternateName\":\"5centsCDN\",\"description\":\"Live streaming platform and restreaming to YouTube and Facebook. IP cam restreaming with restreaming.\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.5centscdn.net\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<script type=\"text\/javascript\">\n\t\t\t(function(c,l,a,r,i,t,y){\n\t\t\tc[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;\n\t\t\tt.src=\"https:\/\/www.clarity.ms\/tag\/\"+i+\"?ref=aioseo\";y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);\n\t\t})(window, document, \"clarity\", \"script\", \"feo2cgjhrw\");\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server<\/title>\n\n","aioseo_head_json":{"title":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","description":"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.","canonical_url":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/","robots":"noarchive, notranslate, max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#blogposting","name":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","headline":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","author":{"@id":"https:\/\/www.5centscdn.net\/blog\/author\/fahad5centscdn-ca\/#author"},"publisher":{"@id":"https:\/\/www.5centscdn.net\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/hero-image_temeplate-8-scaled.jpg","width":2560,"height":1440},"datePublished":"2026-09-14T12:00:00+00:00","dateModified":"2026-09-11T06:39:13+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#webpage"},"isPartOf":{"@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#webpage"},"articleSection":"OTT &amp; Monetization"},{"@type":"BreadcrumbList","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.5centscdn.net\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog\/category\/ott-monetization\/#listItem","name":"OTT &amp; Monetization"}},{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog\/category\/ott-monetization\/#listItem","position":2,"name":"OTT &amp; Monetization","item":"https:\/\/www.5centscdn.net\/blog\/category\/ott-monetization\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#listItem","name":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#listItem","position":3,"name":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","previousItem":{"@type":"ListItem","@id":"https:\/\/www.5centscdn.net\/blog\/category\/ott-monetization\/#listItem","name":"OTT &amp; Monetization"}}]},{"@type":"FAQPage","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#faq","url":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/","mainEntity":[{"@type":"Question","name":"Does the SSAI provider generate the device advertising ID and device make\/model?","acceptedAnswer":{"@type":"Answer","text":"No. The SSAI layer substitutes those values into ad macros, but it can only use values the client app supplies. The advertising ID, make, and model originate in the app and must be appended to the playback\/session URL."}},{"@type":"Question","name":"Who fills in VAST macros?","acceptedAnswer":{"@type":"Answer","text":"Per IAB Tech Lab guidance, standardized VAST player macros are filled by the party that performs the VAST request \u2014 the player or the SSAI server on its behalf \u2014 not the ad server receiving the request."}},{"@type":"Question","name":"Why does the ad provider say they don't fill these values?","acceptedAnswer":{"@type":"Answer","text":"Because they're correct: standardized device\/environment macros are filled by whoever makes the VAST request (player\/SSAI), not the ad server. The ad server consumes those values to pick an ad; it doesn't source them."}},{"@type":"Question","name":"Where do Roku device values come from in an ad request?","acceptedAnswer":{"@type":"Answer","text":"On Roku and other CTV platforms, the app reads the advertising identifier, device make, and model from the platform and appends them to the session URL. The SSAI layer then substitutes them into the ad macros."}},{"@type":"Question","name":"How do I debug a missing value in an ad request?","acceptedAnswer":{"@type":"Answer","text":"Inspect the outgoing ad-request URL. A raw unreplaced [MACRO] means substitution didn't happen or the value was unavailable; an empty\/wrong value means the source value was missing. Trace the value to where it originates \u2014 usually the app for device data."}},{"@type":"Question","name":"Does the SSAI provider generate the device advertising ID and device make\/model?","acceptedAnswer":{"@type":"Answer","text":"No. The SSAI layer substitutes those values into ad macros, but it can only use values the client app supplies. The advertising ID, make, and model originate in the app and must be appended to the playback\/session URL."}},{"@type":"Question","name":"Who fills in VAST macros?","acceptedAnswer":{"@type":"Answer","text":"Per IAB Tech Lab guidance, standardized VAST player macros are filled by the party that performs the VAST request \u2014 the player or the SSAI server on its behalf \u2014 not the ad server receiving the request."}},{"@type":"Question","name":"Why does the ad provider say they don't fill these values?","acceptedAnswer":{"@type":"Answer","text":"Because they're correct: standardized device\/environment macros are filled by whoever makes the VAST request (player\/SSAI), not the ad server. The ad server consumes those values to pick an ad; it doesn't source them."}},{"@type":"Question","name":"Where do Roku device values come from in an ad request?","acceptedAnswer":{"@type":"Answer","text":"On Roku and other CTV platforms, the app reads the advertising identifier, device make, and model from the platform and appends them to the session URL. The SSAI layer then substitutes them into the ad macros."}},{"@type":"Question","name":"How do I debug a missing value in an ad request?","acceptedAnswer":{"@type":"Answer","text":"Inspect the outgoing ad-request URL. A raw unreplaced [MACRO] means substitution didn't happen or the value was unavailable; an empty\/wrong value means the source value was missing. Trace the value to where it originates \u2014 usually the app for device data."}}],"inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.5centscdn.net\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#breadcrumblist"}},{"@type":"Organization","@id":"https:\/\/www.5centscdn.net\/blog\/#organization","name":"5centsCDN | Video Live Streaming | CDN | Restream","description":"Live streaming platform and restreaming to YouTube and Facebook. IP cam restreaming with restreaming.","url":"https:\/\/www.5centscdn.net\/blog\/","email":"hello@5centscdn.com","telephone":"+13025203418","foundingDate":"2021-04-08","numberOfEmployees":{"@type":"QuantitativeValue","minValue":1,"maxValue":50},"logo":{"@type":"ImageObject","url":"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#organizationLogo","width":161,"height":58},"image":{"@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#organizationLogo"},"sameAs":["https:\/\/facebook.com\/5centscdn","https:\/\/x.com\/5centscdn","https:\/\/instagram.com\/5centscdn","https:\/\/tiktok.com\/@5centscdn","https:\/\/pinterest.com\/5centscdn","https:\/\/youtube.com\/5centscdn","https:\/\/linkedin.com\/in\/5centscdn","https:\/\/bsky.app\/profile\/5centscdn","https:\/\/threads.com\/@5centscdn"]},{"@type":"Person","@id":"https:\/\/www.5centscdn.net\/blog\/author\/fahad5centscdn-ca\/#author","url":"https:\/\/www.5centscdn.net\/blog\/author\/fahad5centscdn-ca\/","name":"Fahad Anwar Muneer"},{"@type":"WebPage","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#webpage","url":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/","name":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","description":"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.5centscdn.net\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#breadcrumblist"},"author":{"@id":"https:\/\/www.5centscdn.net\/blog\/author\/fahad5centscdn-ca\/#author"},"creator":{"@id":"https:\/\/www.5centscdn.net\/blog\/author\/fahad5centscdn-ca\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2026\/09\/hero-image_temeplate-8-scaled.jpg","@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#mainImage","width":2560,"height":1440},"primaryImageOfPage":{"@id":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/#mainImage"},"datePublished":"2026-09-14T12:00:00+00:00","dateModified":"2026-09-11T06:39:13+00:00"},{"@type":"WebSite","@id":"https:\/\/www.5centscdn.net\/blog\/#website","url":"https:\/\/www.5centscdn.net\/blog\/","name":"5centsCDN | Video Live Streaming | CDN | Restream","alternateName":"5centsCDN","description":"Live streaming platform and restreaming to YouTube and Facebook. IP cam restreaming with restreaming.","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.5centscdn.net\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"5centsCDN | Video Live Streaming | CDN | Restream - Live streaming platform and restreaming to YouTube and Facebook. IP cam restreaming with restreaming.","og:type":"article","og:title":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","og:description":"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.","og:url":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/","og:image":"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg","og:image:secure_url":"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg","og:image:width":161,"og:image:height":58,"article:published_time":"2026-09-14T12:00:00+00:00","article:modified_time":"2026-09-11T06:39:13+00:00","article:publisher":"https:\/\/facebook.com\/5centscdn","twitter:card":"summary_large_image","twitter:site":"@5centscdn","twitter:title":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","twitter:description":"Ad macros confuse everyone: who supplies device values, who substitutes them, who receives them. A plain-language guide to SSAI macro responsibility.","twitter:creator":"@5centscdn","twitter:image":"https:\/\/www.5centscdn.net\/blog\/wp-content\/uploads\/2022\/06\/Logo.svg"},"aioseo_meta_data":{"post_id":"7413","title":"#post_title","description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"ad macros","score":0,"analysis":[]},"additional":[{"keyphrase":"who fills ad macros","score":0},{"keyphrase":"VAST macro substitution","score":0},{"keyphrase":"SSAI macros","score":0},{"keyphrase":"device advertising ID in ad request","score":0},{"keyphrase":"macro replacement responsibility","score":0},{"keyphrase":"Roku ad macros","score":0},{"keyphrase":"client vs SSAI vs ad server","score":0},{"keyphrase":"VAST player macros","score":0}]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[{"hidden":false,"schemaBlockId":"aioseo-mtwkfuo6lsvge","tagName":"h3","answer":"No. The SSAI layer substitutes those values into ad macros, but it can only use values the client app supplies. The advertising ID, make, and model originate in the app and must be appended to the playback\/session URL.","question":"Does the SSAI provider generate the device advertising ID and device make\/model?","type":"aioseo\/faq"},{"hidden":false,"schemaBlockId":"aioseo-mtwkfx5ydsl7i","tagName":"h3","answer":"Per IAB Tech Lab guidance, standardized VAST player macros are filled by the party that performs the VAST request \u2014 the player or the SSAI server on its behalf \u2014 not the ad server receiving the request.","question":"Who fills in VAST macros?","type":"aioseo\/faq"},{"hidden":false,"schemaBlockId":"aioseo-mtwkfzxyph6ue","tagName":"h3","answer":"Because they're correct: standardized device\/environment macros are filled by whoever makes the VAST request (player\/SSAI), not the ad server. The ad server consumes those values to pick an ad; it doesn't source them.","question":"Why does the ad provider say they don't fill these values?","type":"aioseo\/faq"},{"hidden":false,"schemaBlockId":"aioseo-mtwkg3ealjf3z","tagName":"h3","answer":"On Roku and other CTV platforms, the app reads the advertising identifier, device make, and model from the platform and appends them to the session URL. The SSAI layer then substitutes them into the ad macros.","question":"Where do Roku device values come from in an ad request?","type":"aioseo\/faq"},{"hidden":false,"schemaBlockId":"aioseo-mtwkg60s81kjx","tagName":"h3","answer":"Inspect the outgoing ad-request URL. A raw unreplaced [MACRO] means substitution didn't happen or the value was unavailable; an empty\/wrong value means the source value was missing. Trace the value to where it originates \u2014 usually the app for device data.","question":"How do I debug a missing value in an ad request?","type":"aioseo\/faq"}],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":"2026-09-15 13:28:45","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":"0","open_ai":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-09-10 14:03:14","updated":"2026-09-15 13:31:10","focus_keyword":"ad macros","additional_keywords":[{"word":"who fills ad macros","score":80,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":9},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":9}}},{"word":"VAST macro substitution","score":74,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":9},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":6}}},{"word":"SSAI macros","score":80,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":9},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":9}}},{"word":"device advertising ID in ad request","score":69,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":6},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":6}}},{"word":"macro replacement responsibility","score":74,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":9},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":6}}},{"word":"Roku ad macros","score":80,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":9},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":9}}},{"word":"VAST player macros","score":74,"items":{"introductionKeyword":{"score":3},"keyphraseLength":{"score":9},"keyphraseDensity":{"score":4},"functionWordsInKeyphrase":{"score":9},"textCompetingLinks":{"score":9},"imageKeyphrase":{"score":6}}}],"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.5centscdn.net\/blog\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.5centscdn.net\/blog\/category\/ott-monetization\/\" title=\"OTT &amp; Monetization\">OTT &amp; Monetization<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\tWho Fills In Your Ad Macros? SSAI vs Player vs Ad Server\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.5centscdn.net\/blog"},{"label":"OTT &amp; Monetization","link":"https:\/\/www.5centscdn.net\/blog\/category\/ott-monetization\/"},{"label":"Who Fills In Your Ad Macros? SSAI vs Player vs Ad Server","link":"https:\/\/www.5centscdn.net\/blog\/who-fills-vast-ad-macros\/"}],"_links":{"self":[{"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/posts\/7413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/users\/123478"}],"replies":[{"embeddable":true,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/comments?post=7413"}],"version-history":[{"count":2,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/posts\/7413\/revisions"}],"predecessor-version":[{"id":7420,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/posts\/7413\/revisions\/7420"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/media\/7414"}],"wp:attachment":[{"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/media?parent=7413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/categories?post=7413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.5centscdn.net\/blog\/wp-json\/wp\/v2\/tags?post=7413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}