Voice AI / local services
AI Voice Receptionist — multi-niche call qualification & booking
A portfolio proof of concept that qualifies callers, extracts structured lead data, and books appointments across real estate, dental, and salon workflows.
Try the live demoProblem
Local service teams spend too much time asking repetitive intake questions, writing down caller details, and coordinating follow-up. Generic chatbots do not prove the hard part: extracting useful structured fields from a natural voice-style conversation while keeping production data clean.
Architecture
Phone caller
│
▼
Vapi (telephony + STT + TTS)
│ webhook
▼
bridge/voice/adapters/vapi.js → base.js (normalize)
│
▼
agents/real-estate-qualifier/qualify.js (LLM: OpenAI/Anthropic via fetch)
│
├──▶ bridge/voice/store.js → Supabase (tenants, calls, call_turns, leads, appointments; RLS per tenant)
│
└──▶ bridge/booking.js → Google Calendar (per-tenant OAuth, free/busy, booking)
│
▼
apps/control-panel (vanilla JS dashboard: calls, transcripts, leads, appointments, tenant settings)Build
Vapi handles telephony, STT, and TTS. A Node bridge normalizes inbound events, runs the LLM qualifier, persists tenant-scoped production calls to Supabase, and books 15-minute Google Calendar slots when a lead is ready. The public demo uses the same qualifier but keeps sessions in memory so demo traffic never writes to production calls or leads.
Niches
See the extractor work live.
Try all three demo niches and watch the structured profile fill in from plain text conversation.