Home / Roofing Contractors / Storm-week missed-call text-back for roofers: intake by text, leaks to on-call, the rest queued by ZIP

Roofing Contractors problem 2: After a storm the phones ring while the crew is on a roof

Storm-week missed-call text-back for roofers

Intake by text, leaks to on-call, the rest queued by ZIP

Verified with mocksLast tested 2026-10-28 · pricing checked October 2026

When a call to your Twilio number goes unanswered, the caller gets one text asking for their street address, ZIP code and the word LEAK if water is coming in right now. Their reply creates a JobNimbus lead (or adds notes to an existing customer's jobs) and a callback task. Active leaks go straight to the on-call phone; everything else joins a storm queue that the office gets by email every hour, grouped by ZIP so you can plan routes. One text per caller per 12 hours, nothing about insurance, and STOP is honored.

The problem

A homeowner with water coming in calls the next roofer on the list. The figures below are from a call-tracking vendor's benchmark, so treat them as indications.

Background reading: AI receptionist for roofing companies vs. a missed-call text-back: a storm-week comparison

Who it's for

US residential roofing companies whose call volume jumps after hail and wind storms and whose office can't answer every call.

Tools and monthly cost

ToolOfficial price
Twilio US local phone number$1.15 / month pricing page
Twilio voice, receiving calls$0.0085 / minute (calls routed through Twilio also pay for the forwarded leg; see voice pricing) 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
JobNimbus (CRM, if you use it)Quote-based: plans Essentials (up to 3 users), Pro (up to 10), Premium (up to 19) and Enterprise; the plan table lists 'API & Webhooks' on every plan pricing page
Resend (sends the emails)Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 pricing page
Google Sheets (opt-out list, missed-call log, storm queue)Free with a Google account or your existing Google Workspace plan pricing page
n8nCommunity Edition: free if you self-host (you pay for the server). n8n Cloud: from EUR 20 / month (Starter) or EUR 50 (Pro) pricing page

Example month: Illustrative arithmetic. Assume a storm month with 300 missed calls: 300 text-backs and about 150 replies, about 2 segments each = 900 segments x $0.0083 = $7.47, plus carrier fees of about $3-$4.50. Twilio number $1.15, inbound voice $0.0085 a minute (the forwarded leg to your phones is billed too) and A2P 10DLC $1.50-$10 a month. Hourly digests fit Resend's free tier. About $15-$30 in a storm month, a few dollars in a quiet one, plus your n8n server.

Setup

  1. Read the 'Texting, insurance and storm rules we design around' section on the roofing hub first.
  2. In Twilio, forward calls to your office line with <Dial> (a TwiML Bin or Studio flow) and set the Dial action URL to 'mss-f2-call'. When the DialCallStatus is no-answer, busy, failed or canceled, the caller gets the text-back.
  3. Texts need a Twilio number with an approved A2P 10DLC campaign (US carriers block unregistered business texts). Point the number's incoming-SMS webhook at the recipe's SMS webhook and set TWILIO_AUTH_TOKEN and PUBLIC_WEBHOOK_BASE so X-Twilio-Signature is checked. ROOF_TEXT_START_HOUR / ROOF_TEXT_END_HOUR (default 8 and 21) set the window, applied in the homeowner's time zone (from the job's state). This recipe's SMS webhook is 'mss-f2-sms'.
  4. In JobNimbus, create an API key (Settings > API) and set JN_API_KEY. The workflow reads jobs and contacts through the JobNimbus API (filters on status and date_status_change) and writes notes and tasks. JobNimbus's API docs we read don't document webhook events or rate limits, so the workflow polls and still waits and retries when it gets HTTP 429. New callers become contacts with status Lead (no text consent is assumed beyond this conversation).
  5. Set COMPANY_NAME, COMPANY_PHONE, COMPANY_ADDRESS, COMPANY_LICENSE, COMPANY_TZ, ROOF_EMAIL_FROM, ROOF_OFFICE_EMAIL and ROOF_OFFICE_PHONE from .env.example. Every message names your company; check what your state requires on written communications. ROOF_ONCALL_PHONE gets active-leak alerts at any hour; the storm-queue digest runs hourly from 8 a.m. to 8 p.m.
  6. Create the Sheets for missed calls, the storm queue and opt-outs, and swap the mock sheet URL for n8n's Google Sheets node.
  7. Call your number from your own cell and let it ring out before switching on. The workflow also has a manual 'run now' webhook used by our tests. Delete it, or put it behind n8n's header authentication, before you go live.

Download

Download roofing-storm-missed-call-text-back.zip

Contains the n8n workflow, 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. JobNimbus (public API), AccuLynx (API v2 and webhooks), CompanyCam (Public API v1 and webhooks), Twilio, Google Sheets and the email sender (Resend) were replaced by a local mock server built from their official API docs: it checks the same request shapes, authentication headers and filters, pages results (CompanyCam cursors), signs webhooks the way Twilio and CompanyCam do, and returns HTTP 429 with Retry-After. A frozen test clock checks the 8 a.m.-9 p.m. texting window in the homeowner's time zone. These recipes use no AI model; every decision is a written rule. Homeowners, jobs and photos are invented. Verified with mocks; nothing was sent to a real person or account. How we test.

6/6 scenarios passed (run 2026-10-28)

PASSS1Missed call (no-answer): one text asking for address, ZIP and the word LEAK; missed-call row; wording passes the lint
PASSS2Answered call: nothing. Same caller missed again within 12 hours: logged, no second text. Forged signature: dropped
PASSS3New caller replies with address, ZIP and a leak: JobNimbus contact (Lead) + ACTIVE LEAK task, on-call phone texted, caller acknowledged, not queued
PASSS4Existing JobNimbus customer (Ortiz) misses us and replies without a leak: no duplicate contact, notes on her jobs, callback task, queued by ZIP
PASSS5Another new caller (JobNimbus answers 429 once), then the hourly digest emails the office the queue grouped by ZIP; next digest sends nothing
PASSS6STOP from a caller: opt-out row, no confirmation text; a later missed call from that number gets no text. A later message from a queued caller goes to the office

Actual output from the test run

Scenario S1: the text after a missed call (invented company). Names and numbers are invented.

Ridgeline Roofing (example): sorry we missed your call. Reply with your street address and ZIP code. If water is coming in right now, add the word LEAK. Reply STOP to opt out.

Verified with mocks

  • A missed call (no-answer) gets one text asking for address, ZIP and the word LEAK, and a missed-call row; the wording passes the claim and deductible lint.
  • An answered call sends nothing. The same caller missing us again within 12 hours is logged but not texted again. A forged Twilio signature is dropped.
  • A new caller replies with an address, ZIP and LEAK: JobNimbus contact (Lead) plus an 'ACTIVE LEAK' task, the on-call phone is texted and the caller is told someone on call has it.
  • An existing JobNimbus customer replies without a leak: no duplicate contact, notes on their jobs, a callback task and a place in the storm queue.
  • JobNimbus answers 429 once and the workflow retries. The hourly digest emails the office the queue grouped by ZIP; the next digest doesn't repeat it.
  • STOP: opt-out row, no extra confirmation (Twilio sends one); a later missed call from that number gets no text. A later message from someone already queued goes to the office.
  • Verified with mocks; fictional homeowners and jobs only.

Documented from official API docs only

Built to the vendor's documentation but not run against a live account. Check these on yours.

  • Twilio voice webhooks, <Dial> with action callbacks and DialCallStatus, Messages API and request signing (from Twilio's docs).
  • JobNimbus API: POST contacts, tasks and activities; GET contacts and jobs with filter (from JobNimbus's API docs; not run against a live account).

Limitations

  • It doesn't diagnose anything or promise a time. The texts only collect an address and whether water is coming in.
  • Callers who don't text back still need a call; the missed-call Sheet lists them.
  • Plain-English opt-outs ('stop texting me') are also recorded, but the TCPA lets people revoke consent in any reasonable way; train the office to log spoken requests too.
  • Built for JobNimbus. AccuLynx, Roofr and other CRMs are not built for this recipe, and we make no claim that it works with them.
  • No message says anything about deductibles, coverage or filing a claim, and none goes to an insurer or adjuster. Several states bar contractors from acting as public adjusters or interpreting policies (for example Texas Insurance Code 4102.163, Florida Statutes 489.147, Minnesota 325E.66, Colorado 6-22-105); check your state's rules. A message lint blocks a list of claim and deductible words before anything is sent.
  • Not legal advice and not a compliance guarantee. We designed around 47 CFR 64.1200 (texts only with consent you record, 8 a.m. to 9 p.m. in the homeowner's time zone, opt-out words honored) and around state rules that bar contractors from acting as public adjusters, but whether your use is lawful depends on your consent wording, your state and your city. Have a lawyer review the wording before you turn it on.