Guide · Customers & data
Report on Microsoft Bookings in Excel (export and pivots)
Last updated 7 min readPart of Microsoft Bookings reporting and exports9 sources
Microsoft Bookings has no reporting dashboard, but it does export every booking to a file you can open in Excel. With some clean-up, that file answers the questions managers ask: which services are busiest, how evenly work is spread across staff, which weekdays fill up, and which campaigns bring bookings. This guide is for whoever owns reporting for a shared booking page. It starts from a downloaded export and covers a reliable import, clean-up in Power Query, the pivots worth building, how to stitch exports together over time, and when to switch to the Graph API. The first report takes about 45 minutes; a monthly refresh takes about five.
Before you start#
You need the TSV export from the Shared Bookings home page (Export → pick a date range → Export). Only staff with the Administrator role on the booking page can download it, and each file covers up to four months. Exporting Bookings to Excel covers the export itself, the full column list and why the two Microsoft pages disagree about the date window. This guide starts from a downloaded file.
The columns this guide uses:
| Column | Used for |
|---|---|
| Date & Time | Weekly trends, busiest days and hours |
| Staff, Service | Workload and demand by person and service |
| Duration (minutes) | Booked time per person |
| Custom Fields | Every question and answer for a booking in one cell ("All the questions and answers related to a single booking are combined in this field") |
| Booking ID | Counting bookings, and grouping the rows of one group session |
| Tracking data | The RefID campaign value from the booking link |
Name each file clearly when you save it, for example bookings-salesdemos-2026-05-to-2026-08.tsv, and keep every file: they're your history.
Step 1: Import the file into Excel#
Opening the TSV by double-clicking often works but can mangle dates, phone numbers with leading zeros and accented names. Importing gives you control.
- In a new workbook, go to Data → From Text/CSV (in the Get & Transform Data group) and choose the file.
- In the preview, set Delimiter to Tab.
- If names with accents look wrong, change File Origin (for example to 65001: Unicode (UTF-8)) until they display correctly. Microsoft doesn't document the encoding.
- Select Transform Data to open Power Query for the clean-up.
Step 2: Clean it up in Power Query#
Do the clean-up in Power Query rather than by hand. You can then refresh next month's file with the same steps.
Fix types#
- Set Customer Phone to Text so leading zeros and plus signs survive.
- Set Date & Time to Date/Time. If days and months come out swapped, use Change Type → Using Locale and pick the locale your export uses.
- Set Duration (minutes) and Price to numbers.
Microsoft doesn't document the time zone of the Date & Time column. Compare two or three rows against the Bookings calendar before you report by hour.
Add reporting columns#
From Date & Time, add Date, Start of Week, Day Name and Hour (all under Add Column → Date / Time). These drive most pivots.
Split the Custom Fields column#
All answers for a booking sit in one cell, and Microsoft doesn't document the format. Open a few rows to see how questions and answers are separated in your file. Then:
- Duplicate the query so the main table stays as it is.
- In the copy, keep Booking ID, Customer Email and Custom Fields.
- Use Split Column → By Delimiter with the separator between question/answer pairs, and choose Split into Rows.
- Split again on the separator between each question and its answer, this time into columns. Name the new columns Question and Answer, and trim spaces.
You now have a long table (one row per answer) that you can filter by question and pivot. This works best when questions offer fixed choices; see custom questions best practices.
Handle group services#
Microsoft says the Booking ID column helps identify rows that belong to the same group session. For group services, count rows to measure attendees and count distinct Booking ID values to measure sessions. In a PivotTable, Distinct Count is available when you tick Add this data to the Data Model while creating it.
Step 3: Build the pivots#
Load the cleaned table to a sheet and insert PivotTables from it. These are the ones worth building first.
| Question | Rows | Columns | Values | Filter |
|---|---|---|---|---|
| Which services are growing? | Start of Week | Service | Count of Booking ID | — |
| Is work spread evenly? | Staff | Service | Count of Booking ID | Start of Week |
| When do people want appointments? | Hour | Day Name | Count of Booking ID | Service |
| Which campaigns bring bookings? | Tracking data | Service | Count of Booking ID | Date range |
| What are customers asking about? | Answer | — | Count of Answer | Question = your question |
| How much booked time per person? | Staff | — | Sum of Duration (minutes) | Start of Week |
A few notes:
- Staff distribution. Bookings has no round-robin or caps, so this pivot is how you check fairness. The any-available-staff guide explains what to change if it's lopsided.
- Campaigns. The Tracking data column only fills when people book through a link with a
?RefID=campaign ID (letters, digits, underscore or hyphen). Users have reported both "Bad Request" pages and blank tracking columns, so test your links before a campaign goes out. - Lead time (how far ahead people book) can't be calculated from the export, because Microsoft doesn't list a "booking created" column. The Graph API has one; see below, and measuring how far ahead customers book for the Power Automate and Graph routes and how to chart it.
- Cancellations. Microsoft doesn't document whether cancelled bookings appear in the file or how Event Type marks them. Cancel a test booking and export again to see how your file behaves before you report on cancellations.
Step 4: Combine exports over time#
Because each export covers at most four months, a year of history means several files. Put them in one folder and let Power Query stack them. Use Data → Get Data → From File → From Folder, or paste this into a blank query (Home → Advanced Editor) and change the path:
let
Source = Folder.Files("C:\Reports\Bookings\SalesDemos"),
TsvFiles = Table.SelectRows(Source, each Text.Lower([Extension]) = ".tsv"),
// Encoding 65001 = UTF-8. Change it if accented characters look wrong.
Parsed = Table.AddColumn(TsvFiles, "Data", each Table.PromoteHeaders(
Csv.Document([Content], [Delimiter = "#(tab)", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]),
[PromoteAllScalars = true])),
Combined = Table.Combine(Parsed[Data]),
// Overlapping exports repeat bookings. Group sessions share a Booking ID,
// so de-duplicate on Booking ID plus customer email.
Deduplicated = Table.Distinct(Combined, {"Booking ID", "Customer Email"})
in
DeduplicatedThen apply the same type changes and columns from Step 2. Each month, drop the new export into the folder and select Refresh All.
If you report on several booking pages, keep each page's files in its own subfolder and add a column with the folder name, so you can filter by page.
Automating with the Graph API#
If exporting by hand becomes a chore, or you need fields the export lacks, the Microsoft Graph Bookings API reads appointments directly. The Bookings FAQ points here "for more customized and specific purposes". The calendar view endpoint returns appointments for a date range:
GET https://graph.microsoft.com/v1.0/solutions/bookingBusinesses/SalesDemos@contoso.com/calendarView?start=2026-06-01T00:00:00Z&end=2026-09-01T00:00:00Z- Permissions:
Bookings.Read.Allis the least-privileged permission, available as delegated or application. Application permissions apply tenant-wide, so involve your admin. - Extra fields: each appointment has
createdDateTime(so you can calculate lead time),selfServiceAppointmentId(set when the customer booked on the page rather than staff booking for them),customQuestionAnswersper customer, andserviceIdandstaffMemberIds. - Throttling: the Graph limit for Bookings is four concurrent requests per app and mailbox combination.
- Gaps: there are no Graph webhooks for Bookings, and a Microsoft Q&A question reports that the campaign tracking data isn't available through Graph. The API covers shared booking pages only, not personal pages.
A lighter option is Power Automate. The Microsoft Bookings connector (still in preview) triggers when an appointment is created, updated or cancelled, and can add a row to an Excel table as each booking happens. Only Bookings admins can create these flows, and there's a limit of five flows per booking mailbox. See Power Automate to a CRM for a worked flow.
Limits to know (as of September 2026)#
- No built-in dashboard beyond the Home page summary. See reports and dashboards.
- Four-month export windows (120 days per the FAQ), and only the Administrator role can export.
- No documented "created" date, attendance status or cancellation reason in the export.
- The Custom Fields column needs splitting before you can analyse answers.
- Nothing about visitors who looked but didn't book. The export only contains bookings.
Doing this with BookingsXP#
The export can't tell you how many people opened your booking page and left, or which channel they came from. If you embed your Bookings page with BookingsXP, its analytics show each step (saw the widget, picked a day, picked a time, started details, booked) by source and channel, plus the visits that found no open times at all. If you switch on Store bookings for the widget, the Pro and Business plans can download those bookings as CSV with source, medium, campaign and channel in their own columns and the time each booking was made, which the TSV lacks. It only covers widget bookings, not bookings made on the booking page Microsoft hosts or by staff in the Bookings calendar, so keep the TSV for totals. See pricing for which plan includes what. BookingsXP is independent and not affiliated with or endorsed by Microsoft.
Questions people also ask
Sources
- 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: Customize booking page (opens in a new tab) · learn.microsoft.com
- Microsoft Support: Import or export text txt or csv files 5250ac4c 663c 47ce 937b 339e391393ba (opens in a new tab) · support.microsoft.com
- Microsoft Learn: Bookingbusiness list calendarview (opens in a new tab) · learn.microsoft.com
- Microsoft Learn (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Throttling limits (opens in a new tab) · learn.microsoft.com
- Microsoft Learn (opens in a new tab) · learn.microsoft.com
- Microsoft Learn: Best practices shared bookings (opens in a new tab) · learn.microsoft.com
Related
- How to export Microsoft Bookings appointments to Excel
- Does Microsoft Bookings have a reports dashboard?
- Why is RefID tracking blank or Bad Request in Bookings?
- Microsoft Bookings to a CRM with Power Automate
- Any available staff assignment in Microsoft Bookings
- How far ahead do Microsoft Bookings customers book?