
In short
A chatbot should confirm an appointment only after the booking system has accepted a durable event. The conversation can collect preferences and explain options, but the calendar write, duplicate protection, and later changes need explicit state checks. An uncertain write should produce an uncertain answer, not a confident confirmation.
A booking reply is a commit acknowledgement, not a writing task. If the calendar has not accepted the appointment, the chatbot cannot truthfully say it is booked.
The failure is easy to create. A visitor asks for Tuesday afternoon. The assistant offers a time and writes, “You are booked.” Meanwhile the calendar request times out. The customer arrives expecting a slot that the business cannot see. The words were coherent; the state was wrong.
Separate the Choice From the Commit
Conversation is useful for gathering the service, location, preferred time, and necessary contact details. It can explain available choices in plain language. But an offered time is provisional until the booking system accepts it. Availability can change between the question and the write.
Make that boundary visible. Before the write, say the time is available to request. After a successful write, return the confirmed time, time zone, and reference. If the write fails, say the booking did not complete. If the result is unknown, say it is unconfirmed while the system checks. Never use the same confirmation sentence for all three states.
Both Google Calendar and Microsoft Graph create an event through an authenticated write and return an event resource. That resource, not the assistant's prose, is the evidence of a committed appointment.
Retry the Same Intent, Not a New Booking
A timeout does not reveal whether the first write succeeded. Blindly sending another create request can produce two bookings. Give the customer intent a stable identity, check for an existing result, and let a retry continue that same attempt. Google Calendar describes caller-supplied event IDs as one way to keep a local record in sync and avoid duplicates after an ambiguous result. Stripe documents the same general principle for safe request retries with an idempotency key.
The exact mechanism depends on the booking provider. The design requirement does not: one customer request should lead to at most one committed reservation. If the provider cannot support that guarantee, reconcile the calendar before speaking as though the retry succeeded.
Keep Changes Attached to the Original Record
Booking is a lifecycle, not a single chat turn. A customer may reschedule or cancel. Those actions need to find the original reservation, check the new conditions, commit the change, and report the resulting state. A conversational “done” with no changed record leaves the operator and customer with different versions of the appointment.
This is the pattern we use in HoverBot: let chat gather and explain, but let a durable booking record decide what can be confirmed. It trades a little conversational speed for a clear answer to the question that matters: where can the business see and change this appointment?
Test the awkward paths before trusting the happy one. Make the calendar write fail. Let it succeed while the response times out. Retry the same request. Ask to reschedule a booking that no longer exists. At each point, compare the transcript with the durable record. If they disagree, the assistant must stop promising and hand the case to a person.
Frequently asked questions
- When should a chatbot say an appointment is booked?
- Only after the booking system has accepted the event and returned a durable reference that the business can find. Collecting a preferred time or generating a friendly confirmation sentence is not enough. If the calendar write fails or its result is unknown, the assistant should say the booking is unconfirmed and offer a safe retry or human follow-up.
- How can a chatbot avoid duplicate appointments after a timeout?
- Give each booking attempt a stable identity and reuse it when retrying the same request. Some calendar systems let callers supply an event identifier; other systems expose their own duplicate-protection mechanisms. After a timeout, check the existing booking state before creating another event. A retry must not silently turn one customer request into two reservations.
- What information should a chat booking preserve?
- Preserve the chosen service, time and time zone, customer contact details collected with permission, the booking system reference, and the state of the request. The business must be able to locate the record and act on it. The conversation should show the same confirmed details so the customer and operator are working from one result.
- How should rescheduling work in a chatbot?
- Treat rescheduling as a change to an existing booking, not as a fresh promise in the transcript. Find the durable record, check the requested replacement time, commit the change in the booking system, and then confirm the new state. If the change cannot be committed, keep the original booking visible and explain the next human path.
Sources
- Create events · Google Calendar
- Create event · Microsoft Graph
- Idempotent requests · Stripe
About the author
Founder & CEO at HoverBot
Founder of HoverBot, where he leads product strategy and applied AI architecture, and CTO and co-founder of WTFox.ai, a separate company. Nineteen years in software engineering, most recently as Software Architect at Mercer, where he shipped HR chatbots and OCR claims processing on Azure AI, and as tech lead at Darwin and Technosoft SEA, after engineering roles at Sberbank, Veon, and Softline. Hands-on with architecture decisions, deployment operations, and benchmark-driven quality optimization. Based in Singapore.
- 19 years of software engineering, architecture, and engineering leadership
- Founder of two separate AI startups: HoverBot and WTFox.ai
- Applied AI: conversational systems, RAG pipelines, agentic workflows, and safety controls
- Enterprise AI delivery: HR chatbots and OCR claims processing on Azure AI at Mercer
- Led engineering teams of 10+ as tech lead and software architect
- Cross-industry: enterprise HR and benefits, banking, telecom, automotive, e-commerce and marketplaces
- Writes on AI chatbot architecture, agentic systems, and deployment patterns at vitaliks.me


