# Placeful 2.9.0

## Highlights

- **Refund as promo code** - Staff can deliver a booking refund as stored-value promo credit instead of a Stripe refund. The booking editor exposes a "Refund as" selector; approval mints a balance-bearing code (`source='refund'`) atomically with the settlement and emails it to the guest. The issued value consumes the booking's refundable budget, so cash and credit can never exceed what was actually paid — `refunded_amount` stays Stripe-only and reconciliation is unchanged.
- **Staff retry of an anonymous booking** - When staff re-book an expired or failed booking that has no account owner and choose "Pay online", the new booking stays anonymous instead of being attributed to the staff member. The guest can pay through the signed link, and the hold reminder, refund notices and any refund-as-promo-code credit reach the guest contact, not the staff account. Retrying a booking whose re-booking has already died returns that re-booking instead of failing, so the newer booking is the one to retry.
- **Safer refunds and billing** - Replayed refund-reversal events are tracked per refund leg, qualifying payment disputes suspend related refund promo credit, subscription billing reads the subscription reference from modern Stripe invoices, and booking revisions preserve captured payment amounts.
- **More reliable payout tracking** - If reading a failed-payout recovery chain fails after the current payout's payment transactions have been read successfully, normal payout attribution is saved and the recovery failure is still reported.


---
> Source: https://placeful-app.com/en/changelog/2.9.0
