Skip to main content

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

  1. Open the booking editor (/booking/{booking}/-editor).
  2. Click Refund, choose the amount and enter a reason.
  3. The booking moves to RefundPending; the Financial row records refund_amount, refund_reason, refund_requested_by / refund_requested_at and status pending_refund.
  4. The company owner is emailed a BookingRefundRequestedNotification containing 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.
  • ApproveBookingRefund issues the Stripe refund on the connected account (with refund_application_fee so the platform fee is returned proportionally), moves the booking through Refunding to Refunded, records refunded_amount/refunded_at and notifies the booker (BookingRefundApprovedNotification).
  • A Stripe failure sets RefundFailed with refund_failed_at + refund_failure_reason and fires BookingRefundFailed — staff can retry manually.
  • Partial refunds are supported: refund_amount may be below the captured total; refunded_amount tracks 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.

Cookies and privacy

We use essential cookies to keep the application secure and working correctly. Optional cookies will only be used with your consent.

Read the privacy policy Read the cookie policy

Essential

Essential cookies are required for the website to function and cannot be switched off.

Always on

Functional

Functional cookies enable enhanced functionality and personalisation, such as remembering your language and preferences.

Analytics

Analytics cookies help us understand how visitors interact with the application so we can improve it.

Marketing

Marketing cookies are used to track visitors across websites to display relevant and engaging advertisements.