Paid Court Booking Cancellation and Refund Policy

MVP policy for cancelling, refunding, and disputing paid court bookings.

Paid Court Booking Cancellation and Refund Policy

This page documents the first supported post-payment flow for direct court bookings paid through Stripe.

MVP decisions

  • Users can self-cancel their own paid court bookings.
  • Location organisers and admins can also cancel paid bookings that they are allowed to manage.
  • Self-service cancellation is only available while the booking start time is still more than 24 hours away.
  • Eligible paid cancellations trigger an automatic full refund in Stripe.
  • The MVP refunds the full booking amount, including any Courtex application fee that was retained on the original payment.
  • Partial refunds are not a supported self-service path. If a partial refund is created manually in Stripe, Courtex records the refunded amount for admin visibility and follow-up.
  • Stripe disputes do not automatically cancel the booking. Courtex marks the payment as disputed for manual review.

Local state rules

  • Cancelling a booking without a linked payment only marks the booking as CANCELLED.
  • Cancelling a booking with a linked pending court-booking payment also moves the payment to cancelled.
  • Cancelling a booking with a linked paid court-booking payment before the cutoff:
  • creates a Stripe refund using the stored PaymentIntent,
  • records the Stripe refund ID locally,
  • marks the payment as refunded, and
  • marks the booking as CANCELLED.
  • Attempting to cancel a paid booking inside the 24-hour cutoff is blocked.
  • Disputed payments are blocked from self-service cancellation and require manual admin/support review.

Webhook scope in this MVP

  • checkout.session.completed: marks the court-booking payment as paid, stores the PaymentIntent ID, and confirms the booking.
  • charge.refunded: syncs Stripe refund data back onto the payment and cancels the booking when the refund is full.
  • charge.dispute.created, charge.dispute.updated, charge.dispute.closed: store dispute state on the payment for admin visibility.