Keep the booking and the payment distinct
A booking records what the customer intends to reserve. A payment records money-related activity with the payment provider. Link the two with stable references, but do not assume every booking is paid or that every successful payment means a reservation can be confirmed immediately.
Define the states in language staff can understand: awaiting payment, awaiting confirmation, confirmed, cancelled or requiring review. The exact set depends on the business. Avoid using “complete” for several different events that have different consequences.
Use provider confirmation, not only a browser redirect
A customer may close a tab, lose their connection or return to the site later. The server needs an authoritative way to establish payment status. Payment providers commonly support notifications to the application; the implementation must verify their authenticity before changing records.
For Stripe, the official webhook documentation describes signature verification, repeated events and delivery-order limitations. These behaviours mean a system must handle a repeated notification safely and must not assume notifications arrive in a convenient sequence.
Decide when capacity is held and released
If two customers want the last available place, the system needs a consistent way to decide who can reserve it. Merely showing “one available” in both browsers does not protect capacity. The reservation operation must enforce the rule where the records are changed.
If unpaid reservations hold capacity, agree when they expire. Then decide what happens if payment confirmation arrives after the hold has expired. Staff may need a review case rather than an automatic booking that exceeds capacity. This is a business policy that software must implement, not a detail to leave until launch.
| Scenario | Behaviour to agree |
|---|---|
| Customer pays but closes the browser | The payment can still be reconciled to the reservation. |
| The same notification arrives twice | No second booking, charge or duplicate fulfilment action. |
| Confirmation arrives after a hold expires | A defined review or recovery route protects capacity. |
| Email delivery fails | The booking record remains valid and the message can be retried. |
| Staff change or cancel the reservation | Booking, payment and communication states remain understandable. |
| An external service is unavailable | Incomplete work is recorded and somebody can see what needs attention. |
Background work needs an owner too
Sending an email or preparing a report need not delay a customer-facing request once the essential booking work is safely recorded. Background processing can keep the journey responsive, but only if failures are visible and retries do not repeat irreversible actions.
A queue is a place for work to be processed later, not a guarantee that it finished. Ask how the team sees failed jobs and how the system prevents a retry from sending conflicting instructions. Monitor the outcome the business cares about, such as an outstanding confirmation, as well as the technical process.
Give staff a reconciliation route
There should be a way to find a reservation using its reference, inspect the related payment and understand the action history. Staff need enough information to resolve an exception without guessing whether to charge again or recreate a booking.
Agree who handles unresolved cases and what customers are told while a check is under way. Record the result so another colleague can see what happened. Do not expose secret keys, full payment credentials or unnecessary customer details in diagnostic views.
Use this checklist before choosing the build
Ask an existing booking supplier to demonstrate these cases before commissioning a replacement. If its behaviour meets your requirements, you may only need a better website around it. The booking build-versus-buy guide helps compare the options; Digizu’s booking development page explains how to frame a new project.
Discuss a booking reliability problem
Describe the sequence that fails and the booking software involved. Use anonymised examples; never send payment credentials through an enquiry form.