Bookings Deposit Collection with Stripe
When a Microsoft Bookings appointment for a deposit-required service is created, the flow generates a Stripe payment link for the deposit, emails it to the customer with a deadline, holds the slot until paid, and releases it (cancelling the booking) if the deposit isn't received in time. Reduces no-shows and secures revenue upfront.
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 flow secures revenue upfront for Microsoft Bookings. When an appointment for a deposit-required service is created, it creates a Stripe Checkout Session for the deposit, emails the customer a secure payment link with a deadline, holds the slot for the configured window, then re-checks payment: if paid it confirms; if unpaid it cancels the appointment via Microsoft Graph (releasing the slot) and notifies the customer.
Why it matters: Deposits dramatically reduce no-shows for high-value services. Automating the pay-link, the hold, and the release removes manual chasing and protects the schedule.
Build: single cloud flow, ships Off, Flow Checker 0 errors / 0 warnings.
Use Case
A business offering deposit-required Bookings services (consultations, premium sessions) wants deposits collected automatically with a hold-and-release policy, with zero manual follow-up. Finance secures revenue upfront; Operations keeps the calendar clean of unpaid holds.
Flow Architecture
When_a_Bookings_Appointment_Is_Created
Bookings CreateAppointment (OpenApiConnectionNotification)Fires on a new Bookings appointment; the Notification trigger delivers the full appointment (customer, service, times) in its body - no read-back needed.
Initialize_varDepositService
Initialize Variable (String)The service name that requires a deposit (from env var).
Initialize_varDeadlineHours
Initialize Variable (Integer)Hours allowed to pay, parsed via int().
Initialize_varDeadlineTimestamp
Initialize Variable (String)Human-readable UTC deadline (now + hours) for the email.
Initialize_varStripeBase
Initialize Variable (String)Stripe REST base URL (already includes /v1).
Initialize_varGraphBase
Initialize Variable (String)Microsoft Graph base endpoint for the cancel call.
Check_If_Service_Requires_Deposit
Condition (If)ServiceName == varDepositService. Only deposit services run the collection branch.
Create_Stripe_Checkout_Session
HTTP POST (Stripe)Creates a hosted Checkout Session for the fixed deposit price; returns url and id.
Email_Customer_Deposit_Link
Outlook SendEmailV2Emails the customer the Stripe link and the payment deadline.
Wait_For_Deposit_Deadline
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_BookingsBusinessId | String | contoso@contoso.onmicrosoft.com | SMTP/business id of the Bookings business (trigger SMTPAddress and Graph cancel path). |
| flowlibs_DepositRequiredServiceName | String | Consultation (Deposit Required) | Exact Bookings ServiceName that triggers deposit collection. |
| flowlibs_DepositDeadlineHours | String | 24 | Hours to pay before the slot is released. |
| flowlibs_StripeApiBase | String | https://api.stripe.com/v1 | Stripe REST base URL. |
| flowlibs_StripeApiKey | String | sk_live_REPLACE... | Stripe secret key (Bearer token). |
| flowlibs_StripeDepositPriceId | String | price_REPLACE... | Stripe Price ID for the fixed deposit amount. |
| flowlibs_DepositSuccessUrl | String | SharePoint page URL | Stripe success_url after payment. |
| flowlibs_DepositCancelUrl | String | SharePoint page URL | Stripe cancel_url if abandoned. |
| flowlibs_GraphApiEndpoint | String | https://graph.microsoft.com/v1.0 |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Bookings | shared_microsoftbookings | CreateAppointment |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
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.
- Multiple deposit services
- Swap the single-name gate for a comma-list env var and contains(split(...),','), ServiceName).
- Dynamic deposit amount
- Replace the fixed Price ID with price_data (amount as a % of the service price) in the Checkout Session body.
- Apply deposit to the total
- Store the Stripe payment_intent id (e.g. in Dataverse) and deduct it from the final invoice.
- Auto-refund on timely cancellation
- Add a Stripe POST /v1/refunds branch keyed off a cancellation trigger.
- Real-time confirmation
- Instead of the Delay + re-check, point a Stripe checkout.session.completed webhook at a companion Request-triggered flow to confirm the moment payment lands.
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.01Deposit-service gate
Only deposit-required services run the collection branch.
EXPR.02Deadline timestamp
Computes the payment deadline shown in the email.
EXPR.03Stripe session endpoint
Builds the Stripe Checkout Sessions URL.
EXPR.04Stripe form body (line item)
Form-encoded body for the Checkout Session.
EXPR.05Paid check
Determines whether the deposit was paid.
EXPR.06Graph cancel URI
Endpoint to cancel the appointment via Microsoft Graph.
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.