Guide · Customers & data
Report on Microsoft Bookings in Excel (export and pivots)
Last updated 9 min read9 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 covers the export, a reliable way to import it, 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.
What the export contains#
The export is a tab-separated values (TSV) file of appointment-level data. Microsoft's reporting doc lists these columns:
| Column | Notes |
|---|---|
| Date & Time | When the appointment takes place |
| Customer Name, Customer Email, Customer Phone, Customer Address | From the booking form |
| Staff | Who the booking is assigned to |
| Service | Service name |
| Location | The service location |
| Duration (minutes) | Appointment length |
| Event Type | Microsoft doesn't document its values |
| Pricing Type, Price, Currency | From the service settings |
| Cc Attendees | Extra email recipients, which can be added in the Teams app |
| Signed Up Attendees Count | For group services |
| Text Notifications Enabled | Whether the customer can receive SMS |
| Custom Fields | "All the questions and answers related to a single booking are combined in this field" |
| Booking ID | Also identifies the bookings that belong to the same group session |
| Tracking data | The campaign ID (RefID) from the booking link, if one was used |
Older forum posts say custom question answers aren't exported. That's out of date; the Custom Fields column is in the current field list.
Who can export, and how much#
- Role: Microsoft's FAQ says "all Bookings staff assigned to the Administrator role" can download the file.
- Window: the reporting doc says each export shows four months of data, and "you can select different four month periods over the course of a year". The FAQ still says "all bookings made in the past 120 days". The two docs haven't been reconciled, so use four-month ranges and keep every file you download.
Step 1: Export the file#
- Open Bookings (select Bookings from the Microsoft 365 app launcher).
- On the Shared Bookings home page, select Export. The FAQ describes this as the Home tab.
- On Export recent data, choose the date range and select Export.
- Save the file with a clear name, for example
bookings-salesdemos-2026-05-to-2026-08.tsv.
Microsoft's doc suggests saving it with an .xls or .xlsx name. Renaming doesn't convert a text file into a workbook, and Excel may warn that the format and extension don't match. Keep the file as it is and import it as described below.
Step 2: Import it 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 the File Origin in the preview (for example to 65001: Unicode (UTF-8)) until they display correctly. Microsoft doesn't document the file's encoding.
- Select Transform Data to open Power Query for the clean-up steps. Or select Load if you only need the raw table.
Step 3: 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 4: 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; see RefID tracking not working. - 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.
- 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 5: 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 3. 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. Microsoft's 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: Microsoft's 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 built-in funnel reports show each step (saw the widget, picked a day, picked a time, started details, booked) broken down by source and channel. If you opt in to the optional data layer, BookingsXP keeps a copy of each booking made through the widget and lets you download it as a CSV. It only covers widget bookings, not bookings made on Microsoft's own page or by staff in the Bookings calendar. See analytics and pricing for which plans include 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