n8n portfolio · workflow 1 of 3
AI Voice Call Center
A Twilio phone line answered by a Claude agent that books visits, checks job status, answers pricing questions and escalates emergencies, then scores every call afterwards. Built for home-service businesses that lose jobs to missed calls.
Architecture
Twilio calls three webhooks during a call. One config node and one router send each event to its lane, so every setting lives in one place.
- App action
- Code / routing
- Postgres
- Claude step
- Reply to caller
One conversation turn
What happens between the caller finishing a sentence and hearing the reply.
Engineering decisions
Why it is built this way.
- Guardrails before the modelSilence, gas, carbon-monoxide and fire keywords, flooding, “let me talk to a person” and runaway calls are handled in plain code. Emergencies never wait on an LLM, and those turns cost nothing.
- Tools signal intent, text gets spokenTransfer and hang-up are tools. The workflow reads the agent's tool trace to choose
<Dial>or<Hangup>, so the model never has to emit a special format that could break. - Respond first, persist afterEvery lane sends TwiML before writing to Postgres or Slack, which keeps the pause the caller hears short.
- Verification lives in SQLA job lookup only returns a row when the caller's phone or the service ZIP matches, so a clever prompt cannot pull someone else's job.
- No dead airIf the agent errors, its error branch hands the caller to a human, or books a callback after hours, instead of hanging up.
- Full-text search, not a vector storeThe FAQ base uses Postgres
websearch_to_tsquery: fast lookups, no embedding bill, and one database to run. - Consent and data hygieneSMS recaps go out only when the analyst finds an explicit yes in the transcript. Raw LLM memory is deleted once the call is analysed.