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#

FeatureDocumented?WhereNote
Campaign ID (RefID) on the booking page URLYes"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 exportYes"Reporting information for Shared Bookings"Four months per file; Administrator role only
TrackingData on the Power Automate triggerYes, as a connector fieldPower Automate connectorOnly filled when the link had a RefID
Tracking field in Microsoft GraphNoGraph APIbookingAppointment has no tracking property
UTM parametersNo—Users have reported Bad Request pages since 2020
A tag, pixel or script slotNo—Nowhere in the Bookings settings
Redirect after bookingNo—Microsoft staff confirmed in 2023 there's "no native support"
Messages from the iframe to your pageNo—No JavaScript embed or events
Tracking on Bookings with me pagesNo—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.offer is saved as springoffer.
  • 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#

GoalNative?RouteLimitPage
Know which campaign produced a bookingPartlyShort RefID code per link, read from the exportReported Bad Request and blank values; shared pages onlyRefID not working
Keep UTM dataNoUTMs on your landing page, mapped to one short RefIDUTMs on the Bookings link can break it and are never storedUTM Bad Request, UTM guide
Fire a tag on a thank-you pageNoA link in the confirmation email; a flow after bookingNeither moves the visitor's browserThank-you redirect
GA4 intent eventsNo, on your siteGTM click and visibility triggersCounts starts, not bookingsGA4 conversions
GA4 completed bookingsNoPower Automate flow to the Measurement Protocol, keyed by RefIDNo session, so source can show (not set); Premium HTTP actionGA4 and GTM guide
GTM inside the iframeNoNone; track around the frameCross-origin, no documented messagesGTM and the iframe
Google AdsNoSecondary click conversion, plus gclid through RefID and offline importgclid is case-sensitive and long; no documented RefID lengthAnswer, guide
MetaNoPixel on your pages, plus a Conversions API Schedule event from a flowNo _fbp or fbclid unless you pass a key, so matching relies on emailAnswer, guide
LinkedInNoInsight Tag click conversion, li_fat_id kept through RefID, Conversions APINeeds a token and a developer for the API stepLinkedIn guide
Microsoft Ads (UET)NoUET event goal on the click, plus msclkid offline importConversions older than 90 days are rejected; data can take six hours to appearUET guide
Session recordings and heatmapsNoClarity on your page, with custom eventsClarity doesn't render or record clicks in third-party framesClarity
Where visitors drop offNoCompare your page's counts with export rowsTotals only, no per-visit linkFunnel drop-off

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.

More on this topic

Questions people also ask

Sources

  1. Microsoft Learn: Customize booking page (opens in a new tab) · learn.microsoft.com
  2. Microsoft Learn: Reporting info (opens in a new tab) · learn.microsoft.com
  3. Microsoft Learn: Bookings faq (opens in a new tab) · learn.microsoft.com
  4. Microsoft Learn: Share shared bookings page (opens in a new tab) · learn.microsoft.com
  5. Microsoft Learn: Personal bookings faq (opens in a new tab) · learn.microsoft.com

Edit or question? hello@bookingsxp.com