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_pickerflow block
- Effects:
- Google Calendar event DELETED (slot is free again)
- Status flipped to CANCELLED,
cancelledAt+cancelledReasonstamped booking_cancelledevent 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_showevent 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