Skip to Content
📚 Documentation is in active development — pages marked TODO will fill out over the next few weeks.
BookingsCancel / no-show / complete

Cancel / no-show / complete

A booking enters at CONFIRMED and can move to one of three terminal states.

CANCELLED

The slot was freed up before the start time.

  • Triggers:
    • Operator clicks “Cancel” in the dashboard
    • Customer taps the self-service cancel link from the confirmation email / page
    • Customer cancels via WhatsApp through the cancel_booking_picker flow block
  • Effects:
    • Google Calendar event DELETED (slot is free again)
    • Status flipped to CANCELLED, cancelledAt + cancelledReason stamped
    • booking_cancelled event fires → drips stop, reminder flows abort

NO_SHOW

The start time passed but the customer didn’t show up.

  • Triggers:
    • Operator clicks “Mark no-show” in the dashboard
    • Planned: auto-flip via a cron after T+grace_period if status is still CONFIRMED
  • Effects:
    • Status flipped to NO_SHOW
    • Google event STAYS (it’s a historical record of “this person was supposed to come and didn’t”)
    • booking_no_show event fires → re-engagement flows / drips can target

COMPLETED

The service was performed.

  • Triggers:
    • Operator clicks “Mark completed”
    • Planned: auto-flip after T+duration if not flipped to no-show
  • Effects:
    • Status flipped to COMPLETED
    • Used in reports (revenue, hours utilised, etc.)

Idempotency

BookingService.cancel is idempotent — re-cancelling an already-cancelled booking returns the same shape with no side-effects. Useful when the same cancel link is clicked twice or the WhatsApp button is tapped repeatedly.

markNoShow / markCompleted reject transitions FROM a terminal state (you can’t “un-cancel” a booking; create a new one if the customer wants to rebook).

Last updated on