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 leavesmarketingoutside its consent scope. - Opt-out and notice regions get the matched rule's
ad_storagedefault. Without one, an opt-out region follows whethermarketingis on by default, and a notice region getsgranted. - 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.