Home / Electricians / After-hours electrical hazard text triage: page on-call for real hazards, not for 'it can wait'

Electricians problem 3: After-hours calls mix real hazards (smoke, burning smell, half the house dim) with jobs that can wait until morning

After-hours electrical hazard text triage

Page on-call for real hazards, not for 'it can wait'

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

Customers text your business number (or miss a call and get a text-back). A written rule list, not AI, sorts each text. Smoke, burning smell, sparks or a hot panel get '911 first' advice; the on-call electrician gets paged once and an urgent Jobber request is opened. A downed line gets 'call 911 first, then the utility, and stay at least 35 feet away', with no page. Half the house dim or out (a possible lost neutral) gets 'call the utility first' and a page. A whole-house outage first gets the utility outage map, and the page goes out only if the customer replies YES. Anything else gets '911 first if you see smoke or sparks, otherwise the office will follow up' and a callback request in Jobber. Every safety reply leads with 911, and no reply promises a response time. STOP is respected and shared with the other recipes.

The problem

These are a forum post, a city fee page and a utility's timeline, so treat them as indications, not measured rates.

Who it's for

Electrical contractors offering emergency service with one person on call.

Tools and monthly cost

ToolOfficial price
Jobber (you probably already pay for it)Core $29 / month billed annually ($39 with a 1-year monthly commitment, $49 with no commitment); Connect from $99; Grow from $149; Plus from $399 (5 users). Jobber's developer docs say custom API integrations are only for approved customers, and the pricing page doesn't say which plan an API app needs pricing page
Twilio US local phone number$1.15 / month pricing page
Twilio US SMS, sent or received$0.0083 per segment, plus carrier fees on outbound texts of $0.0035-$0.005 per segment (AT&T $0.0035, T-Mobile $0.0045, Verizon $0.005) pricing page
Twilio voice, receiving calls (missed-call text-back)$0.0085 / minute inbound on a local number pricing page
A2P 10DLC registration (required to text US customers from a local number)One-time: $4.50 brand registration (Standard brands add $41.50 secondary vetting) and $15 campaign vetting. Monthly: $1.50-$10 per campaign by use case ($2 for sole proprietors) pricing page
Resend (sends the emails; any email API that accepts an Idempotency-Key works)Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 emails pricing page
Google Sheets (permit log, opt-out list, change orders)Free with a Google Account; Google Workspace is optional pricing page
n8nCommunity Edition: free if you self-host (you pay for the server). n8n Cloud: Starter EUR 20 / month or Pro EUR 50 / month, billed annually pricing page

Example month: Illustrative arithmetic, not a measured result. One local number sending 200 single-segment texts and receiving 200 a month, at the highest listed carrier fee ($0.005): 200 x ($0.0083 + $0.005) + 200 x $0.0083 + $1.15 number = $5.47 a month in Twilio usage, plus the A2P 10DLC campaign fee ($1.50-$10 a month) and one-time registration ($4.50 brand + $15 campaign vetting). Emails stay inside Resend's free tier at this volume. n8n Cloud Starter (EUR 20 a month) or your own server, and your Jobber plan, come on top. Your volumes will differ.

Setup

  1. Jobber: create a Jobber developer app, add an n8n OAuth2 credential (authorization URL https://api.getjobber.com/api/oauth/authorize, token URL https://api.getjobber.com/api/oauth/token). n8n refreshes the token and stores the rotated refresh token. Set MSS_JOBBER_URL=https://api.getjobber.com/api/graphql. The header X-JOBBER-GRAPHQL-VERSION: 2026-09-25 is pinned.
  2. Texts need a Twilio number on an approved A2P 10DLC campaign. Set TWILIO_ACCOUNT_SID, TWILIO_BASIC_AUTH (base64 of SID:auth token), TWILIO_FROM. Texts only go out 8 a.m.-9 p.m. in the customer's state (ELEC_TEXT_START_HOUR / ELEC_TEXT_END_HOUR) and only with recorded consent.
  3. Email: MSS_EMAIL_API (e.g. https://api.resend.com), EMAIL_API_KEY, ELEC_EMAIL_FROM, ELEC_OFFICE_EMAIL. Every send carries an Idempotency-Key, so a retried run never emails twice.
  4. Google Sheet stand-in: MSS_SHEET_URL points at the shared sheets (sms_optouts, inbound_texts, permits, change_orders). In production, swap these HTTP calls for n8n's Google Sheets node or keep a tiny sheet API.
  5. Company details: COMPANY_NAME, COMPANY_PHONE, COMPANY_ADDRESS, COMPANY_LICENSE, COMPANY_TZ. Every message names your company.
  6. Remove the test-only mss-*-tick webhooks (or put them behind n8n header auth) and make sure MSS_TEST_CLOCK is NOT set in production.
  7. Point the Twilio number's incoming SMS webhook at /webhook/mss-el3-sms and the voice status callback at /webhook/mss-el3-call. Set TWILIO_AUTH_TOKEN and PUBLIC_WEBHOOK_BASE exactly as Twilio sees the URL, or every signature check fails.
  8. ONCALL_PHONE, UTILITY_NAME, UTILITY_EMERGENCY_PHONE, UTILITY_OUTAGE_URL, office hours (OPEN_MINUTE, CLOSE_MINUTE, OPEN_LABEL), PAGE_DEDUPE_MINUTES.
  9. Have your attorney or insurer review the texting consent and hazard wording in build.py before going live.

Download

Download electrical-hazard-text-triage.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 on an isolated test instance and run end to end. Jobber (GraphQL, OAuth2 and webhooks), Twilio, Accela Construct v4, the email API (Resend-style) and Google Sheets were replaced by a local mock server built from the vendors' public docs: same request shapes and auth headers, HMAC-signed webhooks, HTTP 429 with Retry-After, Jobber THROTTLED errors, and expiring OAuth tokens with refresh-token rotation. A frozen test clock checks the 8 a.m.-9 p.m. texting window. These recipes use no AI model; every decision is a written rule. Customers, jobs, permits and addresses are invented. Verified with mocks; nothing was sent to a real person, account or permit portal. How we test.

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

PASSE3-01Forged X-Twilio-Signature: nothing is sent, request counted as rejected
PASSE3-02Smoke from an outlet at 11:40 pm: 911 advice to the customer, on-call paged, urgent Jobber request
PASSE3-03Second hazard text 10 minutes later: no second page, customer told on-call is already paged, Jobber client reused
PASSE3-04Downed line (even when sparking): stay 35 feet away, call 911 and the utility; no on-call page; office FYI email
PASSE3-05Half the house out / dim-bright lights: lost-neutral warning, utility first, on-call paged
PASSE3-06Whole-house outage: outage-map check first (no page); YES within 2 h pages on-call and opens a Jobber request
PASSE3-07Non-urgent text at 10 pm: 911 line first, 'the office opens at 7:30 am and will follow up' (no time promise), morning callback request in Jobber, no page
PASSE3-08Non-urgent text at 10:15 am on a weekday: 911 line first, 'the office will follow up' with no response-time promise
PASSE3-09STOP: no reply from us (Twilio confirms STOP itself); a later hazard text still pages on-call but never texts the opted-out number
PASSE3-10Missed call: one text-back with the 911 line and STOP notice; a repeat within 30 min and answered calls send nothing
PASSE3-11Twilio answers 429 with Retry-After: the send waits and retries, both texts still go out
PASSE3-12Jobber access token expired: n8n refreshes (rotated refresh token saved) and the request is still created
PASSE3-13Jobber THROTTLED (query cost): the lead is emailed to the office instead of being lost
PASSE3-14Webhook answers Twilio at once with empty TwiML (text/xml), so Twilio sends nothing extra

Actual output from the test run

Scenario E3-02: the reply to a smoke-from-an-outlet text at 11:40 p.m. (invented customer). Names and numbers are invented.

If there is smoke, fire, or anyone got shocked, call 911 first and get everyone out. Don't touch the panel or anything wet. We're also paging our on-call electrician. - Brightline Electric

Verified with mocks

  • Forged X-Twilio-Signature: nothing is sent, request counted as rejected
  • Smoke from an outlet at 11:40 pm: 911 advice to the customer, on-call paged, urgent Jobber request
  • Second hazard text 10 minutes later: no second page, customer told on-call is already paged, Jobber client reused
  • Downed line (even when sparking): stay 35 feet away, call 911 and the utility; no on-call page; office FYI email
  • Half the house out / dim-bright lights: lost-neutral warning, utility first, on-call paged
  • Whole-house outage: outage-map check first (no page); YES within 2 h pages on-call and opens a Jobber request
  • Non-urgent text at 10 pm: 911 line first, 'the office opens at 7:30 am and will follow up' (no time promise), morning callback request in Jobber, no page
  • Non-urgent text at 10:15 am on a weekday: 911 line first, 'the office will follow up' with no response-time promise
  • STOP: no reply from us (Twilio confirms STOP itself); a later hazard text still pages on-call but never texts the opted-out number
  • Missed call: one text-back with the 911 line and STOP notice; a repeat within 30 min and answered calls send nothing
  • Twilio answers 429 with Retry-After: the send waits and retries, both texts still go out
  • Jobber access token expired: n8n refreshes (rotated refresh token saved) and the request is still created
  • Jobber THROTTLED (query cost): the lead is emailed to the office instead of being lost
  • Webhook answers Twilio at once with empty TwiML (text/xml), so Twilio sends nothing extra
  • Verified with mocks; invented customers, jobs, permits and addresses only.

Documented from official API docs only

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

  • Jobber GraphQL field and mutation names, webhook topics and the X-Jobber-Hmac-SHA256 signature; Jobber OAuth refresh-token rotation (from Jobber's developer docs; not run against a live account).
  • Twilio request signing, Messages API, 429 behavior and built-in STOP handling (from Twilio's docs). The email API follows Resend's documented request shape.

Limitations

  • The rules can't see the hazard. When in doubt they escalate, and every safety reply leads with 911.
  • No message promises how fast anyone will call back; how quickly your on-call electrician responds is up to your shop.
  • Replies to a customer's own text go out at any hour (the customer started the conversation); proactive texts in the other recipes respect 8 a.m.-9 p.m.
  • Twilio handles STOP/START confirmations itself on the standard opt-out keywords.
  • Written and tested for Jobber's API only. Housecall Pro, ServiceTitan and other field-service software are not built for this recipe, and we make no claim that it works with them. Jobber's developer docs say custom integrations are only possible for approved Jobber customers, so check with Jobber first.
  • Not legal advice and not a compliance guarantee. Texts go only to customers with recorded consent, only between 8 a.m. and 9 p.m. in the customer's time zone, and plain-English opt-outs are honored (47 CFR 64.1200 is the federal rule we design around). Have your attorney or insurer review texting consent and safety wording before going live; some states are stricter than federal law.