AI Receptionist & Lead Automation
Voice AI agent handling inbound business enquiries 24/7
Live Demonstration
A quick look at the system in action — input, processing, output.
AI Receptionist & Lead Automation — Short Demo
Problem & Motivation
Why this system needed to exist.
Most small businesses miss 30-50% of inbound calls during operating hours. When the owner is on a job site, in a meeting, or asleep — the phone rings to voicemail. The lead goes cold, the customer calls a competitor, and revenue is lost.
Existing solutions were either expensive enterprise call centres, rigid IVR trees that frustrate callers, or simple voicemail. I wanted a system that could hold a natural conversation, extract structured information, and integrate with existing business workflows — all self-hosted and controllable.
This project explores: Can a local LLM + voice interface + workflow automation handle real business conversations reliably?
What I Built
The system architecture and core capabilities.
I built a complete AI receptionist pipeline running on self-hosted infrastructure:
Core Components
- Dograh — Voice interface handling SIP/telephony, STT/TTS orchestration
- n8n — Workflow engine for conversation logic, data extraction, routing
- Local LLM (via llama.cpp) — Natural language understanding and response generation
- Baserow — Airtable-alternative database for lead storage and CRM sync
- Webhooks — Integration layer for calendars, CRMs, notifications
Capabilities
- Answers inbound calls in < 2 rings with natural voice
- Holds multi-turn conversations with context retention
- Extracts structured data: name, company, urgency, requirements, budget range
- Books appointments directly into calendar via API
- Forwards emergency calls to on-call mobile
- Creates rich lead records in Baserow with full transcript
- Triggers Slack/Email/Telegram notifications to the team
System Architecture
How the components connect and data flows.
The architecture follows a clean event-driven pattern:
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Caller │────▶│ Dograh │────▶│ n8n │
│ (Phone) │ │ (Voice GW) │ │ (Orchestrator)│
└─────────────┘ └──────────────┘ └──────┬──────┘
│
┌──────────────┐ ┌───────▼───────┐
│ Webhooks │◀───▶│ Local LLM │
│ (Calendar, │ │ (llama.cpp) │
│ CRM, etc) │ └───────────────┘
└──────────────┘ │
▼
┌──────────────┐ ┌─────────────┐
│ Notifications│◀───▶│ Baserow │
│ (Slack/Email) │ │ (Leads DB) │
└──────────────┘ └─────────────┘Data Flow
- Inbound call hits Dograh SIP trunk
- Dograh performs STT → streams text to n8n webhook
- n8n passes conversation context to local LLM
- LLM responds with structured action:
{intent, entities, response_text, tool_calls} - n8n executes tool calls (calendar, Baserow, notifications)
- Response text → TTS → back to caller via Dograh
- Full transcript + extracted data saved to Baserow
End-to-End Workflow
Step-by-step from input to output.
The n8n workflow is the brain. Key nodes:
Conversation Node
Manages multi-turn state, injects system prompt with business context, handles context window
Entity Extraction
Structured output parsing: name, email, phone, service_type, urgency, budget, preferred_time
Calendar Integration
Checks availability, creates events, sends confirmation — all via Cal.com / Google Calendar API
Escalation Logic
Keywords ("emergency", "urgent", "lawyer") trigger immediate SMS/call to on-call number
Custom Business Scripts
Each business gets a tailored system prompt defining:
- Business name, services, pricing tiers
- FAQ responses (hours, location, payment methods)
- Qualification questions specific to their industry
- Tone/personality guidelines (professional, friendly, direct)
- Escalation triggers and handoff procedures
Technology Stack
Tools, frameworks, and services used.
Screenshots & Diagrams
Real captures from the running system.
Placeholder screenshots — replace with actual captures:
Technical Decisions & Trade-offs
Key choices made during development and why.
Local LLM vs API
Chose local (llama.cpp) for: data privacy (call transcripts never leave infrastructure), zero per-call cost, latency control, offline capability. Trade-off: model quality ceiling vs GPT-4o.
n8n as Orchestrator
Instead of custom Python orchestrator, n8n provides: visual debugging, built-in retry/error handling, 400+ integrations, non-technical stakeholders can modify flows. Trade-off: less programmatic control, JavaScript-based expressions.
Structured Output from LLM
Used JSON schema prompting + post-validation instead of function calling. More reliable with smaller local models, works with any LLM that follows instructions.
Baserow over Airtable
Self-hosted, no row limits, API-first, PostgreSQL backend. Airtable's pricing and rate limits made it unsuitable for high-volume lead capture.
Challenges & Solutions
What went wrong and how it was resolved.
Challenge: STT Hallucinations on Noisy Calls
Solution: Implemented confidence threshold — if STT confidence < 0.7, ask caller to repeat. Added noise gate in Dograh config. Switched to faster-whisper large-v3 for better noise robustness.
Challenge: Context Window Overflow in Long Conversations
Solution: Implemented sliding window with summarization: every 5 turns, LLM summarizes prior context into 3 bullet points. Keeps token usage constant.
Challenge: TTS Latency Breaking Conversation Flow
Solution: Pre-generated common responses (greeting, "one moment", "thank you"). Stream TTS chunks via Dograh's streaming mode. Cache generated audio for repeated phrases.
Challenge: Calendar Race Conditions
Solution: n8n's built-in locking + optimistic concurrency on calendar API. Double-booking now statistically near-zero.
Outcome & Lessons Learned
What worked, what didn't, and what I'd do differently.
This is a working prototype — not a production deployment with client metrics. What it proves:
- Local LLMs (7B-13B) can handle structured conversation extraction reliably with good prompting
- n8n + Dograh + llama.cpp is a viable self-hosted voice AI stack
- End-to-end latency < 3s (STT → LLM → TTS) is achievable on modest GPU
- Business logic in n8n enables rapid iteration without code deployments
Next Steps
- Add RAG for business-specific knowledge (pricing, policies, technical specs)
- Implement caller identification via CLID + CRM lookup
- Add multi-language support (TTS/STT models for target languages)
- Build admin dashboard for non-technical script management
- Load test with concurrent calls to find bottlenecks
Note: This project demonstrates technical capability. No production client data or revenue claims are made. All screenshots and metrics are from development testing.
Technical Walkthrough
Extended video covering architecture, code, and implementation details.
AI Receptionist & Lead Automation — Technical Walkthrough
Let's discuss how this approach could work for you
Remote roles, contract work, and collaboration — all on the table.