Home / Roofing Contractors / Roofing estimate follow-up for JobNimbus: 3 touches that stop on reply, opt-out or status change
Roofing Contractors problem 1: Estimates sit in 'Estimate Sent' and nobody follows up
Roofing estimate follow-up for JobNimbus
3 touches that stop on reply, opt-out or status change
Every 15 minutes the workflow reads JobNimbus jobs in 'Estimate Sent'. On days 2, 7 and 14 after the status changed, the homeowner gets one short follow-up from the sales rep: a text if the contact has recorded text consent, otherwise an email, and only between 8 a.m. and 9 p.m. in the homeowner's time zone. It stops as soon as the homeowner replies, opts out or the job's status changes. On day 21 the rep gets a JobNimbus task instead of a fourth message. Every message is logged as a JobNimbus note.
The problem
An estimate nobody follows up on is the cheapest job to lose. The figures below are an anecdote and a trade survey, so treat them as indications.
- A roofer on r/Roofing says 65-75% of their estimates never convert. That's one contractor's estimate, not a measured rate. Source: r/Roofing thread on estimates that never convert (Anecdote (Reddit); one contractor's estimate, not a measured rate)
- Roofing Contractor's 2025 State of the Industry survey: 35% of residential roofers named low-ball pricing a top concern, behind the economy (57%), material costs (47%) and finding workers (38%). Follow-up won't fix price, but it keeps you in the conversation. Source: Roofing Contractor: 2025 State of the Roofing Industry report (Trade-magazine contractor survey)
- JobNimbus Automations can already send texts when an estimate is sent (with Engage, its texting add-on), and its help page says they send only between 8 a.m. and 9 p.m. in the company's time zone. If you use them, you may not need this recipe. This one adds the homeowner's own time zone, stop-on-reply across text and email, and a deductible and claim word check. Source: JobNimbus help: How Do I Automate Text Messages? (Vendor documentation)
Background reading: Roofing estimate follow-up texts: a 3-touch sequence that stops when it should
Who it's for
US residential roofing companies (1-30 people) on JobNimbus whose reps send estimates and then get busy with the next storm.
Tools and monthly cost
| Tool | Official price |
|---|---|
| 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 |
| 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 |
| 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 |
| 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 |
Example month: Illustrative arithmetic, not a measured result. Assume 40 estimates a month, 25 with text consent: at most about 75 texts plus 20 replies, about 2 segments each = 190 segments x $0.0083 = $1.58, plus carrier fees of about $0.65-$0.95. Twilio number $1.15 and A2P 10DLC $1.50-$10 a month. Fewer than 100 emails fit Resend's free tier. About $5-$14 a month plus your n8n server. JobNimbus is the CRM you already pay for.
Setup
- Read the 'Texting, insurance and storm rules we design around' section on the roofing hub first.
- 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. F1_ESTIMATE_STATUS (default 'Estimate Sent') names the status to watch; F1_TOUCH_DAYS (default 2,7,14) and F1_HANDOFF_DAY (21) set the timing.
- Record text consent on the JobNimbus contact in a custom field (JN_CONSENT_FIELD, default 'SMS Consent', value Yes). Homeowners without it get email only.
- 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-f1-sms'; replies and opt-outs are matched to the contact by phone number.
- 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.
- Run it against a test contact with your own phone and email 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-estimate-follow-up.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.
7/7 scenarios passed (run 2026-10-28)
| PASS | F1 | Due but outside 8 a.m.-9 p.m. homeowner time (9:30 p.m. Missouri): nothing goes to homeowners; the job with no phone or email becomes a rep task (internal, any hour) |
| PASS | F2 | Day 2 at 9 a.m. (JobNimbus answers 429 twice first): text to the consented homeowner, emails to the others, late import gets only its latest due touch, no duplicate rep task, one JobNimbus note per message |
| PASS | F3 | Next run 15 minutes later: nothing is sent twice |
| PASS | F4 | Ortiz replies (office alerted, JobNimbus note); Natarajan texts 'stop texting me' (opt-out row, consent field set to No, one confirmation); forged signature ignored |
| PASS | F5 | Day 7: replied, opted-out and status-changed jobs stop; only Henning gets email #2 |
| PASS | F6 | Message lint: a rep's custom line promising to cover the deductible blocks the text; office alerted, JobNimbus note explains |
| PASS | F7 | Day 14 then day 21: Henning gets email #3, then a JobNimbus task for the rep; no 4th message |
Actual output from the test run
Scenario F2: the day-2 text to a homeowner with recorded consent (invented homeowner and company). Names and numbers are invented.
Hi Megan, this is Casey Wynn with Ridgeline Roofing (example). Just checking that you got the estimate for 12 Example Ct. Any questions? Reply here or call +15555550200. Reply STOP to opt out.
Verified with mocks
- Day 2 at 9 a.m. (JobNimbus answers 429 twice first): a text to the homeowner with consent, emails to the others, one JobNimbus note per message. A job imported late gets only its latest due touch, not a burst.
- Outside 8 a.m.-9 p.m. in the homeowner's time zone (9:30 p.m. in Missouri), nothing goes to homeowners; a job with no phone or email becomes a rep task.
- A run 15 minutes later sends nothing twice.
- A reply alerts the office and adds a JobNimbus note; 'stop texting me' (not just STOP) records the opt-out, sets the consent field to No and sends one confirmation. A forged Twilio signature is ignored.
- Day 7: jobs that replied, opted out or changed status get nothing; day 14: the third and last email; day 21: a JobNimbus task for the rep, never a fourth message.
- Message lint: a rep's custom line promising to cover the deductible blocks the text; the office is alerted and a JobNimbus note explains why.
- 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.
- JobNimbus API: GET jobs and contacts with filter, POST activities (notes) and tasks, PUT contacts (from JobNimbus's API docs and Postman collection; not run against a live account).
- Twilio Messages API and inbound-SMS webhook signing (from Twilio's docs). Resend email API (from Resend's docs). Google Sheets: tested against a mock sheet endpoint.
Limitations
- Fixed wording only. It doesn't answer questions about the estimate; the point is to get the homeowner talking to the rep.
- It can't tell why a homeowner went quiet. A homeowner who signed on paper but whose job status wasn't updated will still get the next touch, so keep statuses current.
- Time zones come from the job's state; a state with two time zones waits until it is 8 a.m. in both.
- 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.