---
title: "Microsoft Ads, Clarity and Universal Pixel"
description: "Three separate Microsoft products, three separate consent calls."
url: "https://cookiebeam.com/docs/integrations/microsoft"
lang: "en"
---

# 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:

```js
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:

```js
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.**

```js
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:

```js
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`:

```json
{
  "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](https://about.ads.microsoft.com/en/blog/post/february-2026/advanced-consent-mode-preserving-accurate-measurement-while-respecting-user-privacy) 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](https://cookiebeam.com/docs/install/script-tag) 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](https://learn.microsoft.com/en-us/clarity/setup-and-installation/consent-mode), including its project cookie settings.

## Testing

For UET, check the queue directly:

```js
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.
