Liepa Dental has three chairs, not three dentists' worth of free time. A slot is only bookable while fewer than three appointments hold it. Everything else — the website, the voice agent, the reminders — reads that same rule from one place, so the website and the phone can never sell the same chair twice.
What a caller gets
The agent answers, asks which day, reads back three open times, takes the name, and reads the phone number back digit by digit. ID confirmation happens on a keypad, not out loud — the calendar only ever stores "ID confirmed: yes/no", never the number itself.
The problem that took the longest
The model has no clock. Asked for "Friday", it produced a date in 2023. The fix was to stop trusting it with dates at all: the agent passes "today", "tomorrow" or a weekday name, and the n8n tool resolves it. A past date moves forward. A weekend answers "the clinic is closed at the weekend" instead of "fully booked" — and when a day is full, the tool finds the nearest day that isn't and offers those times.
The part clinics actually feel
At 15:00 a workflow emails the clinic one list: tomorrow's appointments, plus the patient messages going out. One email to read, not thirty. A cancellation puts the chair straight back into the open slots on the site.
Stack
Lovable for the site and booking flow. Six n8n workflows: booking API, voice agent tools, the 15:00 loop, confirmations. Vapi with GPT-4o, Deepgram nova-3 and ElevenLabs multilingual. Browser calls only — there is no phone number, which is why the keypad is on screen.
Built for the Lovable challenge, 2026. It's a demo clinic, so you can book, call and cancel without bothering anybody.
Like this project
Posted Oct 3, 2026
Three dentists share three chairs and the phone rings while everyone is with a patient. A voice agent answers it, checks the real calendar, and books the slot.