Case study · A Miami commercial real-estate brokerage
A real-time bilingual AI phone receptionist
A phone agent that answers a brokerage's main number in English and Spanish, searches live listings and logs every call as a CRM lead.
- Role
- Sole engineer
- Period
- Feb – Jul 2026
- Status
- In production since April 2026
- Stack
- Node.js
- TypeScript
- Fastify
- Twilio Media Streams
- Deepgram
- Claude (tool use)
- ElevenLabs
- Salesforce
- Cloudflare R2
The problem
A commercial brokerage wanted its main number answered by an agent that could talk about specific properties in English or Spanish, understand local shorthand for places and roads, turn every call into a tracked lead, and follow up with flyers by text or email while respecting messaging consent rules.
What I built
A streaming pipeline: Twilio Media Streams into Deepgram for speech-to-text, Claude with tool use for the conversation, and ElevenLabs for streaming speech back, in μ-law end to end.
- Latency by design: speculative Claude calls on early end-of-turn (cancelled if the caller keeps talking), token-streamed speech, prompt caching and a pre-baked greeting. The design target was about 1 to 1.5 seconds to first words.
- Barge-in that works: playback is confirmed by Twilio marks, the unspoken part of a reply is computed from speech alignment, and the conversation history is rewritten to what the caller actually heard.
- Tools for the agent: search across 293 live property listings with South Florida geography (neighborhoods, highway nicknames), log every call as a CRM lead, and text or email flyers.
- Compliance in code, not in the prompt: texting refuses without a public URL, honors opt-outs and runs consent. A bug that produced phantom text sends was found and fixed.
- Around the agent: a Salesforce lead-security model (group-based edit rights, approval workflow, export lockdown), daily CRM backups to object storage, a listing audit that produced 167 WordPress listing drafts, and review pages for 35 agents that write status back to the CRM.
- Client data work operated through an AI assistant with about 140 ops scripts, and an eight-part handover runbook.
Outcome
The receptionist has answered the brokerage's main number since April 2026, with text messaging added after carrier approval in June. It was handed over with runbooks in mid-2026.
I have no call-volume, lead or time-saved figures, so none are claimed. The latency figure above is a design target, not an independent measurement.
Related open source
- voice-engine on GitHub, opens in a new tab: Turn-taking for real-time phone agents.
- sms-consent on GitHub, opens in a new tab: SMS consent handling you can read in one sitting.
- email-kit on GitHub, opens in a new tab: Transactional email, the boring parts done safely.