Work snippetTwilio voice + SMS
Twilio missed-call text-back and voice intake that creates a ServiceM8 or Jobber job
How I would approach missed calls for a 16-tech HVAC and plumbing business: a Twilio number that texts back within a minute, a short voice menu that takes the job details, and a ServiceM8 job or Jobber request with the recording, transcript and a summary note, with opt-outs honoured.
Work snippet with example figures.
- Area
- Twilio voice + SMS
- Tools
- Twilio · ServiceM8 · Jobber · n8n
- Typical scope
- US$2,400–4,000
- Timeline
- About 6 weeks · 4 fixed milestones
Problem
What the owner sees
- Calls that ring out while the office is on another call or out on a job
- Callers who leave no message and ring the next company
- Voicemails that someone retypes into the job system later, with the address misheard
- A customer who replied STOP and was texted again
Someone with a leaking tap rings the first company on the list and tries the second only if nobody answers. A text within a minute keeps that caller, and a short intake puts their details on a job without anyone retyping them. Texting and recording rules differ by country and state, so the wording is agreed with your own advisor before launch.
| Everyday situation | What goes wrong |
|---|---|
| Call rings out at 10:12 | No text and no record. The caller rings the next company within minutes |
| Voicemail left | Sits in a phone inbox until someone listens, then is retyped with typos |
| Same customer rings from a mobile and a landline | Two client records in the job system |
| Recording made without telling the caller | A consent problem the business learns about later |
| Caller replies STOP | The next missed call sends another text anyway |
System map
A 16-tech HVAC and plumbing business with one published office number, two office staff and about 146 inbound calls a week. Jobs run in ServiceM8 or Jobber, and the ledger is in Xero.
The example uses Twilio for the numbers, voice and SMS, n8n to run the rules, and a language model to turn each recording into a short note. A person reviews every job the intake creates.
| Part | What it does |
|---|---|
| Twilio numbers | The published number, forwarded or ported in, plus a tracking number for ads. Voice and SMS webhooks point at n8n. |
| n8n workflow | Receives each webhook, checks the signature, applies the rules and calls the other systems. Every run is logged. |
| Office phones | First leg of every call. They ring for 20 seconds before the intake menu takes over. |
| Language model | Transcribes the recording and writes a five-line summary. It proposes a job type and never decides alone. |
| ServiceM8 or Jobber | Receives the client, the job or request, the note and the recording link. |
| Review queue | Every call the rules cannot close. The office works it each morning. |
| Suppression list | Numbers that have opted out, checked before any text is sent. |
How the data moves
- Inbound call
- Office rings 20 seconds
- No answer
- Menu or text-back
- Recording and transcript
- Job with summary note
- Office reviews
Rules agreed in writing
The rules are short, signed by the owner and kept in one table that the workflow reads. A change to the table is a written change, not an edit in the middle of a flow.
| Item | Example setting |
|---|---|
| Ring time | 20 seconds on the office phones, then the intake menu |
| Menu | 1 new job or quote, 2 existing job, 3 emergency, 0 office. Two attempts, then voicemail. |
| Recording notice | Played before the menu: this call is recorded to take your details. Kept 90 days, then deleted. |
| Text-back | Sent to callers who hang up before finishing. One per number per 12 hours, within 60 seconds. |
| Text-back wording | Names the business, says it is an automated message, asks for the address and the problem, and ends with Reply STOP to opt out. |
| Quiet hours | No text between 21:00 and 07:00 in the caller’s local time. Held and sent at 07:00. |
| Opt-out | STOP, STOPALL, UNSUBSCRIBE, CANCEL, END and QUIT end all texts. START resumes. HELP returns the business name and phone. |
| Registration | US local numbers need brand and campaign registration, and toll-free numbers need verification. Both start in week 1 because approval takes days. |
| Landlines and withheld numbers | Number type checked first. No text is sent to either, and the call goes to the review queue. |
Flow steps
Ten steps from the first ring to a reviewed job. Each one writes its result to the call log, so a missing step is visible.
| Step | Trigger | What happens | Result |
|---|---|---|---|
| 1 Inbound call | Twilio voice webhook | Signature checked. Caller, called number and time logged. Office phones dialled for 20 seconds. | Call record opened |
| 2 Answered | Dial status completed | Nothing recorded. The call is closed in the log. | No action |
| 3 Not answered | Dial status no-answer, busy or failed | The caller hears the recording notice and the menu. | Menu started |
| 4 Menu | Keypad digit | Digit 1 or 2: caller keys their ZIP code, then speaks name, address and problem for up to 60 seconds. | Recording saved |
| 5 Text-back | Caller hangs up early | Suppression list, number type, quiet hours and the 12-hour window are checked, then the message is sent. | Text sent or skipped, with the reason |
| 6 Transcribe | Recording status callback | Audio copied to private storage and transcribed. | Transcript |
| 7 Summarise | Transcript ready | The model writes the summary and proposes a job type and urgency from a fixed list. | Summary record |
| 8 Match client | Caller number | Match on number, then email, then address. An uncertain match is flagged, never merged. | Client ID or new client |
| 9 Create job | Summary stored | A ServiceM8 job in the Phone inbox queue, or a Jobber request, with the note and the recording link. | Job or request ID |
| 10 Replies | Inbound SMS | Keywords checked first. Any other reply is added to the job note. | Note updated |
Field mapping
Two tables define the build: what is read from Twilio, and where each value lands in ServiceM8 or Jobber.
| Twilio field | Used for | Kept in |
|---|---|---|
| CallSid | The unique call key, so a repeated webhook never creates a second job | Call log |
| From | Caller number, normalised to E.164 and used for the client match | Call log, client match |
| To | Which number was called: main, ads or on-call | Job source |
| DialCallStatus | Answered or not, which decides menu or close | Rules engine |
| RecordingSid and RecordingDuration | Fetching the audio and rejecting recordings under 4 seconds | Private storage |
| Body and NumMedia | Reply text and any photos sent by MMS | Job note, job attachments |
| OptOutType | Whether Twilio has already recorded an opt-out | Suppression list |
| Call data | ServiceM8 | Jobber |
|---|---|---|
| Caller name from the transcript | Company name | Client name |
| Caller number | Company contact mobile | Client phone |
| Address spoken, ZIP keyed | Job address, note says unverified | Property address, flagged unverified |
| Problem summary | Job description | Request details |
| Urgency proposed | Queue: Phone inbox or Urgent | Request title prefix URGENT |
| Number called | Job category | Lead source |
| Transcript and recording link | Note on the job | Note on the request |
Edge cases
Each of these is written as a test call or a test text before go-live.
| Situation | How it is handled |
|---|---|
| Caller hangs up in under 5 seconds | Logged. No text and no job. |
| Withheld number | No text is possible. The menu or voicemail still runs and the call is queued for review. |
| Landline caller | No text. A task is created for the office to call back. |
| Caller replies with an address and photos | The text goes in the job note and the photos are attached to the job. |
| Transcript empty or unclear | The job is created from the call data with a note to listen to the recording. It is flagged. |
| n8n or the voice webhook is down | Twilio’s fallback address rings the on-call mobile and an alert goes to the owner. |
Human sign-off and audit trail
The automation creates and describes. People decide. Nothing is scheduled, quoted or promised to a caller by the workflow.
| Who | Signs off | When | If nobody acts |
|---|---|---|---|
| Office coordinator | Every job the intake creates, before it is scheduled | Morning list, then every 30 minutes in office hours | The job stays in the Phone inbox and a reminder goes out after 2 hours |
| On-call technician | Emergency calls, by answering the transfer | At once | No answer in 10 minutes: second contact called, then the manager |
| Owner | Menu wording, text-back wording, quiet hours and retention | Before go-live and on any change | The old wording stays live |
| Office coordinator | Possible duplicate clients | Review queue | Nothing is merged |
| Field | Example |
|---|---|
| Call ID | CA…91c2 (Twilio call ID, shortened) |
| Received | 10:12:04, number called: main line |
| Rule that fired | Not answered, menu, hung up at step 4 |
| Text sent | Yes at 10:12:51, delivered at 10:12:53 |
| Recording | 83 seconds, stored, deletes in 90 days |
| Summary | Model name and version, prompt version, accepted by Dana (office) at 10:40 |
| Job | ServiceM8 job in Phone inbox, client matched on number |
Data and privacy
Voice and SMS data is personal data, so it is kept in accounts you own, for as long as it is needed and no longer.
| Data | Handling |
|---|---|
| Recordings | Stored in your own private cloud storage, not in the job system. The job note holds a link that needs a login. Deleted after 90 days. |
| Transcripts | Kept on the job note. Card numbers are never asked for, and any run of 13 to 19 digits is masked before the transcript is stored. |
| Model use | A hosted model on terms that do not allow training on your data, or a local model. The choice is written down at the Audit. |
| Accounts | Twilio, n8n and the job system are in your accounts. I am a user, removed at handover. |
Worked example
The tables below use one week of example figures. They show the shape of the numbers, not a client result.
| Measure | Calls |
|---|---|
| Calls received | 146 |
| Answered by the office | 94 |
| Not answered | 52 |
| Finished the menu | 24 |
| Hung up early | 28 |
| No text: withheld, landline, opted out or under 5 seconds | 6 |
| Text-back sent | 22 |
| Replies | 11: 9 with details, 2 STOP |
| Jobs created | 33: 24 from the menu, 9 from texts |
| Line | Content |
|---|---|
| Source | Main line, not answered, menu option 1, 10:12 |
| Summary | Kitchen tap leaking under the sink. Shut-off valve works. Wants a visit this week. |
| Proposed job type | Plumbing repair, routine |
| Address as spoken | 42 Alder Street, Unit B. ZIP keyed: 60614 |
| Check before booking | Address unverified. Confirm on the callback. |
| Recording | 83 seconds, link, deletes in 90 days |
Testing and checks
Every check has a written pass condition and fail condition before it is run. A FAIL stops go-live until it is cleared and the check is run again.
| ID | Check | Method | PASS when | FAIL when |
|---|---|---|---|---|
| T1 | Webhook signature | Send a request with a wrong signature | Rejected, no job, alert logged | Any job or text created |
| T2 | Office answers in 20 seconds | Test call answered | No text and no job | A text or a job appears |
| T3 | Hang up during the menu | Test call, hang up at step 4 | One text within 60 seconds | No text, or two texts |
| T4 | Second missed call | Same number again within 12 hours | No second text | A second text |
| T5 | STOP reply | Reply STOP, then call again | Number on the suppression list, no later text | Any later text |
| T6 | Menu option 1 to a job | Complete the menu with a spoken address | One job, right client, note and recording link | No job, two jobs or the wrong client |
| T7 | Emergency option | Press 3 with the on-call phone off | Second contact called and job flagged urgent | Call dropped |
| T8 | Landline and withheld | Call from each | No text, entry in the review queue | A text sent |
| T9 | Workflow switched off | Disable n8n and call | Fallback rings the on-call mobile and an alert is sent | Silence |
| T10 | Quiet hours | Missed call at 22:30 | Text held and sent at 07:00 | Text sent at 22:30 |
Scope and milestones
A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.
| Area | Included |
|---|---|
| Systems Audit | Review of the current phone setup, call volumes and job system, a 45-minute call, written findings and a fixed quote |
| Twilio setup | Numbers, forwarding or porting, registration support, webhooks and fallbacks |
| Text-back and opt-out | Wording, rules, suppression list and STOP, START and HELP handling |
| Voice menu and recording | Menu, notice, recording, transcription and summary |
| Job creation | Client match and a ServiceM8 job or Jobber request with note and recording link |
| Review queue and alerts | Morning list, reminders and failure alerts |
| Testing | Ten checks, run to a pass before go-live |
| Handover | Written SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live |
| Not included | Tax filing and statutory returns. |
| Also outside the scope | Twilio usage and number fees, billed to you by Twilio. Registration approvals, which Twilio and the carriers decide. Legal wording for recording and texting, which your own advisor should approve. Daytime call answering. |
| Milestone | Deliverable | Timing | Share |
|---|---|---|---|
| M1 Rules and numbers | Rules signed, numbers chosen, registration started | Weeks 1 to 2 | 25% |
| M2 Text-back and opt-out | Working in a test number, tests T1 to T5 pass | Weeks 3 to 4 | 30% |
| M3 Menu and jobs | Menu, recording, summary and job creation, tests T6 to T10 pass | Weeks 4 to 5 | 30% |
| M4 Handover | Live on the main line, SOPs, handover video, 14 days of fixes | Week 6 | 15% |
Typical scope for this kind of project: US$2,400–4,000
About 6 weeks across 4 fixed milestones. The Systems Audit (US$300, fixed) comes first and confirms the scope.
Describe what is going wrong between your job system and your books, and I will say where I would look first.
Send a short note through the form on the home page. I will reply with where I would start, and whether the US$300 Systems Audit is the right first step.