Checkout reservations: hold a place while the customer pays
When checkout starts, the Booking Engine writes a time-boxed hold (15 minutes by default, configurable) that counts against capacity while the customer pays. Payment converts the hold into a confirmed booking atomically; abandonment lets it lapse, and expired holds stop counting the moment they expire. No overselling, no places held hostage.
What does the reservation capability do?
It closes the gap between choosing a place and paying for it, in both directions. Without holds, two customers can buy the last place; with permanent holds, abandoned baskets block real capacity. The reservation flow does neither.
- Time-boxed holds. Starting checkout writes a reservation with an expiry timestamp. The window defaults to 15 minutes and is a configuration value per deployment.
- Holds count, expired holds do not. Availability is confirmed bookings plus unexpired holds. A lapsed hold stops counting immediately, because every check compares the expiry timestamp with the current time. Correctness never depends on a background sweep.
- Guarded confirmation. After payment, the confirm step promotes the hold to a booking and increments the booked count in one transaction. An expired hold is refused with an explicit outcome rather than silently oversold.
- Idempotent by design. A repeat reserve call returns the customer’s existing hold. A replayed confirmation (payment webhooks retry) returns success without double-counting.
- Serialised per occurrence. The capacity check and the hold write happen under a per-occurrence lock, so two customers cannot race for the last place. When the session is genuinely full, the same transaction offers a waitlist position instead.
How it behaves at the edges
The edge cases are where booking systems usually leak, so they are worth stating plainly. A customer completing 3-D Secure just after their hold lapses gets a definite reservation-expired response, not a phantom booking. A double-tapped book button returns one hold, not two. And a stalled background job blocks nothing, because release is a property of how availability is read.
The concurrency design behind this, and how it holds up during on-sale spikes, is covered in capacity and overbooking and in our guide on handling high-demand bookings without overselling.
Why it matters
Overselling costs refunds, apologies, and trust; phantom fullness costs silent revenue. Both failure modes disappear when holds are explicit records with expiry timestamps and confirmation is a guarded transition. The companion guide below sets out the full design, including the five demonstration tests to put to any booking vendor.
Frequently asked questions
How long does a checkout reservation hold a place?
What happens if a customer abandons checkout?
Can a payment that completes late oversell a session?
More Booking Engine capabilities
Waitlists: positioned queues that never race
How the Booking Engine handles full sessions: atomic waitlist joins with explicit queue positions, configurable queue sizes, and live waiting counts.
Capacity and overbooking: hard limits, deliberate exceptions
How the Booking Engine models capacity: per-occurrence limits, live booked and waiting counters, sub-capacities for trials and make-ups, and an explicit overbooking allowance.
Term scheduling: terms, site variations, and skip dates
How the Booking Engine schedules term-based programmes: named terms, per-site term variations, skip dates for closures, and occurrences generated per date.
See this working in a demo
Book a consultation and we will demonstrate this capability on the Booking Engine accelerator, against your own scenarios.
Book a demo