Payments
Cancellation & No-Show Fees
Last updated 19 May 2026
Cancellation & No-Show Fees
When a client cancels late or no-shows, you can charge a fee against the card saved for No-show Card Protection. The fee comes from the policy snapshot saved when the booking was made, so later rule edits do not change that booking's agreed amount. Charging is always operator-initiated — you pick "with fee" or "without fee" when marking the booking.
Where to find it — Web/Mobile: Booking detail → cancellation/no-show fee banner. Triggered when you Cancel or Mark No-Show via the Booking Actions menu.
TL;DR
- Fee amount = the booking-time No-show Card Protection snapshot; older bookings may use a legacy active-rule fallback.
- Operator-initiated only — you choose "with fee" when cancelling or no-showing.
- Requires an eligible saved card with consent, a protection snapshot or legacy fallback rule, and Stripe Connect.
- Full audit trail; idempotent against duplicate charges.
What the customer must have
Three requirements:
- Card on file with status
active— see Saved Payment Methods for how a customer adds one. - Consent to off-session charging (
consentedstatus). - Card not expired at time of charge.
If any one isn't true, the fee can't be charged. The cancellation or no-show itself still happens — only the fee charge is skipped, with an explanation in the banner.
What your venue must have
- A fee source — normally the No-show Card Protection snapshot saved on the booking. Older bookings can fall back to the current active rule assigned to the service.
- Stripe Connect active on the venue.
The fee amount is agreed at booking time for No-show Card Protection. If the protection rule was "50% of service price", the saved snapshot keeps that amount for the booking even if you edit the rule later. There is no separate ad-hoc fee amount at charge time.
How fees are triggered
Late cancellation fee
- Open the booking.
- Tap Cancel booking.
- Choose Cancel with fee (vs Cancel only).
- Confirm.
- The booking status changes to cancelled, then the fee is charged via the booking detail banner.
No-show fee
- Open the booking after it's passed.
- Tap Mark as no-show.
- Choose Mark with fee (vs Mark only).
- Confirm.
- The booking status changes to no-show, then the fee is charged.
If you initially Mark without fee, the banner still appears on the cancelled/no-show booking so you can charge later. Choosing "without fee" doesn't lock you out.
The booking detail banner
When a booking is in cancelled or no_show status AND the customer has an eligible card on file AND the saved protection policy or legacy fallback produces a non-zero fee, a banner appears in the booking detail:
| State | Visual | Shows |
|---|---|---|
| Active | Muted border + CreditCard icon |
"Charge late cancellation fee" + "$45 to Visa ····4242" + Charge $45 button |
| Pending | Spinner | "Charging Visa ····4242…" |
| Success | Emerald border + CheckCircle2 |
"Cancellation fee charged · $45 · Visa ····4242 · {date}" |
| Failed | Destructive border + XCircle |
"Charge failed: card declined" + Retry button |
The banner persists on revisits — even after the charge succeeds, the green success record stays so you can see the history.
What about the cancellation notice window?
Two separate settings can interact here:
- Booking policy
cancellationNoticeHours(default 24) — defines what counts as "late" for the customer-facing cancellation flow. - Deposit rule
cancellationWindowHours— defines deposit refund behaviour.
There's overlap. The fee-charging action is operator-discretion, not auto-triggered by either window — you're always the one who picks "with fee" or "without fee" when cancelling or marking no-show.
If you want to be consistent ("always charge for cancellations less than 24h before"), align your deposit rule's cancellationWindowHours with your booking policy's cancellationNoticeHours and apply your discretion consistently.
Idempotency
The charge uses an idempotency key of {event_type}_{booking_id} — so retrying a failed charge from the banner can't double-charge the customer. The same booking can't have a no-show fee charged twice.
If a charge succeeds and then you accidentally tap the button again, Stripe returns the original successful charge.
Audit trail
Every charge attempt writes to paymentChargeAudit:
- Attempt type:
no_show_feeorlate_cancellation_fee - Status: pending → succeeded / failed / requires_action
- Amount, currency, Stripe payment method ID
- Triggered by (your user ID)
- Timestamps
Visible in the booking detail history section, labelled "No-show fee" or "Late cancellation fee" as appropriate.
Role gating
Owner-only and Manager-only — Stylists can't charge fees. The mutation is venueOwnerProcedure server-side.
What customers receive
The standard receipt pipeline runs after a successful charge — your customer gets an emailed receipt for the fee just like any other charge. There's no separate "fee charged" template; receipts use the standard branded template.
If the customer disputes
If a customer disputes the fee via their bank:
- Card-on-file status flips to Disputed.
- Further charging against that card is paused until resolution.
- Standard Stripe chargeback flow applies — resolve via Stripe Dashboard.
Disputes won't reverse automatically; you decide whether to accept the chargeback or fight it with evidence.
Refund flow
The fee charge can be refunded the standard way via Stripe Dashboard (or via the receipt's refund link). OpenChair doesn't auto-refund fees; you handle the refund decision case-by-case.
Tier
All plans, requires:
- Stripe Connect active
- No-show Card Protection snapshot, or an eligible legacy active rule fallback
- Customer card on file
No PRO subscription requirement.
Common mistakes
| Problem | What to check |
|---|---|
| Banner doesn't appear after marking cancelled/no-show | Confirm the customer has an eligible saved card and that the booking has a No-show Card Protection snapshot or eligible legacy fallback rule. |
| "No fee source found" error | The booking was created before protection snapshots and no eligible fallback rule is active for the service. Create a new protection rule for future bookings. |
| "Customer has no saved card on file" | Send the customer a card-update link before processing the fee. Or accept the cancellation without fee. |
| Charge failed with "card declined" | Card-on-file is active but the bank declined. Try Retry once; if it fails again, the card may need updating. |
| Customer says they cancelled within the window | The fee is operator-discretion — you can choose to refund via Stripe Dashboard if you agree. The banner doesn't enforce the window. |
| Want to charge a custom fee amount | Not supported — the fee is the booking-time protection snapshot, with legacy fallback only for older bookings. |
FAQ
How is the fee amount calculated?
For No-show Card Protection, it comes from the policy snapshot saved when the booking was made. Older bookings created before snapshots can fall back to the current active rule assigned to the service.
Can fees be charged automatically?
Not today — fee charging is always operator-initiated. When you mark a booking as cancelled or no-show, you choose 'with fee' or 'without fee'. The fee is then charged against the customer's saved card via the booking detail banner.
What's required for the fee to go through?
Stripe Connect must be active, the booking must have a No-show Card Protection snapshot or eligible legacy fallback rule, and the customer must have an eligible saved card with off-session consent.
What if the customer disputes the fee?
Standard Stripe chargeback flow. The card-on-file status flips to 'Disputed' and further charging is paused for that customer until you resolve the dispute via Stripe Dashboard.
Does the customer get notified before the fee is charged?
The system doesn't auto-send a heads-up. If your cancellation/no-show policy is clearly communicated at booking time (deposit agreement, terms acceptance), the customer is technically on notice. Consider sending a personal SMS via the inbox before charging a significant fee as good practice.
Can I charge a different fee for different services?
Not directly — fees use the booking-time No-show Card Protection snapshot. If your protection rules vary by service, the saved snapshot follows the rule that applied when the customer booked.