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. On each consent update:
window.uetq.push('consent', 'update', { ad_storage: 'granted' });
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.
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.