Recurring
"Every Tuesday at 7am, until July."
Block league nights, coaching slots and ladder rounds in one flow. Members can opt out of a single date without breaking the whole series. Cancellations are visible in the audit log so committee meetings have a paper trail.
Weather aware
Outdoor courts get rain alerts.
When the forecast turns, members with a booking on an affected outdoor court get an email with a one-click reschedule link. The forecast feed is Tomorrow.io and only fires if a club opts in to weather alerts.
Conflict-free
Double-bookings can't happen.
A unique database constraint rejects any overlapping booking on the same court before the row is written. The UI translates the rejection into a friendly "that slot was taken just now" message and refreshes the grid.
Check-in
No-show sweep on autopilot.
Members self check-in via a QR. Anyone who hasn't checked in 10 minutes after the slot starts gets flipped to no-show by the end-of-day sweep. Auto-suspension policy kicks in if someone hits the threshold.
Refunds
Refund the booking, not the relationship.
Full or partial refunds happen from the booking detail. Stripe handles the reverse; the booking lands in the audit log as booking.refund with the amount and the reason field.
Audit
Every change recorded.
Create, update, refund, cancel, no-show — all land in the audit log with a before/after diff. Owners filter by actor, action or entity. Soft-delete on every booking, so an accidental cancellation is recoverable.