Booking lifecycle & statuses
A booking moves through a sequence of statuses, not a single “is it done yet” flag. Each status answers a different question — is it captured?, is the supplier holding the reservation?, is the ticket ready? — and the legal next steps depend on the current status.Statuses
Transitions
FromUNCAPTURED (after Create Booking), one of the following happens:
- Remains
UNCAPTUREDuntil captured (no inventory or price lock) - →
PENDINGwhen capture succeeds - →
FAILEDwhen capture is attempted but rejected by Headout or the supplier - →
CAPTURE_TIMEDOUTwhen no capture is attempted within 1 hour
PENDING:
- →
COMPLETEDwhen the ticket is generated (instant forhasInstantConfirmation: true, usually within ~30 min otherwise, p99 up to 1 day before the experience) - →
CANCELLEDif the booking is cancelled before fulfilment
COMPLETED:
- →
CANCELLEDif the booking is cancelled after the ticket has been generated (e.g. customer-initiated cancellation within policy, or a venue closure)
CANCELLED:
- Terminal for a genuine cancellation.
- →
PENDING(thenCOMPLETED) only during a reschedule, which internally cancels and re-books the same booking. See Cancellation & reschedule lifecycle.
FAILED or CAPTURE_TIMEDOUT: no further transitions. Create a new booking if the customer still wants to proceed.
Key notes
PENDINGis confirmed. It means payment is captured and the supplier is holding the reservation. Treat it as a confirmed booking in your UI; ticket generation is a separate, often-delayed step.COMPLETEDis not the immediate next state afterUNCAPTURED. Capture moves a booking toPENDINGfirst;COMPLETEDfollows when the ticket is generated.PENDINGandCOMPLETEDcan still move toCANCELLED— including Headout-initiated cancellations like venue closures.CANCELLEDis not always terminal. A reschedule round-trips the bookingCANCELLED → PENDING → COMPLETED, so aCANCELLEDseen while a reschedule is in flight may be transient. Don’t hard-codeCANCELLEDas a final state, especially when polling. See Cancellation & reschedule lifecycle.UNCAPTUREDis never sent via webhook. Other status transitions are.
Ticket generation & hasInstantConfirmation
Each product includes a hasInstantConfirmation flag:
Typical timelines:
- Instant confirmation: < 1 minute (avg)
- Delayed generation: ~30 minutes on average, p99 up to 1 day before experience for example, some venues like Louvre release tickets only 1 day before the experience date
- Booking should still be shown as confirmed as soon as status reaches
PENDINGor beyond - Ticket generation is asynchronous
- Voucher updates automatically when the ticket is ready