← Back to work
Demo ProjectDemo

Northside HVAC · Missed Call Text-Back

Techs are on roofs, the office line is busy, and after 6pm nobody answers. In HVAC a missed call is usually someone already uncomfortable and already dialing the next contractor on Google. The shop had no idea how many calls it was losing, because a call that never connects leaves no record anyone reads. And an auto text nobody follows up on is worse than silence: it promises responsiveness and then delivers none.

Northside HVAC · Missed Call Text-Back preview

Overview

Two n8n workflows coordinating through a shared Google Sheet. The first takes the missed call webhook, confirms the call was genuinely missed, composes a text that makes a different promise inside and outside business hours, logs the caller as awaiting reply, and waits five minutes. On resume it re-reads the row from the sheet rather than trusting what it held before the pause, because a separate workflow may have written to it in that window. Still awaiting a reply means the owner gets an escalation email. The second workflow takes the inbound SMS webhook and marks that caller replied, which is what calls the escalation off.

My role

  • Two n8n workflows (missed call & inbound reply)
  • Escalation state machine over Google Sheets
  • Phone normalization & SMS copy

The problem

Techs are on roofs, the office line is busy, and after 6pm nobody answers. In HVAC a missed call is usually someone already uncomfortable and already dialing the next contractor on Google. The shop had no idea how many calls it was losing, because a call that never connects leaves no record anyone reads. And an auto text nobody follows up on is worse than silence: it promises responsiveness and then delivers none.

What I built

  • Business hours and after hours messages that promise different things
  • One row per caller, so repeat callers are never double texted
  • Five minute wait, then escalate only if nobody replied

Tools used

  • n8n
  • Google Sheets
  • Twilio
  • Gmail
  • Webhooks

Challenges

  • Google Sheets reads a leading + as a formula prefix, so writing +639513219802 stored the digits and dropped the plus. The write succeeded, the value changed, every later lookup matched nothing, and every caller escalated as though they had never replied. Fixed by storing digits only and reattaching the + where a telephony API needs it.
  • Trusting nothing across the five minute wait. Another workflow can write to the row while execution is paused, so the data captured before the pause is already stale on resume.

Outcome

  • Missed calls get an immediate text back instead of going unrecorded
  • Escalation fires only when the customer did not reply, verified by re-reading the sheet after the wait
  • One row per caller keyed on the phone number, so repeat calls update instead of piling up
  • The Twilio send is wired and deliberately disabled: delivery to Philippine numbers needs carrier sender ID registration, so the state machine is proven end to end rather than resting on a send that would silently never arrive

Project links

Private build. Ask me for a walkthrough.

martejohnvincent13@gmail.com