Xandr / Microsoft Advertising: Architecture, Data Models, and Compliance Guide 2026
Why Xandr / Microsoft Advertising Architecture Confuses People
I've seen this exact situation on dozens of enterprise ad ops desks: a team migrates to Xandr / Microsoft Advertising, gets their credentials sorted, and then spends three frustrating days staring at an impression delivery report that makes no sense. The platform delivered impressions. The DSP logged bids. But conversions are zero, data segments aren't populating, and the demand-side configuration feels like it was designed by someone who genuinely dislikes you.
You're not alone , and you're probably not doing anything wrong. Xandr's ecosystem is genuinely layered. It was built by assembling years of ad tech acquisitions, and what Microsoft inherited when it completed the Xandr acquisition is a powerful but architecturally complex platform that expects you to understand several interlocking systems before a single ad serves correctly.
Here's the honest picture. Xandr / Microsoft Advertising operates at the intersection of three major infrastructure layers: the demand-side platform (DSP) layer that handles programmatic buying decisions in real time, the data management platform (DMP) layer that powers audience targeting using first-party and third-party data, and the supply-side decisioning layer that manages how ad calls flow through inventory. Each layer has its own configuration surface, its own error modes, and its own compliance requirements.
What makes this particularly painful is that the error messages you'll encounter rarely point to the actual problem. You might see an impression discrepancy that's really a daisy chain misconfiguration upstream. You might see audience segment sizes that look correct in the DMP but never flow through to actual targeting, because deterministic ID matching hasn't been properly configured between your authenticated data and the platform's identity graph. You might set up OTT device targeting, get impressions, and then discover in post-campaign analysis that your connected TV spend went to the wrong device tier entirely.
The platform's compliance architecture adds another layer. Xandr / Microsoft Advertising operates under multiple industry self-regulatory frameworks simultaneously, the Digital Advertising Alliance (DAA) guidelines, the Network Advertising Initiative (NAI) standards, and platform-specific data governance rules that affect how you can use offline data, how behavioral targeting works, and what disclosures your campaigns need to carry. Get any of this wrong and you're not just looking at delivery problems, you're looking at potential compliance violations.
This guide breaks all of it down. We'll cover the core architecture, common configuration errors that kill campaigns before they start, how the data model actually works (including where deterministic data matching can break), OTT/CTV device targeting issues, and what compliance really means in a post-cookie world. Browse all Microsoft fix guides →
The Quick Fix, Get Your First Campaign Live
If you've just set up a new advertiser seat on Xandr / Microsoft Advertising and nothing is serving, the fastest path to resolution is validating three things in order. Don't skip ahead, these checks are sequential because each one is a prerequisite for the next.
First: confirm your DSP seat is mapped to active inventory. Log into the Invest DSP console, navigate to Advertiser > Campaigns, open your campaign, and check the Supply Strategy tab. If the supply type reads "Managed Only" and you haven't explicitly set up managed deals, your campaign will never bid. Switch to "Open Exchange" or configure your private marketplace deals before anything else.
Second: verify your data segment targeting isn't excluding all available inventory. This is the most common reason campaigns look healthy in setup but deliver zero impressions. Go to Audience Segments under your Line Item, open the targeting logic, and check whether your segment inclusions have an AND relationship when they should be OR. If you've stacked three behavioral segments with AND logic and your reach estimate shows under 10,000 users, you've built yourself into a targeting corner. Relax the logic to OR and watch your reach estimate update immediately.
Third: check your creative audit status. Xandr runs automated creative audits before allowing ads to serve on most inventory. Go to Creative Manager, find your creative, and check the Audit Status column. If it reads "No Audit" or "Rejected," the creative will not serve regardless of how perfect your campaign setup is. Submit the creative for audit (button is in the Creative Actions menu) and allow 24–48 hours. For MRAID-based mobile rich media ads specifically, which use the Mobile Rich Media Ad Interface Definitions API standard, make sure your creative declares the correct MRAID version in the tag header, or the audit will auto-reject it.
/creative with the audit_status filter to pull the status of all pending creatives in a single call, far faster than clicking through the UI one by one. Batch your audit status checks into your morning ops workflow and you'll catch rejections before they burn a full day of delivery.
The DSP layer in Xandr / Microsoft Advertising is where automated buying decisions happen, it's deciding in milliseconds whether to bid on an impression, at what price, and on behalf of which advertiser. Getting this configured wrong means you either overspend on the wrong inventory or underbid and serve nothing at all.
Start in the Invest DSP interface. Navigate to Line Item > Programmatics > Optimization Settings. You'll see two core bid strategy modes: Optimize to a Goal and Manual CPM. For new campaigns without historical data, I always recommend starting with Manual CPM, optimization algorithms need conversion signal data to function, and a brand-new campaign gives the system nothing to learn from. Set your manual CPM at roughly 1.5× what you'd pay on a comparable open exchange deal for your vertical.
Next, set your pacing. Under Budget & Pacing, choose Lifetime Budget with Evenly Distribute pacing for brand campaigns, and ASAP pacing only for time-sensitive takeovers or retargeting where recency matters. ASAP pacing will burn your budget in the first hours of the day, which is almost never what you want for a standard display campaign.
For the inventory strategy, make your open marketplace vs. private marketplace decision deliberately. Xandr's open marketplace is a true auction environment where multiple media owners compete for the same buyer interest. Private marketplace (PMP) deals give you priority access to specific publisher inventory at negotiated floors. If your campaign targets premium publisher content, especially for CTV or OTT placements, PMP is worth the setup overhead.
# Validate your seat's bidding configuration via API
GET https://api.appnexus.com/line-item?id={LINE_ITEM_ID}&include_bid_strategy=1
# Key fields to check in the response:
# "bid_strategy": should be "cpm" for manual or "goal_optimization" for auto
# "pacing_type": "no-pacing", "daily", or "lifetime"
# "supply_strategies": confirm "rtb" is true for open exchange
If the API returns "bid_strategy": null, your line item was created without a bidding strategy attached, a common issue when line items are cloned from templates. You'll see zero bids in delivery reporting until this is fixed.
The DMP in Xandr / Microsoft Advertising is where first-party data meets third-party data and where your targeting strategy actually lives. I've watched campaigns with perfect DSP setup fail completely because the DMP integration was never verified end-to-end.
Here's how the data model works in plain terms. Your first-party data, collected from your own website, CRM, or loyalty systems, gets ingested into the platform either via pixel (a JavaScript tag on your site), server-to-server data transfer (batch file upload via SFTP), or through a real-time API integration. This data is used to build user segments inside the platform. Third-party data from external data providers can then be layered on top, demographics, interest categories, behavioral signals, to enrich your first-party audiences.
To verify your first-party data is flowing correctly, navigate to Audiences > Segments in the platform. Find your segment and check the User Count column. If you set up pixel collection more than 48 hours ago and the count reads zero, something in the pixel implementation is broken. The most common culprit: the pixel is firing but the seg parameter in the pixel URL isn't including your correct segment ID. Check the browser network tab for requests to ib.adnxs.com/seg and verify the segment ID in the query string matches the segment ID shown in your console.
<!-- Correct Xandr segment pixel format -->
<img src="https://ib.adnxs.com/seg?add=YOUR_SEGMENT_ID&t=2"
width="1" height="1" style="display:none" />
<!-- Common broken version (missing seg ID) -->
<img src="https://ib.adnxs.com/seg?t=2" width="1" height="1" />
For deterministic data matching, where you're linking known subscriber or authenticated user data to the platform's identity graph, you'll need to use the Xandr Data Upload API or a partner data onboarding service. Deterministic matching requires a 1:1 verified identifier (hashed email, authenticated user ID) and produces far more reliable audience match rates than probabilistic methods. Expect match rates between 40–65% for hashed email uploads, depending on how current your CRM data is.
After your segments are confirmed populated, go to your Line Item's targeting settings, add the segment under Audience & Location Targeting, and set the boolean logic. Remember: AND logic narrows reach, OR logic expands it.
OTT (Over the Top) and connected TV device targeting is where Xandr / Microsoft Advertising genuinely separates itself from most programmatic platforms, and where the configuration surface gets most complex. I know this is frustrating when all you want to do is reach people watching streaming content, so let me cut straight to what matters.
OTT inventory in Xandr covers internet-delivered video content that bypasses traditional cable and satellite, services like Pluto, Tubi, and virtual MVPDs (vMVPDs) like Sling TV. The platform distinguishes between OTT devices (the physical hardware: smart TVs, streaming sticks like Roku, gaming consoles, Apple TV) and OTT content (what's playing on those devices). You can target either or both, and the distinction matters for your CPM strategy.
To set up OTT device-level targeting, navigate to your Line Item and go to Device & Supply Type targeting. You'll see a list of device categories. Select Connected TV to target the broad CTV universe, or drill into specific device types. Here's what most guides miss: if you're running video creatives, you must also go to Video Targeting and set the Video Context to "In-Stream" for pre/mid/post-roll placements inside actual content, not outstream, which is the embedded-in-article auto-play format.
# Verify device targeting configuration via API
GET https://api.appnexus.com/profile?id={PROFILE_ID}
# Check "device_type_targets" array in response:
# [6] = Connected TV / Smart TV
# [4] = Tablet
# [0] = PC
# [1] = Phone
# Also verify "supply_type_action" is "include" not "exclude"
For data-driven linear TV campaigns, where you're using demographic, interest, and behavioral data to optimize a linear TV schedule, the setup path is different. This flows through the platform's advanced TV tooling, not the standard display/video campaign interface. You'll work with specific network and daypart targeting, and your data model needs to map to TV audience segments, not standard cookie-based web segments. If your platform seat doesn't show Advanced TV options in the campaign creation flow, contact your Microsoft Advertising account team, this feature requires specific seat-level enablement.
Decisioning is the automated process by which Xandr's ad server determines where, how, and to whom to serve an ad. When decisioning is misconfigured, you end up with impression discrepancies, fill rate problems, and inventory that seems available but never actually serves. This is one of the most under-documented problem areas in the whole platform.
The most common decisioning issue I see is an unintentionally broken daisy chain. In Xandr / Microsoft Advertising, a daisy chain is a sequence of ad tags, usually from different exchanges, ad networks, or servers, where an impression passes from tag to tag if no creative is found at each step. Tag 1 can't fill? It passes to Tag 2. Tag 2 fails? On to Tag 3. Each hop in the chain is a new ad call, and each hop adds latency and another failure point.
Problems arise when the passback tag, sometimes called a default tag, at the end of your chain points back to a tag earlier in the chain, creating an infinite loop. You'll see this in your ad server logs as an unusually high number of ad calls relative to actual impressions served. To diagnose this, pull your Ad Call Log from Reporting > Log-Level Data > Ad Requests and filter for requests where imp_type is 6 (default/passback) and cross-reference with the referring tag IDs.
# Log-Level Data query to detect daisy chain loops
# In the Xandr Report Builder UI, set:
# Report Type: Network Analytics
# Dimensions: Placement, Referring Tag ID, Impression Type
# Metric: Imps
# Filter: Impression Type = "Default"
# Look for any Placement that appears as both a serving placement
# AND a referring tag ID, that's your loop.
For nonexclusive inventory, inventory where you can't be certain of your position in an existing daisy chain, the platform will flag ad calls that have already passed through another platform. Check the Resold flag in your impression data. High resold percentages (above 30%) on what you thought was direct inventory is a signal you're buying deep in a chain, not at the source, and you should renegotiate your inventory access or switch to direct PMP deals.
Default creatives, also called reserve creatives, are your last line of defense in the decisioning chain. Make sure every placement you manage has a valid default creative configured, or failing demand at the top of your chain will result in blank ad spaces rather than fallback fills.
This is the step most ad ops teams skip until something breaks, usually when a publisher flags a compliance issue or a brand safety audit comes back with a warning. Don't let that be you. Xandr / Microsoft Advertising compliance configuration isn't optional, and getting it right from day one saves serious headaches later.
The platform operates under two major industry self-regulatory frameworks: the Digital Advertising Alliance (DAA) and the Network Advertising Initiative (NAI). Both are focused on consumer education and transparency around online behavioral advertising (OBA), which is the practice of targeting users based on their past browsing behavior. When you run behavioral targeting campaigns on Xandr, you're running OBA, and both frameworks require you to provide consumers with notice and opt-out mechanisms.
The DAA's primary consumer-facing mechanism is the Advertising Option Icon, the small "AdChoices" triangle icon that appears on behaviorally targeted ads. In Xandr / Microsoft Advertising, this icon is configured at the creative level. Navigate to Creative Manager > Creative Details, and verify the AdChoices Icon toggle is enabled for any creative running on behavioral targeting. If you're using third-party ad tags from an external ad server, confirm that the ad server is inserting the icon, the responsibility doesn't shift just because you're using Xandr as the buying platform.
# Verify AdChoices compliance status via Creative API
GET https://api.appnexus.com/creative?id={CREATIVE_ID}
# Check field: "adchoices_icon": true/false
# If false on a behavioral campaign creative, update immediately:
PUT https://api.appnexus.com/creative?id={CREATIVE_ID}
Body: {"creative": {"adchoices_icon": true}}
For data compliance, pay close attention to how you're categorizing your data segments. Segments built from offline data, vehicle registrations, shipping records, loyalty card transactions, carry different disclosure requirements than segments built from online behavioral data. Segments from online sources (cookie data, login/registration data, preference data) fall under OBA rules and must include opt-out mechanisms. When creating data segments in the DMP, you must tag each segment with its data source type so the platform can enforce the correct compliance rules at serve time.
For enterprise deployments, confirm your Data Processing Agreement (DPA) with Microsoft is current. Xandr's data infrastructure is governed by Microsoft's enterprise data agreements, and if your DPA has lapsed or was signed under old AppNexus terms pre-acquisition, you may be operating outside your contractual data permissions without realizing it. Your Microsoft account team can pull the current agreement status for your seat.
Advanced Troubleshooting: Xandr / Microsoft Advertising Architecture
When the standard troubleshooting steps don't resolve your issue, you're usually dealing with one of three categories: identity resolution failures, inventory quality problems at the exchange level, or enterprise/domain-specific configuration conflicts. Here's how to attack each one.
Identity Resolution and Deterministic ID Failures. Deterministic IDs in Xandr are built from verified, authenticated data, typically from TV service subscriber records, authenticated app logins, or verified email-to-cookie mappings. If your audience match rates are unexpectedly low (under 20%), the most likely cause is a mismatch between the identifier format you're uploading and what the platform expects. Xandr expects SHA-256 hashed emails in lowercase before hashing. If your CRM team exported emails with mixed case and hashed them without normalizing first, every single hash will be wrong. Request a re-export with explicit lowercase normalization before hashing, re-upload, and check match rates after the 24-hour processing window.
Multi-Channel Attribution Gaps. Xandr supports multi-channel attribution, the ability to track known audience viewing behavior and correlate outcomes (conversions, site visits, store visits) back to ad exposure across channels. The configuration gap I see most often: teams set up view-through attribution windows correctly but forget to include the CTV/OTT impression events in the attribution model. In the Conversion Attribution settings, make sure Include CTV Impressions is enabled if you're running any cross-screen campaigns. Without this, your CTV spend will show zero attributed conversions even if it's driving real business outcomes.
Native Advertising Delivery Problems. Native ads, paid placements designed to match the form and function of the surrounding content, have a specific approval process in Xandr that differs from display creatives. Native creatives require individual field-level approval: the title, image, body text, and call-to-action are each reviewed separately. A creative can show as "Approved" at the ad-level but have individual fields marked as non-compliant, which prevents delivery on certain publisher segments. Check Creative Manager > Native Creative Fields and look at the audit status column for each individual field.
Event Viewer Equivalent: Xandr Diagnostic Reporting. Unlike a Windows environment where you'd pull Event ID logs, Xandr's equivalent is the Log-Level Data (LLD) reporting suite. Go to Reporting > Log-Level Data Feeds and request the Standard Feed for your seat. This gives you impression-level data including bid prices, win/loss reasons, creative audit flags, and user segment data. Filter on clear_fees and buyer_bid fields to identify bidding anomalies, if you're bidding but losing consistently to undisclosed competitors, your bid floor assumptions are wrong and need recalibration.
Optimization and Deduplication Issues. Effective programmatic buying depends on clean, deduplicated data. If you're seeing conversion counts in Xandr that seem far higher than your analytics platform reports, you likely have a deduplication problem, the platform may be counting multiple clicks or events from the same user as separate conversions. In the Conversion Pixel settings, enable the Deduplication Window and set it to match your business's natural purchase cycle. For most e-commerce, a 30-day deduplication window removes the noise. For subscription products, 7 days is more appropriate.
Prevention & Best Practices for Xandr / Microsoft Advertising
I've spent enough time diagnosing broken campaigns to know that most problems are preventable. The teams that run Xandr / Microsoft Advertising smoothly aren't smarter than the teams that struggle, they just have better operational habits baked into their workflow.
The single biggest prevention move: establish a pre-flight checklist that runs before any campaign goes live. This isn't glamorous, but it catches the category of errors that account for roughly 70% of all first-week delivery problems. Your checklist should verify creative audit status, segment population counts, supply strategy settings, pacing configuration, and conversion pixel deduplication settings, in that order, every time, without exception.
On the data side, build a regular cadence for auditing your DMP segments. Segments built from behavioral data decay, users who showed intent-based behavior six months ago are not the same audience as users who showed that behavior last week. Most data providers refresh their segments on 30–90 day cycles, but your segment configurations in the platform won't automatically update if a data provider changes their taxonomy. Quarterly audits of your data provider segments against current taxonomy documentation prevent you from targeting ghost audiences that no longer match your actual customer profile.
For compliance, assign a named owner for DAA and NAI compliance on every campaign. This doesn't need to be a lawyer, it needs to be someone who checks that the Advertising Option Icon is present on behavioral creatives, that OBA opt-out mechanisms are functional, and that your data segment classifications match their actual data sources. Making compliance a shared responsibility usually means it belongs to no one.
Finally: keep your Microsoft account team informed about major campaign initiatives before they launch, not after. Xandr's platform has seat-level rate limits on bid requests, impression volumes, and data upload rates. If you're planning a large-scale seasonal campaign, a heads-up to your account team can prevent automated throttling from killing your delivery at the worst possible moment.
- Schedule weekly Log-Level Data exports and flag any campaigns where default/passback impression share exceeds 20%, that's your daisy chain health check.
- Enable email alerts for creative audit rejections in the platform notification settings so you hear about rejections immediately, not during your next manual check.
- For every new data segment, document the source type (online behavioral, offline, deterministic) in the segment description field, it makes compliance audits a fraction of the work.
- Test your MRAID mobile rich media ad tags in the Xandr Creative Preview tool before submitting for audit, it catches version declaration errors before they cause an auto-rejection.
Frequently Asked Questions
Why are my Xandr campaigns showing bids in the report but zero impressions served?
This almost always comes down to one of three things: your creative hasn't passed the platform audit yet (check Creative Manager for audit status), your bid price is below the inventory floor price even though bids are technically being submitted, or your audience targeting logic is so narrow, usually too many AND-linked segments, that there's no inventory to match. Start by checking creative audit status, then pull your bid landscape report to see whether you're winning any auctions at all. If bids are going out but win rate is 0%, your CPM floor is the issue.
What's the difference between a DSP and a DMP in the Xandr platform, and do I need both?
The DSP (demand-side platform) is the buying engine, it makes real-time decisions about which impressions to bid on and at what price. The DMP (data management platform) is the audience intelligence layer, it stores, segments, and activates your first-party and third-party data. You technically can run campaigns with the DSP alone using broad contextual or site-based targeting, but without the DMP your targeting is essentially untargeted. For any performance-focused campaign, you need both configured and connected. The good news is they're part of the same Xandr platform infrastructure, this isn't a separate tool purchase.
My OTT / connected TV targeting is delivering impressions but I can't tell what devices they're actually going to, how do I break this out?
In the Invest DSP reporting UI, go to Reporting > Network Analytics, add "Operating System" and "Device Type" as dimensions, and filter your date range. Device Type 6 is Connected TV/Smart TV, while other device types indicate mobile or desktop bleed, which happens when OTT content is consumed on a phone or laptop rather than a living-room screen. If you want to guarantee you're only hitting true CTV hardware, add an explicit Device Type include filter in your line item targeting set to Type 6 only. This will reduce reach but eliminate device classification ambiguity.
How do I know if my campaign is compliant with DAA and NAI rules for behavioral targeting?
The two things to verify are: one, the AdChoices icon is enabled on every creative running against behavioral segments (check Creative Manager > Creative Details, "AdChoices Icon" toggle should be on), and two, the data segments you're targeting are properly classified by source type so the platform enforces the correct consent rules. If you're targeting with third-party data, confirm your data provider is a registered NAI member, you can check the NAI website's member list. Running behavioral campaigns with unregistered third-party data is an OBA compliance violation that publishers and brand safety vendors can flag.
What's a passback tag and why does it keep causing my campaigns to show blank ads?
A passback tag (also called a default tag) is what runs when the primary demand source can't fill an impression. It's passed to a secondary ad server to find demand. Blank ads appear when the passback tag either points to a dead end, an ad server that has no active demand for the placement, or when the tag URL itself is malformed and the secondary server can't parse it. Pull your ad server's error log and look for HTTP 4xx responses on passback calls. The most common specific cause is a passback tag that still references a legacy AppNexus endpoint (pre-Microsoft rebranding) that has been deprecated. Update those to current Xandr/Microsoft Advertising API endpoints.
Why are my audience segment sizes showing huge numbers in the DMP but my campaign reach is tiny?
Segment size in the DMP and addressable reach in a live campaign are two different measurements. The DMP shows total users in the segment globally. But your campaign can only reach users who are both in your segment AND on inventory you've made available through your supply strategy. If your supply strategy is limited to a small set of managed publishers or a narrow PMP deal, only the subset of your segment users who happen to be on that inventory in your flight window is actually addressable. Expand your supply strategy to open exchange first, run a short test, and use the reach estimation tool (available in the line item setup under Audience Targeting) to see your realistic addressable pool before committing budget.