Bookings No-Show and Cancellation Tracker
After each Microsoft Bookings appointment, the flow records attended/no-show/cancelled status in Dataverse, flags repeat no-show customers, and on a cancellation offers the freed slot to a waitlist and notifies staff. A weekly digest reports no-show rate by service and staff. Reduces lost revenue from no-shows.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This solution reduces lost revenue from no-shows and late cancellations in Microsoft Bookings. It records every appointment outcome (No-Show / Cancelled) in a Dataverse log, flags repeat-offender customers, refills cancelled slots by notifying staff/waitlist in Teams, and posts a weekly no-show-rate digest.
Because the Microsoft Bookings connector is trigger-only (it exposes appointment webhooks plus ListBookingsBusinessUserAsAdmin, but no read-appointments action), appointment detail is read from Microsoft Graph (/solutions/bookingBusinesses/{id}/calendarView and the per-appointment resource from the webhook). All Dataverse and Teams work uses the standard connectors.
Built as 3 cloud flows + 1 Dataverse table in one solution. All flows ship Off - going live requires only connection authorization + env-var configuration.
Solution details: unique name FlowLibsBookingsNoShowTracker; Dataverse table flowlibs_visit (entity set flowlibs_visits, "Visit Status"); 3 flows (Cancellation Tracker, No-Show Detector, Weekly Digest); 1 table + 11 environment variables + 3 flows + 3 connection references. Cross-flow trace: each flow mints a guid() correlation id (varCorrelationId) and stamps it on the Dataverse rows / digest it writes.
Dataverse table flowlibs_visit (Visit Status): flowlibs_name (Text, primary, "Customer - Service (Outcome)"); flowlibs_appointmentid (Text, Graph appointment id - idempotency key); flowlibs_customername (Text); flowlibs_customeremail (Text, match key for repeat detection); flowlibs_servicename (Text); flowlibs_staffname (Text, first staff member id); flowlibs_status (Text, No-Show / Cancelled); flowlibs_isrepeatnoshow (Text, Yes / No); flowlibs_appointmentdate (DateTime, appointment start); flowlibs_noshowcount (Whole number, running count at log time); flowlibs_correlationid (Text, cross-flow trace id).
Use Case
A services business wants every missed/cancelled appointment tracked, chronic no-show customers flagged, freed slots refilled, and a weekly no-show-rate report - without manual data entry.
Flow Architecture
When_An_Appointment_Is_Cancelled (Flow 1)
Bookings CancelAppointment (webhook)Fires on cancellation; delivers a change-notification envelope (webhook.resource), not the appointment fields.
Get_Cancelled_Appointment (Flow 1)
HTTP -> Graph (AAD OAuth)GET the appointment by the webhook's resource path.
Record_Cancellation (Flow 1)
Dataverse CreateRecordWrite a Cancelled row after counting prior outcomes and setting the repeat flag.
Post_Waitlist_And_Staff_Notification (Flow 1)
Teams PostMessageToConversationOffer the freed slot to the waitlist + flag repeat offenders.
Recurrence - Daily (Flow 2)
Recurrence (Daily)Scans recently-ended appointments to log no-shows idempotently.
List_Booking_Businesses (Flow 2)
Bookings ListBookingsBusinessUserAsAdminConnector-first: validate access to the booking business.
Get_Appointments_From_Graph (Flow 2)
HTTP -> Graph (AAD OAuth)calendarView of appointments in the lookback window.
Apply_to_each_Appointment (Flow 2)
Foreach (sequential)Idempotency-check each ended appointment, record No-Show rows, and alert repeat offenders in Teams.
Recurrence - Weekly (Flow 3)
Recurrence (Weekly)Digest cadence.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_BookingsBusinessId | String | <configure> | Bookings business - webhook SMTPAddress and Graph bookingBusinesses/{id}. |
| flowlibs_GraphBaseUrl | String | https://graph.microsoft.com | Microsoft Graph root. |
| flowlibs_GraphTenantId | String | <your-tenant-id> | AAD OAuth tenant for Graph HTTP. |
| flowlibs_GraphClientId | String | <configure> | AAD OAuth client id. |
| flowlibs_GraphClientSecret | String | <configure> | AAD OAuth client secret. |
| flowlibs_VisitStatusTable | String | flowlibs_visits | Visit-log entity set name (documentation/portability). |
| flowlibs_RepeatNoShowLimit | String | 2 | No-shows/cancellations before a customer is flagged repeat. |
| flowlibs_NoShowLookbackDays | String | 1 | Daily scan window (days). |
| flowlibs_DigestLookbackDays | String | 7 | Weekly digest window (days). |
| flowlibs_TeamsGroupId |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Bookings | shared_microsoftbookings | CancelAppointment ListBookingsBusinessUserAsAdmin |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord ListRecords |
| Microsoft Teams | shared_teams | PostMessageToConversation |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Attendance source
- Bookings exposes no attendance flag, so the No-Show Detector logs ended appointments as No-Show candidates. Add a staff confirmation step (e.g. a Teams Approval, or read a custom "attended" flag) before writing the row to record true attended/no-show.
- Deposit policy
- Branch on flowlibs_isrepeatnoshow = Yes to require a deposit for repeat offenders.
- SMS reminders
- Add Twilio reminders ahead of appointments to cut no-shows.
- Per-staff reporting
- Group the digest by flowlibs_staffname; resolve staff display names via Graph .../staffMembers.
- Tune thresholds
- RepeatNoShowLimit, NoShowLookbackDays, DigestLookbackDays are all env vars.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Repeat gate
Flags a customer as a repeat offender.
EXPR.02No-show rate %
Computes the no-show rate for the digest.
EXPR.03Scan window start
Lower bound of the daily scan window.
EXPR.04Appointment from webhook
Builds the Graph URL from the change-notification resource.
EXPR.05Customer email (defensive)
Resolves the customer email from multiple possible shapes.
EXPR.06Idempotency filter
OData filter to detect an already-logged appointment.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.