He told me about it as an aside, not as a problem. He'd driven out to a house on a Tuesday morning for an estimate and nobody was home. Called the customer. The customer said, politely, that they'd moved it to Thursday. They'd used the link in the email.
He assumed the customer had done it wrong. That is almost always the assumption, and it is almost always wrong.
What the link was actually doing
The confirmation email had a "need to reschedule?" link. Clicking it opened the booking calendar, a fresh one. Not the existing appointment with the option to move it. A blank calendar, exactly the same as the one on the website.
So the customer picked Thursday. The system created a Thursday appointment. The Tuesday appointment was never touched, because nothing in that flow ever told the system which appointment the customer was trying to change.
Two appointments. Two confirmation emails, which the customer reasonably read as "the first one was the old email." One truck, in the wrong driveway, on the wrong day.
It wasn't broken in a way that throws an error. It was broken in a way that succeeds at the wrong thing.
Why nobody caught it
Every automated check you could run on that link would pass. The link resolved. The page loaded. The form submitted. An appointment got created and a confirmation went out. From the system's point of view the whole flow completed successfully.
And the failure is invisible from the inside. On the calendar, a double booking looks like two customers, and on a busy week two extra slots a month do not announce themselves. The only person who sees the problem is the customer, and the customer assumes it's their fault and doesn't say anything.
This one had been live for at least four months. There was no way to know how many no-shows it had caused, because every one of them looked like an ordinary no-show.
The fix
The reschedule link needed to carry the appointment ID, so the system knows which booking is being changed, and point at the reschedule endpoint rather than the generic booking calendar. Most booking platforms give you both; they're just different merge fields, and the one that sounds right in the template editor is usually the wrong one.
We also added a cancel link, which sounds counterproductive and isn't. A customer who can't cancel cleanly doesn't keep the appointment. They just don't show up.
Test your own booking flow properly
Twenty minutes, your own phone, a real email address you control. Not a test account. A real one, so you see exactly what a customer sees:
- Book yourself an appointment from your website, the way a customer would.
- Open the confirmation email on your phone. Half of these flows break only on mobile.
- Click the reschedule link. Does it show you your existing appointment, or a blank calendar? A blank calendar is the bug.
- Move it. Then check your calendar: is there one appointment or two?
- Click the cancel link. Does the slot actually free up?
- Check that you got a notification at every step. If a customer reschedules at 9pm and nothing reaches you, you find out in the driveway.
Then do the same thing from the text message confirmation, if you send one. They're separate templates and they break separately.
The part worth remembering
Booking systems get set up once, tested once by the person installing them, and then never touched again while the business changes around them. Nobody runs the flow as a customer, because the people who could are the people who already know how it's supposed to work.
Book yourself once a quarter. It's the cheapest thing on this list and it catches the most.
Written by Matt Pulliam, Southern Standard Systems. Details changed to keep the business anonymous; the failure is exactly as found.
SOUTHERN STANDARD