Integrations & API
Microsoft Bookings conversion tracking: what works
What Microsoft Bookings tracks natively (only RefID), why an iframe blocks GA4, GTM and pixels, and each route for UTMs, ads, Clarity and the funnel.
Last updated 5 sources
Microsoft Bookings has one tracking feature: a campaign code added to a shared booking page link as ?RefID=, which shows up in the Tracking data column of the booking export. As of October 2026 there's no field for GA4, Google Tag Manager or an ad pixel, no redirect to your own thank-you page, and nothing the embedded page tells your site. Every other measurement happens on your own pages (intent) or server-side after Microsoft creates the appointment (completed bookings).
Built-in reports, the export and what they can't count are in Reporting and exports. This chapter is about getting bookings into your analytics and ad platforms.
What Microsoft documents#
| Feature | Documented? | Where | Note |
|---|---|---|---|
Campaign ID (RefID) on the booking page URL | Yes | "Customize and publish your booking page" | Letters, digits, _ and - only; Microsoft says to test the URL. Its example still uses the old /owa/calendar/ address |
| Tracking data column in the export | Yes | "Reporting information for Shared Bookings" | Four months per file; Administrator role only |
TrackingData on the Power Automate trigger | Yes, as a connector field | Power Automate connector | Only filled when the link had a RefID |
| Tracking field in Microsoft Graph | No | Graph API | bookingAppointment has no tracking property |
| UTM parameters | No | — | Users have reported Bad Request pages since 2020 |
| A tag, pixel or script slot | No | — | Nowhere in the Bookings settings |
| Redirect after booking | No | — | Microsoft staff confirmed in 2023 there's "no native support" |
| Messages from the iframe to your page | No | — | No JavaScript embed or events |
| Tracking on Bookings with me pages | No | — | Personal pages document no campaign ID |
Microsoft describes the campaign ID as the way to "see which of your campaigns are connecting with customers". In practice it gives you a short code per booking, in a file you download by hand.
Why the iframe doesn't help#
Embedding feels like it should fix tracking, because the visitor never leaves your page. It doesn't. The frame is a separate document on a Microsoft domain, so the browser's same-origin policy stops your scripts from reading its content or hearing its clicks. GTM triggers, the GA4 tag, Meta Pixel, the LinkedIn Insight Tag, Microsoft Advertising UET and Microsoft Clarity all run in your page's document and see the frame as a box. Its load event fires when it first loads, not when someone books. The confirmation also stays inside the frame, so your page's URL never changes.
What your tags can see is everything around the frame: page views, clicks on links to the booking page, the frame coming into view, and the moment someone first clicks into it. Those are intent signals. The detail, including a working blur snippet, is in GTM and the Bookings iframe.
What we saw when testing (September 2026)#
We captured the public booking page and the calls it makes (13 live captures in several time zones), and made, rescheduled and cancelled a handful of test bookings:
- The public booking API sends no CORS headers. Scripts on your site can't call it or read its responses from the browser, so anything custom needs a server in between.
- The shared page fills the booking's tracking data from the first query parameter named
refid, in any letter case, after silently stripping every character except letters, digits,_and-.spring.offeris saved asspringoffer. - The value is stored on the appointment and survived a reschedule.
- It did not appear in the calendar event the owner receives in Outlook, so staff won't see it there.
- The booking request has no field for UTM values, and on Bookings with me pages it has no tracking field at all.
We had no owner access to the test page, so we couldn't check the export column ourselves. Users have reported it blank since 2024.
Routes and their limits#
| Goal | Native? | Route | Limit | Page |
|---|---|---|---|---|
| Know which campaign produced a booking | Partly | Short RefID code per link, read from the export | Reported Bad Request and blank values; shared pages only | RefID not working |
| Keep UTM data | No | UTMs on your landing page, mapped to one short RefID | UTMs on the Bookings link can break it and are never stored | UTM Bad Request, UTM guide |
| Fire a tag on a thank-you page | No | A link in the confirmation email; a flow after booking | Neither moves the visitor's browser | Thank-you redirect |
| GA4 intent events | No, on your site | GTM click and visibility triggers | Counts starts, not bookings | GA4 conversions |
| GA4 completed bookings | No | Power Automate flow to the Measurement Protocol, keyed by RefID | No session, so source can show (not set); Premium HTTP action | GA4 and GTM guide |
| GTM inside the iframe | No | None; track around the frame | Cross-origin, no documented messages | GTM and the iframe |
| Google Ads | No | Secondary click conversion, plus gclid through RefID and offline import | gclid is case-sensitive and long; no documented RefID length | Answer, guide |
| Meta | No | Pixel on your pages, plus a Conversions API Schedule event from a flow | No _fbp or fbclid unless you pass a key, so matching relies on email | Answer, guide |
| No | Insight Tag click conversion, li_fat_id kept through RefID, Conversions API | Needs a token and a developer for the API step | LinkedIn guide | |
| Microsoft Ads (UET) | No | UET event goal on the click, plus msclkid offline import | Conversions older than 90 days are rejected; data can take six hours to appear | UET guide |
| Session recordings and heatmaps | No | Clarity on your page, with custom events | Clarity doesn't render or record clicks in third-party frames | Clarity |
| Where visitors drop off | No | Compare your page's counts with export rows | Totals only, no per-visit link | Funnel drop-off |
UTMs and RefID on links#
Put full UTMs on your own landing page, where analytics reads them, and send Bookings one short RefID. The UTM guide maps campaigns to codes, and the other guides reuse the same slot for a GA4 client_id, a gclid, an msclkid or a lookup key. You get one RefID per link, so decide what it carries before you build several integrations on it. If tagged links return Bad Request, the usual cause is spaces or other encoded characters in UTM values (UTM Bad Request).
Thank-you pages#
There's no redirect setting, and embedding doesn't create one. The closest options are a "what happens next" link in the confirmation email (clicked by some bookers, hours later) and opening Bookings in a new tab so your page is still there afterwards. Neither is a conversion (thank-you redirect).
Ad platforms#
Google Ads, Meta, LinkedIn and Microsoft Advertising all end up with the same two-level setup. First, a click conversion on your own Book button, set as secondary so bidding doesn't chase clicks. Second, the platform's click ID stored on your site, passed to Bookings in the RefID, caught by a Power Automate flow on When a appointment is Created (the connector spells it that way), and uploaded or sent server-side. The differences are in the click IDs and matching rules, which each guide covers. Don't point an ad's final URL straight at the Bookings link: auto-tagging appends a click ID, and Microsoft doesn't document how the page handles it.
Server-side flows and their shared limits#
Every completed-booking route depends on the Bookings connector, so its limits apply to all of them. As of October 2026 it's labelled Preview, only an Administrator on that booking page can build flows with its triggers, and each booking mailbox allows five flows in total. Separate flows for GA4, Google Ads, Meta and LinkedIn would use four of them, so combine them in one flow where you can. Flows only see new activity, and only on shared booking pages, because every trigger needs a booking mailbox and personal pages don't have one. The full list is in the Power Automate connector chapter.
Recordings and the funnel#
Clarity and Hotjar record your landing page and stop at the frame, so a cold frame on a heatmap doesn't mean nobody booked. Custom Clarity events on the Book click and on the first click into the frame let you filter recordings by who started (Clarity). For drop-off, put sessions, Book clicks, frame interactions and export rows for the same week side by side, then work through the causes in the funnel guide.
Doing this with BookingsXP#
When bookings go through the BookingsXP widget or hosted page, the booking steps run on your page, so the tags you already use can see them. Each step is pushed to the dataLayer, GA4, Google Ads (with optional enhanced conversions), Meta and LinkedIn conversions fire when Microsoft confirms the booking, a thank-you redirect is available, and the UTM source is written into the booking notes in Microsoft Bookings. It doesn't see bookings made on the page Microsoft hosts or added by staff, and it doesn't send Meta Conversions API events server-side. See analytics. BookingsXP is independent and not affiliated with or endorsed by Microsoft.
- AnswerWhy do UTM parameters break my Microsoft Bookings link?
- AnswerCan Microsoft Bookings redirect to a thank-you page?
- AnswerHow do I track Google Ads conversions from Bookings?
- AnswerCan I add a Facebook (Meta) pixel to Microsoft Bookings?
- GuideTrack Microsoft Bookings conversions in GA4 with GTM
- GuideGoogle Ads conversion tracking for Microsoft Bookings
- GuideMeta Pixel and Conversions API for Microsoft Bookings
- GuideLinkedIn conversion tracking for Microsoft Bookings
- GuideMicrosoft Ads (Bing) UET conversions for Microsoft Bookings
- AnswerWhy is RefID tracking blank or Bad Request in Bookings?
- GuideFind where Microsoft Bookings visitors drop off
- AnswerHow do I track Microsoft Bookings conversions in GA4?
- AnswerCan GTM track bookings inside the Microsoft Bookings iframe?
- AnswerCan Microsoft Clarity record Microsoft Bookings?
- GuidePass UTM parameters and gclid into Microsoft Bookings
Questions people also ask
Sources
- Microsoft Learn: Customize booking page (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Reporting info (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Bookings faq (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Share shared bookings page (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Personal bookings faq (opens in a new tab) · learn.microsoft.com
Edit or question? hello@bookingsxp.com