Bookings Appointment Lifecycle Automation
When a Microsoft Bookings appointment is created, the flow sends a branded confirmation with calendar attachment, schedules SMS/email reminders, creates a Dataverse customer-visit record, and on completion triggers a follow-up survey. Cancellations free the slot and notify staff in Teams. Wraps Bookings with the surrounding business workflow it lacks.
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 wraps Microsoft Bookings with the surrounding business workflow it doesn't provide. Bookings is excellent at slots and calendars but thin on CRM logging, branded communications, and post-visit follow-up. This solution turns every booking into a tracked customer interaction across three cloud flows and one Dataverse table. When an appointment is booked, the flow logs a Dataverse customer-visit record, emails a branded confirmation with an .ics calendar attachment, and posts a card to a staff Teams channel. A daily flow sends day-before reminders and post-visit feedback surveys. When an appointment is cancelled, the visit record is closed, staff are notified that the slot is free, and the customer gets a cancellation email. Why it matters: it adds the lifecycle automation - CRM record, branded comms, reminders, surveys, cancellation handling - that turns a raw Bookings appointment into a governed, tracked customer journey, entirely on first-party Microsoft connectors.
Use Case
A services team (clinic, advisory practice, salon, support desk) takes appointments through Microsoft Bookings and wants: branded confirmations with a calendar file, a CRM record per visit, automatic day-before reminders, an automatic post-visit survey, and staff notified in Teams when an appointment is cancelled so the freed slot can be re-filled.
Flow Architecture
When a Booking Is Created
Bookings CreateAppointment (push)Flow 1 trigger. Delivers the full appointment in the trigger body the moment an appointment is booked.
Initialize Correlation Id / Brand Name / Newline
Initialize VariableTrace id stamped on the record and notifications, brand name, and the CRLF used to assemble the .ics attachment.
Compose Visit Row
ComposeShapes the visit row as one bound object.
Create Visit Record
Dataverse CreateRecordLogs the booking to flowlibs_customervisit.
Compose ICS Calendar
ComposeBuilds a standards-compliant iCalendar event.
Send Confirmation Email
Outlook SendEmailV2Branded confirmation + appointment.ics attachment.
Notify Staff In Teams
Teams PostMessageToConversationPosts a New booking card to the staff channel.
When a Booking Is Cancelled
Bookings CancelAppointment (push)Flow 2 trigger. Lists the visit by appointment id, marks it Cancelled, notifies staff the slot is free, and emails the customer; warns staff if no matching record is found.
Daily Check
Recurrence (1/day)Flow 3 trigger. Runs the reminder + survey sweep over the Dataverse table.
List Upcoming For Reminder + Send Reminder
Dataverse ListRecords + Outlook SendEmailV2Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_BookingsBusinessId | String | contoso@your-tenant.onmicrosoft.com | Bookings business SMTP/id (trigger SMTPAddress). |
| flowlibs_BrandName | String | Contoso Services | Brand/company name in emails and Teams cards. |
| flowlibs_StaffNotifyEmail | String | alerts@yourcompany.com | Fallback recipient when customer email is missing. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Staff Teams team (group) id. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Staff Teams channel id. |
| flowlibs_VisitTable | String | flowlibs_customervisits | Entity set name used by ListRecords. |
| flowlibs_ReminderLeadHours | String | 24 | Hours before start that the reminder window opens. |
| flowlibs_SurveyUrl | String | (configure) | Post-visit feedback survey URL. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Bookings | shared_microsoftbookings | CreateAppointment CancelAppointment |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord ListRecords UpdateRecord |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
| Microsoft Teams |
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.
- SMS reminders
- Flow 3 sends email reminders via Outlook. Swap (or add) a Twilio SendMessage step for SMS reminders using the customer phone already stored on the visit record.
- No-show handling
- Extend Flow 3 with a third pass: visits past their end time still in Booked with no completion can be flagged No-Show and escalated to staff in Teams.
- Survey engine
- Point flowlibs_SurveyUrl at a Microsoft Forms / Customer Voice survey; route detractors to a follow-up flow.
- Reminder timing
- Change flowlibs_ReminderLeadHours (default 24) to widen/narrow the reminder window without touching flow logic.
- Calendar event vs attachment
- The confirmation ships an .ics attachment; to instead place the event on a shared Outlook calendar, add a V4CalendarPostItem action.
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.01iCalendar timestamp (UTC basic format)
Produces e.g. 20260619T103000Z for the .ics event.
EXPR.02Reminder window gate
Sends a reminder only when the start falls inside the lead-hours window.
EXPR.03Completion gate
True once the appointment end time has passed.
EXPR.04Lookup by business key
Finds the visit record by the Bookings appointment id.
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.