Guide · Tracking & analytics
Microsoft Ads (Bing) UET conversions for Microsoft Bookings
Last updated 9 min read10 sources
As of October 2026, there's no way to put a Microsoft Advertising UET tag on a Microsoft Bookings page. Microsoft hosts the page and offers no field for tags or scripts. After someone books, it shows its own confirmation and stays there, so a destination URL goal on a thank-you page has nothing to match. What works is a UET event goal when visitors click through to book from your site, plus an offline conversion import that uses the Microsoft Click ID (msclkid) to report each completed booking against the ad click that led to it. This guide builds both. It's for PPC managers running Microsoft Ads (Bing) campaigns to a shared Bookings page.
It's the Microsoft Advertising version of the Google Ads guide, and it reuses the same RefID approach. If you run both platforms, read that one too. The capture script below is built to work alongside it.
Why UET can't see the booking#
UET is JavaScript that runs on your pages and reports to bat.bing.com. The booking happens at outlook.office.com/book/..., where you can't add code. If you embed Bookings in an iframe, the UET tag on your page still can't see inside the frame, because it belongs to a different origin. It can't even detect the final Book click. See GTM and the Bookings iframe and thank-you page redirects for what Microsoft has said.
| Option | What Microsoft Advertising counts | Good for bidding? |
|---|---|---|
| UET event goal on the Book-link click | People who went to book | No. Report it, don't optimise on it |
Offline conversion import with msclkid | Bookings matched to the exact ad click | Yes, with a delay |
| UET event or thank-you page on your own booking page | Bookings as they happen | Yes |
Before you start#
- A UET tag on every page of your site, added directly or through GTM.
- Auto-tagging of Microsoft Click ID. It's on by default. Check Campaigns → Settings → Account level options → Add Microsoft Click ID (MSCLKID) to URLs to allow conversion tracking. Microsoft also turns it on when you create your first offline conversion goal.
- Consent: for visitors from the EEA, the UK and Switzerland, Microsoft asks you to send consent with UET through Consent Mode or TCF.
- For the offline import: the Administrator role on the Bookings calendar, Power Automate, and an Excel workbook in OneDrive or SharePoint.
Level 1: a UET event goal on the Book click#
Step 1: Create the goal#
- In Microsoft Advertising, go to Conversions → Conversion goals → Create and choose Website.
- Category: Outbound click is the honest choice for a click that leaves your site. Goal type: Event.
- Name it "Bookings link click" and set Action to
bookings_click. Leave category, label and value empty. - Select your UET tag and save.
Step 2: Fire the event from GTM#
If UET isn't in GTM yet, add the Microsoft Advertising Universal Event Tracking template tag with track type UET config/page view (required) and your UET tag ID, firing on All pages. Then add the event tag. Microsoft's template has a custom event type where you set the Action. A Custom HTML tag does the same job:
<script>
window.uetq = window.uetq || [];
window.uetq.push("event", "bookings_click", {});
</script>Fire it on the "Bookings link click" trigger from the GA4 and GTM guide. That trigger matches /book/ and older /owa/calendar/ Bookings links and book.ms short links. The Action has to match the goal exactly.
Once offline bookings are arriving, clear Include in "Conversions" on this goal so it's reported only under All conversions. Otherwise abandoned bookings count the same as real ones.
Level 2: import completed bookings with the msclkid#
Microsoft's offline process works like this: capture the click ID on your site, keep it with the lead, and upload it when the lead converts. Here the lead record is the Bookings appointment itself, and RefID carries the click ID into it.
Caveats#
- RefID is the only way in. Microsoft allows letters, digits, underscores and hyphens in RefID and says to test your URL. Users have reported Bad Request pages and blank Tracking data. See RefID not working.
- The ID fits. Microsoft describes the MSCLKID as a 32-character GUID, which uses only characters RefID accepts. Microsoft doesn't document a maximum RefID length, so test with a real click ID.
- One RefID per link. If you also send gclids, use one storage key so the most recent ad click wins, as the script below does.
- The connector. The Bookings connector is in Preview. Only Bookings admins can create flows with it, and each Bookings mailbox allows five.
- Timing. Wait two hours after creating the goal before the first upload. Data can take up to six hours to appear. Microsoft rejects conversions dated more than 90 days ago, only counts those inside the goal's conversion window, and the conversion time must be after the click.
Step 1: Create the offline goal#
Conversions → Conversion goals → Create → Offline conversions. Category: Book appointment. Name it exactly Booked appointment - Bookings, because the upload has to match this name. Set a revenue value if you want one; the Bookings trigger doesn't include the service price. Choose how to count, and set a conversion window (up to 90 days).
Step 2: Keep the click ID and put it in the Bookings link#
Microsoft notes that the msclkid is only on the landing page URL and is lost when the visitor moves to another page. So store it:
(function () {
var KEY = "bk_adclick"; // same key as the Google Ads guide: the latest click wins
var id = new URLSearchParams(location.search).get("msclkid");
if (id && /^[A-Za-z0-9_-]+$/.test(id)) {
localStorage.setItem(KEY, JSON.stringify({ ref: "ms-" + id, ts: Date.now() }));
}
var saved = JSON.parse(localStorage.getItem(KEY) || "null");
if (!saved || Date.now() - saved.ts > 90 * 864e5) return;
document.querySelectorAll('a[href*="outlook.office"]').forEach(function (a) {
var url = new URL(a.href);
if (!/\/(book|owa\/calendar)\//.test(url.pathname)) return;
url.search = "";
url.searchParams.set("RefID", saved.ref);
a.href = url.toString();
});
})();Load it only after the visitor has consented to advertising storage. If you already run the Google Ads guide's script, keep that script's capture block and add the msclkid lines to it, so one block rewrites the links.
Step 3: Write each booking to an Excel table#
Create a workbook in OneDrive or SharePoint with a table whose columns match Microsoft's import template:
| Microsoft Click ID | Conversion Name | Conversion Time | Conversion Value | Conversion Currency |
|---|
Then build the flow:
- Trigger: When a appointment is Created (Microsoft Bookings), with your booking page's SMTP address.
- Condition: Tracking data starts with
ms-. If you also import gclids, add a branch forgc-with the Google Ads table. - Action: Excel Online (Business) → Add a row into a table:
- Microsoft Click ID:
substring(triggerBody()?['TrackingData'], 3, sub(length(triggerBody()?['TrackingData']), 3)) - Conversion Name:
Booked appointment - Bookings - Conversion Time:
concat(formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm:ss'), '+0000') - Conversion Value and Currency: fixed values, or blank to use the goal's default
- Microsoft Click ID:
The run time is the booking time, because the flow fires right after the appointment is created. Don't use the appointment's start time. The +0000 offset matches one of Microsoft's accepted formats and avoids time-zone errors. Both connectors are Standard, so this flow doesn't need the Premium HTTP action.
Step 4: Upload#
Download Microsoft's template from the offline conversions page and paste your rows under its header. Then go to Conversions → Offline conversions → Uploads → + Upload, choose the file, select Upload and preview, read any errors, and Apply changes. Microsoft recommends uploading daily and warns that less frequent uploads can hurt automated bidding.
To automate this, Microsoft's Schedules tab fetches a file from an HTTPS, HTTP, SFTP or FTP address, or from a Google Sheet published to the web. A SharePoint file normally needs a sign-in, so you'd have to copy the rows somewhere Microsoft can fetch. Clear or archive rows after each upload. Microsoft ignores exact duplicates (same click ID, name and time), but tidy files are easier to debug.
Enhanced conversions#
Enhanced conversions add a hashed email or phone number so Microsoft can match conversions without a cookie. They don't help with level 1: your page doesn't know the visitor's email at the click. For offline imports, an enhanced goal accepts SHA-256 hashed emails, and the msclkid becomes optional. Microsoft requires the email to be normalised first (trim, lowercase, remove anything between + and @, remove dots before @) and hashed by you. That's easier in a small function than in a flow. Most teams get enough from the msclkid alone.
Testing#
- UET Tag Helper. With Microsoft's browser extension running, click a Book link and confirm the
bookings_clickevent fires once. - The link. Visit your site with
?msclkid=0123456789abcdef0123456789abcdef, then hover a Book link. It should end in?RefID=ms-0123.... - The flow. Make a test booking through that link and check a row arrived with the click ID and a UTC time.
- The upload. A made-up click ID won't match a real click. Microsoft notes that such rows can still show as uploaded successfully because the format is valid, so delete test rows. Your first real check is a booking that started from a real ad click.
- Cancel the test appointment in Bookings.
Common problems#
The event goal stays unverified. The UET base tag isn't loading on every page, or the Action in the tag doesn't match the goal. Microsoft says verification can take up to 24 hours.
Upload errors on the goal name, or nothing counted. The Conversion Name doesn't match the goal exactly, or you uploaded within two hours of creating it.
Rows accepted but no conversions. The click is older than the goal's conversion window, belongs to another account, or the conversion time is before the click.
No rows at all. RefID may be failing on your page, the visitor booked from an untagged link (a confirmation email or bookmark), or the flow isn't triggering. See Power Automate trigger not firing.
Counts differ from the Bookings export. Only bookings that started from a Microsoft Ads click have an msclkid, and staff-made bookings never do.
Doing this with BookingsXP#
BookingsXP has no built-in Microsoft Advertising UET support: there's no UET tag ID field and it doesn't call uetq. What it does have works with UET. The widget runs the booking on your own page, in front of your existing Bookings page, and pushes bookingsxp.booking_completed to the dataLayer when Microsoft Bookings confirms the appointment. In GTM, add a Custom Event trigger for that name and fire the UET custom event above on it, with an Action such as book_appointment and an Event goal to match. This works on Free. Or set a redirect-url thank-you page, also on Free, and create a destination URL goal for it, with your UET base tag on that page. Either way, the conversion is a confirmed booking rather than a click.
The widget also captures msclkid on every plan, keeps the first touch for 90 days, and records in the booking notes in Microsoft Bookings that the booking came from a Microsoft Ads click. The click ID value itself is in the booking.created webhook payload (Pro, with Store bookings switched on). Send that to Zapier, Make, n8n or Power Automate and write rows for the level 2 offline import without relying on RefID. All of this covers bookings made through the widget or hosted page only. See the tracking docs, Google Tag Manager, plans, or try it with your booking page. BookingsXP is independent and not affiliated with or endorsed by Microsoft.
Questions people also ask
Sources
- Microsoft Learn: Customize booking page (opens in a new tab) · learn.microsoft.com
- Microsoft Learn (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Campaign management service (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Msa help (opens in a new tab) · learn.microsoft.com
Related
- Google Ads conversion tracking for Microsoft Bookings
- LinkedIn conversion tracking for Microsoft Bookings
- Pass UTM parameters and gclid into Microsoft Bookings
- Can Microsoft Bookings redirect to a thank-you page?
- Track Microsoft Bookings conversions in GA4 with GTM
- Why is RefID tracking blank or Bad Request in Bookings?