Skip to documentation content

Microsoft Ads, Clarity and Universal Pixel

Three separate Microsoft products, three separate consent calls.

Microsoft has three tracking products that each want their own consent call. Turning on one doesn't cover the others, and a site running all three needs all three.

Microsoft Ads (UET)

What it does. Passes ad storage consent to the Universal Event Tracking tag.

Consent category. marketing, through adStorage.

How it works. UET treats ad_storage as granted until it's told otherwise, so the bridge sends a default once, when the banner script loads and before any choice:

window.uetq.push('consent', 'default', { ad_storage: 'denied' });

The default follows the visitor's region:

  • Opt-in regions get denied, unless the matched rule leaves marketing outside its consent scope.
  • Opt-out and notice regions get the matched rule's ad_storage default. Without one, an opt-out region follows whether marketing is on by default, and a notice region gets granted.
  • A visitor sending Global Privacy Control always gets denied.
  • So does a visitor in an A/B arm with a regional override, or an arm whose consent model is stricter than the region's.

After that, each consent update, and each stored choice restated on a later page view, sends:

window.uetq.push('consent', 'update', { ad_storage: 'granted' });

The default isn't sent again on updates. If uetq doesn't exist yet the bridge creates it as an array first, which is how Microsoft's own snippet expects queued calls to arrive.

Microsoft Clarity

What it does. Tells Clarity whether it may record the session and set cookies.

Consent category. Both. Clarity takes ad and analytics storage in one call, so it reflects marketing and analytics together.

How it works.

clarity('consentv2', {
  ad_Storage: 'granted',
  analytics_Storage: 'denied'
});

The capitalization in those key names is Clarity's, not ours.

When clarity isn't a function yet, the bridge installs the queue stub Clarity's snippet uses. It won't do that if window.clarity already holds something that isn't a function, since overwriting whatever that is would be worse than skipping the call.

Universal Pixel

What it does. Sends consent to Microsoft's Universal Pixel, which is a different product from UET and isn't reached by the UET bridge.

Consent category. marketing, through adStorage.

How it works. It's consent-shaped, so it sends a default and then updates:

pixie('consent', 'update', { ad_storage: 'granted' });

Calls made before pixie loads are queued against a stub and replayed, the same approach the Meta bridge uses.

Setup

UET and Clarity are on by default. Toggle them under Vendor Consent Signals on the banner's App Integrations page.

One detail for older banners: these two used to share a single microsoft flag. A theme that switched that off before the split stays off for both, so an old opt-out isn't quietly reversed by the split.

Universal Pixel is different. It's off by default and read from the theme's customFeatures:

{
  "microsoftUniversalPixel": {
    "enabled": true
  }
}

There's no dashboard control for it yet, so it needs a theme update through the API.

Measurement limits

CookieBeam's UET bridge sends a consent default and consent updates. It does not install UET or configure Microsoft's Advanced Consent Mode. Microsoft can model aggregate conversions in its own reporting, but receiving a consent update alone does not establish that the tag setup is correct or that modeling is available.

Microsoft's Advanced Consent Mode instructions require early UET loading with denied defaults and granted updates after consent. That is a separate implementation to verify with UET Tag Helper, not an instruction to move trackers ahead of CookieBeam's direct loader. The standard direct installation keeps the loader before managed trackers. If blocking prevents UET from loading until consent, the advanced cookieless path is unavailable. Microsoft notes that advanced mode is recommended but not strictly required for modeled conversions; CookieBeam does not guarantee those estimates.

Clarity's storage signals control cookie access and feature availability, not Google Ads conversion modeling or recovery of individual conversion events. Follow Clarity's consent setup, including its project cookie settings.

Testing

For UET, check the queue directly:

window.uetq

Consent entries appear as pushed arrays. For Clarity, watch for requests to clarity.ms starting or stopping as you change the analytics category. For Universal Pixel, confirm window.pixie is a function before assuming the bridge failed, because a queued call looks like silence until the pixel loads.