Inspiration

Small businesses lose an estimated $75 billion a year from missed phone calls. Barbershops, salons, clinics. They're too busy with clients to pick up the phone. Callers don't leave voicemails. They just move on. We wanted to fix that with a voice AI agent that handles the entire front desk experience over the phone. Not a chatbot, not a form. A real phone conversation.

What it does

FrontDeskAI is an AI-powered voice receptionist. Customers call a real phone number and have a natural conversation with Clara, our AI agent. She can:

  • Book appointments: collects name, service, date, checks available slots, and confirms
  • Cancel appointments: verifies the caller by phone number and cancels their booking
  • Reschedule: cancels the old slot and walks the caller through rebooking
  • Speak any language: responds in whatever language the caller speaks

Every booking instantly appears on a real-time dashboard where the business can manage appointment statuses.

How we built it

  • ElevenLabs Conversational AI powers the voice agent (Clara) with natural speech and tool-calling capabilities
  • Twilio provides the phone number, connected directly through ElevenLabs telephony
  • Next.js 16 (App Router) serves both the frontend dashboard and the API webhook endpoints that the agent calls
  • Firebase Firestore stores all appointments with real-time sync to the dashboard
  • Vercel hosts the entire application
  • Cursor was used to build the entire project

The agent's system prompt and tool definitions are version-controlled in the repo, while the live configuration runs on ElevenLabs. Three webhook endpoints handle the core logic: check-availability returns open 30-minute slots for a given day, book-appointment validates and saves the booking, and cancel-appointment looks up and cancels by phone number.

Challenges we faced

  • ElevenLabs tool schema: the webhook tool format isn't well-documented. We reverse-engineered it from a working project to get the exact JSON structure right.
  • Timezone bugs: date validation was silently using UTC, which rejected valid local-time bookings after midnight UTC. Fixed by using date-fns-tz with America/Toronto everywhere.
  • Preventing double bookings: initially the agent would book without checking. We added a check-availability endpoint that returns all open slots for the day, so the agent reads them out and the caller picks one.
  • Agent confusion with language switching: early prompts caused the agent to switch languages based on perceived accents. Simplified the instruction to only switch when the caller explicitly speaks a different language.

What we learned

  • Voice agents need different UX thinking than chatbots. Error messages need to be short and spoken naturally, not JSON-style.
  • Phone number is the best identifier for caller verification. No need for booking IDs or passwords.
  • Hardcoding business config in a single file made iteration extremely fast. One file change updates the agent, the API validation, and the dashboard simultaneously.

Built With

Share this project:

Updates