# Refunds

# 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.


---
> Source: https://placeful-app.com/en/docs/bookings/refunds
