Automation Glass

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 demo

Problem

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.

VapiNode 20 ESMLLM via fetchSupabase RLSGoogle CalendarCloudflare Tunnel

Niches

Real estate buyer/seller qualification
Dental new-patient intake and urgency routing
Salon service preference and appointment capture

See the extractor work live.

Try all three demo niches and watch the structured profile fill in from plain text conversation.

Open demo