Four o'clock on Saturday has one treatment room and one therapist. Two receptionists are on the phone at the same time. Both see one slot free, both take a booking, both confirm.
This is not carelessness — it is a race, and races are won by whichever request happened to be a few milliseconds later. Any system that reads a count and then writes a booking has this bug; it simply does not show up until the property is busy enough for two people to be selling at once, which is exactly when it costs the most.
The fix is unglamorous: lock the session row before reading its booked count, inside the same transaction that writes the booking. Two cashiers racing for the last place then produce exactly one booking and one refusal that says how many places are genuinely left.
It matters more for classes than for treatments. A yoga class with twelve mats will be sold by three different people, on the phone, at the desk and through the guest app, and it will be sold right up to the last place.
Why this matters to you: the guest who gets turned away has already told somebody they had booked it. You are not refunding a treatment, you are apologising for a promise, and the operational cost of that on a Saturday is a manager's afternoon.
