
04 · Selected Work
Missed-Call Recovery
Three connected workflows that catch an unanswered call, text the caller back, run an AI service receptionist over SMS, qualify the lead into a spreadsheet, alert the shop, and chase exactly three times before going quiet.
Role
Engineer
Year
2026
Type
Productized service
Stack
n8n · Twilio · Google Sheets · OpenAI
The problem
An independent repair shop answers the phone between jobs. When the team is under a car, the call rings out — and the caller moves down their list to the next shop. The booking isn’t lost to a competitor’s pricing or reviews. It’s lost to nobody picking up.
The obvious fix is a callback. The hard part is doing it fast enough to matter, without texting people who did get through, and without the shop having to remember anything.
How it works
01
Twilio reports the call. A voice status callback fires the moment a call ends.
02
Confirm it was really missed. When a shop forwards calls with <Dial>, the parent call reports completed even when nobody answered — the true outcome lives in DialCallStatus. The normaliser prefers it whenever it’s present.
03
Deduplicate and reserve. Repeat Call SIDs are dropped and a row is reserved in the lead sheet before anything is sent.
04
Wait, then re-check. A 45-second hold, then a second look — in case the shop rang back in the meantime.
05
Send the first text. The caller gets a message while the shop is still fresh in mind.
06
Run the conversation. An AI service receptionist handles the reply thread, qualifies the job, and writes the result to the sheet.
07
Alert the shop, then stop. The owner is notified, the customer is chased exactly three times, and then it goes quiet.
The workflow
One missed call, end to end — and the n8n workflow underneath it. Three workflows share a single lead record, so a stalled conversation never blocks a new call.
Decisions worth noting
A bare “no” is a soft decline, not an opt-out. In this thread “no” is usually the answer to is the vehicle drivable? — so it marks the lead unqualified and stops follow-ups, but only a whole-message STOP or UNSUBSCRIBE sets a real opt-out flag.
Owner alerts are at-most-once. The notified flag is written before the send, so a mail failure means no retry. For a shop owner, one missed alert beats a stream of duplicates.
The AI can never claim a booking. It qualifies and hands off; only a human marks an appointment confirmed. The model is trusted with the conversation, not with the commitment.
What I’d take from it
Most of the work wasn’t the model. It was the seam — telephony that lies about whether a call was answered, a spreadsheet being used as a database by two workflows at once, and the difference between a customer saying no to a question and saying no to being contacted. The conversation was the easy half.
Interested in something similar?