Refunds
Last updated: October 27, 2026
Refunds
Refunds return money after a booking has been paid. The flow is two-step — request then approve — so refunds are never silent.
Who can refund
bookings.refund — granted to owner and admin by default. Members and managers cannot refund. Approving additionally requires being authenticated with that same permission — the signed link alone is not enough.
Requesting a refund
- Open the booking editor (
/booking/{booking}/-editor). - Click Refund, choose the amount and enter a reason.
- The booking moves to
RefundPending; theFinancialrow recordsrefund_amount,refund_reason,refund_requested_by/refund_requested_atand statuspending_refund. - The company owner is emailed a
BookingRefundRequestedNotificationcontaining the signed approval link. Cancelling a paid booking can also create a refund request and notifies the booker (BookingCancellationRefundRequestedNotification).
Approving a refund
The approval link is signed (signed middleware):
/bookings/{booking}/refunds/{financial}/approve?signature=...
- GET shows a confirmation page with reason and amounts; POST approves.
ApproveBookingRefundissues the Stripe refund on the connected account (withrefund_application_feeso the platform fee is returned proportionally), moves the booking throughRefundingtoRefunded, recordsrefunded_amount/refunded_atand notifies the booker (BookingRefundApprovedNotification).- A Stripe failure sets
RefundFailedwithrefund_failed_at+refund_failure_reasonand firesBookingRefundFailed— staff can retry manually. - Partial refunds are supported:
refund_amountmay be below the captured total;refunded_amounttracks what was actually returned.
Late payments
A Stripe payment landing after the booking already expired or was cancelled is written to the late_payments ledger and the owner is notified (LatePaymentReceivedNotification). BOOKING_AUTO_REFUND_LATE_PAYMENTS (default true) auto-refunds it — set it to false to keep the money and reconcile manually. This is a real-money side effect.