Home / Recipes / Missed-call text-back + after-hours AI intake
Problem 1: Calls go unanswered while you're on a job or after hours
Missed-call text-back + after-hours AI intake
When a call is missed, the caller gets a text within seconds. After hours, an AI asks for the problem, name and address, creates a request in Jobber, pages on-call for emergencies, and gives gas-leak callers safety instructions instead of booking.
The problem
Every missed caller can phone the next company on the list. Nobody has published a trustworthy dollar figure for this, so we don't give one.
- A person answered only 34% of HVAC calls; plumbing did better at 74%. Source: Invoca, Home Services Lead Conversion Benchmarks Report 2026 (Industry report by a call-tracking vendor)
- HVAC companies booked 38% of calls overall, and shops with fewer than 5 techs booked 24%; plumbing booked 43%. Source: ServiceTitan booking-rate data, as summarized by Skygnosis (Secondary write-up of ServiceTitan data)
Background reading: How many calls is your HVAC shop missing, and what it costs
Who it's for
HVAC and plumbing shops of 1-15 people that use Jobber and can't always pick up: owner-operators on a roof or under a sink, and shops without a 24/7 answering service.
Tools and monthly cost
| Tool | Official price |
|---|---|
| Twilio US local phone number | $1.15 / month pricing page |
| Twilio US SMS, sent or received | $0.0083 per 160-character segment, plus carrier fees of about $0.0035-$0.005 per segment pricing page |
| A2P 10DLC registration (required to text US customers from a local number) | One-time: $4.50 brand + $15 campaign vetting (Standard brands add $41.50 vetting). Monthly campaign fee: $1.50 (low-volume mixed) to $10 (Standard) pricing page |
| Twilio voice, receiving calls | $0.0085 / minute (calls routed through Twilio also pay for the forwarded leg; see voice pricing) pricing page |
| AI model (example: OpenAI gpt-4o-mini) | $0.15 per 1M input tokens, $0.60 per 1M output tokens pricing page |
| n8n | Community Edition: free if you self-host (you pay for the server). n8n Cloud: from EUR 20 / month (Starter) or EUR 50 (Pro) pricing page |
| Jobber (you probably already pay for it) | Core from $29 / month billed annually ($49 monthly); Connect from $99 (built-in quote and invoice follow-ups); Grow from $149 pricing page |
Example month: Illustrative arithmetic, not a measured result. Assume 60 missed calls a month, each conversation about 8 SMS segments in and out: 480 segments x $0.0083 = $3.98, plus carrier fees of roughly $1-$2.40. AI: about 3 short model calls per conversation with gpt-4o-mini, well under $0.10 in total. Fixed: $1.15 number + $1.50-$10 campaign fee. Total about $8-$17 a month plus n8n (free self-hosted or EUR 20 Cloud) and voice minutes for calls routed through Twilio. One-time: $19.50 A2P registration ($61 for a Standard brand).
Setup
- Buy a Twilio local number and complete A2P 10DLC brand + campaign registration (texts to US numbers are blocked until it's approved; approval time varies).
- Route your business line through the Twilio number: an incoming call <Dial>s your office phone, and the Dial action URL / status callback points at the workflow's 'call status' webhook. The workflow treats no-answer, busy and failed as missed.
- Point the number's incoming-SMS webhook at the workflow's 'inbound SMS' webhook. If you also use the quote follow-up recipe, use one small router workflow, because a Twilio number has only one SMS webhook.
- In Jobber's Developer Center, create an app with client and request write scopes and connect it to your account; store the access token in an n8n credential (tokens expire after 60 minutes, so use n8n's OAuth2 credential so it refreshes).
- Import workflow.json into n8n. Set the environment values listed in .env.example (business name, time zone, office hours, office / on-call phone numbers, model API key) and replace the mock URLs with the real Twilio, Jobber and OpenAI endpoints.
- Before going live, open Jobber's GraphiQL explorer and confirm the requestCreate input fields (see 'Documented only' below). Then call your own number from a second phone after hours and run through a no-heat, a burst-pipe and a gas-smell scenario.
Download
Download missed-call-text-back.zip
Contains the n8n workflow, AI prompts, the mock data, the test runner with its last results, and the mock server we tested against. All keys in .env.example are fake.
Test result
Every workflow was imported into n8n 2.45.4 and run end to end on our test machine. Twilio, Jobber and Stripe were replaced by a local mock server that accepts the same request shapes as their documented APIs and records every call. The AI steps used a small local model (Qwen2.5-3B-Instruct, 4-bit) and the speech-to-text steps used Whisper base.en running locally. Mock data (customers, quotes, invoices, recordings) is invented. Nothing was sent to a real phone, customer or account.
8/8 scenarios passed (run 2026-10-27)
| PASS | S1 | Answered call is ignored |
| PASS | S2 | Missed call during business hours gets a call-back text |
| PASS | S3 | After-hours no-cool call becomes a Jobber request over 2 texts |
| PASS | S4 | Burst pipe at 2am Saturday pages on-call |
| PASS | S5 | Gas smell gets safety instructions, no booking |
| PASS | S6 | Same caller twice within 12h only gets one text |
| PASS | S7 | Blocked / anonymous caller is skipped |
| PASS | S8 | A text after the request is logged goes to the office, not back into intake |
Actual output from the test run
Texts sent in scenario S3 (after-hours AC call, run through the real local AI model). Names and numbers are invented.
to +15555550123: Hi, this is Ridgeline Heating & Plumbing. Sorry we missed you - the office is closed right now, but you can book by text. What's the problem and the service address? If you smell gas, leave the building and call your gas utility or 911. to +15555550123: Thanks! Could you send your name and the service address? to +15555550123: Thanks Jen, you're on our list. The office will call or text to confirm a time first thing when we open.
Verified with mocks
- Missed vs answered call detection, business-hours vs after-hours behaviour, one text per caller per 12 hours, anonymous callers skipped.
- Multi-turn intake by text with a real (small, local) AI model: problem, urgency, name and address extracted over several messages.
- Urgency rules: 'no heat / AC quit' floors at urgent; burst pipe at 2am pages on-call; gas smell gets safety instructions and no booking.
- Request creation: Jobber clientCreate + requestCreate calls sent with the right shape to the mock, and texts after booking forwarded to the office instead of restarting intake.
Documented from official API docs only
Built to the vendor's documentation but not run against a live account. Check these on yours.
- Twilio call-status and SMS webhook fields, and the Messages API (from Twilio's docs; not run against a live Twilio account).
- Jobber GraphQL endpoint, headers, OAuth and clientCreate (from Jobber's developer docs).
- requestCreate input fields: taken from a community copy of Jobber's schema, not from Jobber's docs. Check in GraphiQL before relying on it.
- Behaviour with a hosted model such as gpt-4o-mini: not tested; we tested with a small local model.
Limitations
- The workflow does not yet validate the X-Twilio-Signature header on incoming webhooks (the call-scorecard recipe shows how; copy that check before going live).
- The after-hours greeting is 2 SMS segments, so it costs twice a short text.
- Twilio handles STOP / START opt-out keywords on standard numbers, but you should confirm your Messaging Service opt-out settings.
- Housecall Pro and ServiceTitan versions are not built; we could not verify their API docs.