Tracking & analytics

Know which ads and pages book appointments

Microsoft Bookings has no analytics and no conversion tracking. BookingsXP reports every step of the booking to GA4, Tag Manager and your ad platforms, and writes the source of each booking into its notes in Microsoft Bookings.

Events and attribution are on the Free plan

Analytics · Northwind WellnessSample data
Widget views
4,812
unique visits that saw a widget
Bookings
187
3 failed attempts
Conversion rate
3.9%
bookings ÷ views
Missed demand
96
visits that found no open times

Booking funnel

Unique visits reaching each step.

  1. Saw the widget4,812
  2. Picked a day1,904, a drop of −60%
  3. Picked a time1,122, a drop of −41%
  4. Started details498, a drop of −56%
  5. Booked187, a drop of −62%

3.9% of visits that saw the widget booked. Largest drop: Started details to booked (−62%).

Channels

GA4-style default channel grouping.

Views, bookings and conversion rate by channel
ChannelViewsBookingsConv.
Paid search1,642784.8%
Organic search1,318523.9%
Direct824293.5%
Paid social48691.9%
Email212115.2%
Referral19852.5%
Organic social13232.3%

Campaigns

From utm_campaign.

Views, bookings and conversion rate by campaign
CampaignViewsBookingsConv.
spring-physio1,106585.2%
brand536203.7%
october-newsletter212115.2%
retargeting-q348691.9%

The problem

The booking happens where your tags cannot see it

On Microsoft Q&A, the question “Microsoft Bookings – Analytics” has more than 70 “I have the same question” votes. It has been open since 2020, it is now locked, and Microsoft has not answered it.
  1. 01

    Your tags cannot run there

    The Bookings page is on Microsoft's domain. You cannot add GA4, Tag Manager, the Google tag or a Meta pixel to it, so the visit you paid for ends at the link.

  2. 02

    There is no conversion to count

    Bookings sends no event when someone books, so Google Ads and Meta cannot learn which clicks turn into appointments, and automated bidding has no booking signal to work from.

  3. 03

    The source is lost

    The appointment in Outlook says who booked and when, not whether they came from an ad, a search or a newsletter. The RefId workaround is reported unreliable, and its value never appears in the calendar event.

Events

What the widget sends, and where

Every step is pushed to your page's dataLayer as bookingsxp.<event> and dispatched as a bookingsxp:<event> DOM event. Four steps also go straight to GA4, and a confirmed booking fires your ad conversions.
Widget events, their dataLayer and GA4 names, and the ad platform events they fire
dataLayer eventWhenGA4 eventAd platforms (Pro)
bookingsxp.widget_viewedThe widget came into viewbookingsxp_viewMeta ViewContent
bookingsxp.service_selectedA service was pickedNot sentNone
bookingsxp.staff_selectedA person was picked (if offered)Not sentNone
bookingsxp.date_selectedA day was pickedNot sentNone
bookingsxp.slot_selectedA time was pickedbookingsxp_slotNone
bookingsxp.form_startedThe visitor started typing their detailsbookingsxp_form_startNone
bookingsxp.booking_submittedThe form was sentNot sentNone
bookingsxp.booking_completedMicrosoft Bookings confirmed the bookinggenerate_lead + bookingsxp_bookedGoogle Ads conversion, Meta Schedule, LinkedIn conversion
bookingsxp.booking_failedThe booking could not be madeNot sentNone
bookingsxp.no_availabilityThe visitor found no open timesNot sentNone
  • GA4 events are sent directly when gtag.js is on the page and you add your measurement ID; otherwise use Tag Manager on the dataLayer events. value and currency come from the service price when Bookings has one.
  • Google Ads, Meta and LinkedIn fire only when that platform's tag is already on the page and its ID is set in the widget. Google Ads gets the booking ID as the transaction ID; Meta gets it as the event ID, so duplicates are dropped.

Attribution

The source, inside the booking

Turn on “Write source & campaign into the booking notes” and every booking carries a short block your team reads in Outlook: the campaign, the keyword, the page someone first landed on and which ad they clicked. No personal data goes into it.
Calendar · Northwind WellnessIllustrative

Initial assessment

Wed 14 Oct, 10:15–11:00Dr. Maya Chen

Customer
Alex Rivera
Email
alex.rivera@example.com
Phone
+1 555 0142

Notes

Left knee, running injury.

— Booked on your website · Ref BXP-7K3M9Q
Source: google / cpc · Campaign: spring-physio (Paid search)
Keyword: sports physio near me
First page: /physio?area=knee
Booked from: northwind.example/book
Referrer: google.com
Ad click: gclid

Written into the booking by BookingsXP. Microsoft Bookings keeps it with the appointment in Outlook, Teams and the Bookings app.

What is captured
utm_source, utm_medium, utm_campaign, utm_term and utm_content; the gclid, gbraid, wbraid, fbclid, msclkid, li_fat_id or ttclid click ID; the referrer; the first page; and the page the booking was made on.
First touch that counts
The loader remembers the last campaign visit for 90 days, so someone who clicks an ad on Monday and books from a bookmark on Friday is still credited to the ad. A plain return visit does not overwrite it.
GA4-style channels
Each booking is classified as Paid search, Paid social, Organic search, Organic social, Email, Referral, Direct or Other, the same grouping GA4 uses by default.
In Bookings' own export
Optionally, BookingsXP answers a custom question on your Bookings page, such as “How did you hear about us?”, with the source, and hides it from visitors. It then shows up in Microsoft's own reports and exports.
A reference on both sides
Each booking gets a reference like BXP-7K3M9Q, written into the notes and sent to Microsoft as the booking's tracking data, so you can match a booking in Outlook to its row in BookingsXP.

Dashboard

What the dashboard reports

The dashboard counts visits with a random per-visit ID: no cookies, no names, no emails, no IP addresses. Free shows the headline numbers for 30 days; Pro adds the reports for 12 months, Business for 24.
Views, bookings and conversion rateAll plans
Unique visits that saw a widget, confirmed bookings, failed attempts and bookings ÷ views, with a daily chart of each.
Missed demandAll plans
Visits that opened the widget and found no open times. The number to show whoever sets staff hours.
Booking funnelPro
Saw the widget, picked a day, picked a time, started details, booked: where visitors drop off.
Channels and source / mediumPro
GA4-style channel grouping, plus the raw source and medium, with views, bookings and conversion rate for each.
CampaignsPro
Every utm_campaign that brought a visit, and how many of those visits booked.
PagesPro
Which pages the widget was on when people booked, for sites with the widget in several places.
Services and devicesPro
Which services people considered and booked, and how mobile, desktop and tablet visitors convert.
When appointments landPro
A weekday by hour heatmap of booked appointments, in your own time zone.
CSV exportPro
Every event in the period as a CSV file, for your own reporting.

Privacy

Enhanced conversions without shipping raw emails

Better ad matching usually means sending a customer's email to an ad platform. BookingsXP hashes it first, in the visitor's browser, and only when you ask it to.
Hashed in the browser
With enhanced conversions on, the widget computes a SHA-256 hash of the email on the visitor's device and sends Google Ads only the hash, as sha256_email_address. The raw address never goes to Google.
Only on a confirmed booking
The hash exists only on booking_completed, and only for widgets with enhanced conversions switched on. Update your privacy notice before you turn it on.
Global Privacy Control honoured
When the browser sends GPC, or your consent tool sets window.bxpConsent = false, the loader sends only the page path and the referrer's domain, and forgets any stored campaign touch.
No cookies set
The loader sets no cookies. It reads only the _ga, _fbp and _fbc cookies your own tags already set, so GA4 and Meta can join the booking to the visit.

Setup

Set it up in Tag Manager

Add the widget, then point a Custom Event trigger at bookingsxp.booking_completed. The step-by-step guide is in GTM and GA4 setup, with platform notes for Google Tag Manager and Google Ads.
dataLayer
// What the loader pushes on your page when a booking is confirmed
window.dataLayer.push({
  event: "bookingsxp.booking_completed",
  bookingsxp: {
    name: "booking_completed",
    widgetId: "w_8fk2m1qz",
    businessName: "Northwind Wellness",
    service: { id: "8b3c2f4e-…", name: "Initial assessment", durationMinutes: 45 },
    staff: { id: "f41e9a27-…", name: "Dr. Maya Chen" },
    slot: {
      start: "2026-10-14T14:15:00.000Z",
      end: "2026-10-14T15:00:00.000Z",
      timeZone: "America/New_York",
    },
    booking: { id: "AAMkADk2ZTJh…" },
  },
});
Google Tag Manager
Trigger    Custom Event
           Event name: bookingsxp.booking_completed

Variables  Data Layer Variable  bookingsxp.service.name
           Data Layer Variable  bookingsxp.booking.id

Tag        Google Analytics: GA4 Event
           Event name: generate_lead
           Parameters: service_name = {{bookingsxp.service.name}}
           Trigger: the Custom Event above
DOM event
// Or listen in your own code, no Tag Manager needed
window.addEventListener("bookingsxp:booking_completed", (e) => {
  const { service, slot, booking } = e.detail;
  console.log("Booked", service.name, slot.start, booking.id);
});

Thank-you page

Send people to your own confirmation page

Set a redirect URL in the widget and, after a confirmed booking, the page moves to it. Tags that only fire on a thank-you page view keep working. The move waits 600 ms so pixels finish sending.

Redirect URL

Text
https://northwind.example/thank-you?id={booking_id}&service={service}&start={start}

Where the visitor lands

Text
https://northwind.example/thank-you?id=AAMkADk2ZTJh…&service=Initial%20assessment&start=2026-10-14T14%3A15%3A00.000Z

{booking_id} is Microsoft's booking ID, {service} the service name and {start} the start time in ISO format, all URL-encoded. Relative URLs work, and a redirect-url attribute on the element overrides the saved setting for one page.

Plans

What each plan tracks

Events and attribution are free, because they are the reason to use a widget at all. Reports and ad conversions are on Pro. Compare plans
Tracking and analytics features by plan
FeatureFreeProBusiness
dataLayer events for Google Tag ManagerIncludedIncludedIncluded
GA4 eventsIncludedIncludedIncluded
Source and campaign in every booking's notesIncludedIncludedIncluded
Thank-you page redirectIncludedIncludedIncluded
Views, bookings, conversion rate, missed demand30 days12 months24 months
Funnel, channel, campaign, page and device reportsNot includedIncludedIncluded
Google Ads, Meta and LinkedIn conversionsNot includedIncludedIncluded
Enhanced conversions (hashed email)Not includedIncludedIncluded
CSV exportNot includedIncludedIncluded

Want the booking data itself in your CRM? Webhooks and data

FAQ

Questions about tracking

Count every booking

Events, GA4 and attribution in every booking are on the Free plan. Add Google Ads, Meta and reports when you need them.