Held for 10 Minutes: How Airflow Stops Double Bookings at Checkout
Two guests, one set of dates, the same thirty seconds
Here’s the scenario that keeps direct-booking hosts up at night. Two different guests land on your property page at almost the same moment, both want the same week, and both hit “book” within seconds of each other. One of them is partway through entering their card details. What happens to the other?
If your booking flow only locks the dates once a payment fully clears, you have a problem. There’s a window — short, but real — where both guests look at an open calendar, both pass the availability check, and both pay. Now you’ve sold the same week twice, and one of those guests is about to get an apology email you really don’t want to write.
Airflow closes that window. The moment a guest starts paying, their dates are held for about ten minutes so a second guest can’t grab the same slot. If the first guest completes the payment, the booking is confirmed and the dates lock permanently. If they wander off and never finish, the hold quietly expires and the dates go back on the market. And underneath all of that, a database-level guard makes a genuine double-book impossible even if two payments somehow race each other to the line.
Here’s how the whole thing works.
The hold: dates come off the market the instant checkout begins
When a guest fills in your booking form and heads to payment, Airflow doesn’t wait to see whether the money arrives before reacting. It creates the booking immediately in a pending state and stamps it with a short expiry — roughly ten minutes from now — for any booking that’s being paid online through a card processor or a service like M-Pesa.
For as long as that pending hold is alive, those dates are treated as taken. Anyone else who tries to book the same range over the same window is turned away with a “those dates are no longer available” response. The first guest gets their ten minutes of breathing room to finish 3-D Secure, dig out their card, or confirm a mobile-money prompt — without the floor disappearing from under them mid-transaction.
Ten minutes is a deliberate choice. It’s long enough to be patient with a real guest fumbling through a bank confirmation, and short enough that a slot doesn’t sit frozen for ages if someone bails. It covers the normal length of an online checkout with margin to spare.
Finish paying, and the hold becomes permanent
If the guest completes the payment, the picture simplifies fast. Airflow’s payment confirmation step clears the short expiry off the booking entirely. The temporary ten-minute hold becomes a permanent lock. The booking is confirmed, your calendar reflects it, the guest gets their confirmation, and those dates are off the market for good — not because a timer is running, but because the booking is now a real, paid reservation.
There’s nothing for you to do here. You don’t confirm the hold, you don’t extend it, you don’t babysit a countdown. The payment landing is the signal, and Airflow reads it automatically.
Abandon it, and the dates free themselves back up
The more interesting case is the guest who doesn’t finish. They get distracted, their card gets declined, they decide to think about it. Under a naive booking system, that half-finished attempt would leave a pending booking sitting on your calendar, blocking those dates indefinitely — sometimes so badly that even the same guest couldn’t come back and rebook. Dead dates, no revenue, and you none the wiser.
Airflow handles abandonment two ways, and both end with the dates back on sale.
If the guest hits a failure or backs out of payment, they land on a payment-failed page that immediately releases the hold. The pending booking is marked as failed, and those dates are bookable again right away — no waiting.
If the guest simply vanishes — closes the tab, walks away, never comes back — a background job sweeps for expired holds every few minutes. Any online-payment booking still sitting pending past its ten-minute window gets flipped to expired, which removes it from your availability. In the worst case, an abandoned slot is back on the market within minutes of the hold lapsing, completely hands-off.
And Airflow doesn’t just silently drop the guest. When a hold expires, it sends them a friendly “your booking hold has expired” email with a “rebook now” link that points straight back to the right place — your custom domain, your Airflow-hosted site, or your marketplace listing, depending on how they found you in the first place. A guest who got distracted for fifteen minutes gets a gentle nudge back, and the dates they almost booked are waiting for them (or for someone else).
One honest note on scope: the ten-minute hold applies to online payments — cards and mobile-money checkouts where the money is supposed to move right now. Bookings paid by bank transfer, cash on arrival, or via a pre-booking inquiry work differently, because there’s no live payment to race against. Those get longer, more appropriate hold behaviour rather than a ten-minute timer. This post is about the online-checkout case, which is where the double-booking risk is sharpest.
The real guard: a double-book that’s impossible at the database level
Everything above is the courteous layer — it keeps the calendar honest in normal use and frees up dead dates. But “normal use” isn’t what hosts actually worry about. They worry about the freak coincidence: two payments completing in the exact same instant, both having slipped past the availability check a heartbeat apart.
For that, Airflow has a guard that doesn’t rely on timing at all. The direct-bookings table carries a PostgreSQL exclusion constraint — internally it’s called no_overlapping_bookings — that the database itself enforces on every write. In plain terms: the database will physically refuse to store two active bookings whose date ranges overlap for the same property. It’s not a check the application politely runs and hopes nobody skips; it’s a rule baked into the data layer that cannot be bypassed, no matter how two requests are timed.
So even in the one-in-a-million race where two guests both complete payment at the same microsecond, the database lets exactly one of them through and rejects the other outright. There is no sequence of events — no race condition, no double-click, no simultaneous tab — that can produce a true overlapping double-book. The hold is what makes that race vanishingly unlikely; the constraint is what makes it impossible.
Why two layers instead of one
You might reasonably ask why both the hold and the database guard exist. Couldn’t one do the job?
They solve different problems, and the combination is what makes the experience clean:
| Layer | What it does | What it protects against |
|---|---|---|
| 10-minute hold | Takes the dates off the market the moment checkout starts; auto-expires on abandonment | The common case — two guests browsing the same dates, abandoned carts blocking your calendar |
| Payment confirmation | Turns the temporary hold into a permanent lock when money lands | A paid booking ever being treated as anything less than final |
| Database exclusion constraint | Physically refuses to store overlapping bookings | The rare race — two payments completing at the same instant |
The hold makes everyday booking feel fair and frees up dead dates without you lifting a finger. The constraint is the last line of defence that turns “very unlikely” into “can’t happen.” Together they mean you can take direct bookings — on your own site, on a custom domain, or through the marketplace — without ever lying awake wondering whether two guests just bought the same week.
What this means for you
If you take direct or online bookings, the practical upshot is simple:
- No more accidental double-sells. The same dates can’t be confirmed twice, full stop.
- No dead calendar. Abandoned checkouts don’t quietly block your dates for hours — they free themselves up within minutes.
- No manual cleanup. You’re never hunting for stale pending bookings to cancel by hand so the dates can go back on sale.
- A second chance at the booking. Guests who drop off mid-payment get a friendly nudge to come back, with a link that lands them in the right place.
You don’t configure any of this. There’s no setting to switch on, no timer to tune. It’s simply how Airflow takes bookings — quietly making sure that when a guest is paying, the dates are theirs, and when they’re not, the dates are yours again.
Want to see how guest payments flow end to end once a booking is held? Read Guest Payments & Deposits, or see how the deposit-then-balance lifecycle keeps the books right after the dates are locked. Curious how commission tracks the money you actually collect? That’s in Commission on What You Collect. If you’re not set up yet, get started here.