Home / Electricians / Panel and service upgrade quote follow-up for Jobber, with permit and utility steps

Electricians problem 2: Panel and service-upgrade quotes go quiet, and approved ones stall waiting on the utility and the permit

Panel and service upgrade quote follow-up for Jobber, with permit and utility steps

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

Every hour from 8 a.m. to 8 p.m. the workflow reads open Jobber quotes and picks the panel and service-upgrade ones (by title or line items). On days 2, 6 and 12 after the quote was sent, the customer gets one short follow-up from the estimator: a text if Jobber says the client accepts texts, otherwise an email. Each message explains a real step (a permit and a utility disconnect appointment, a day with the power off, an inspection) instead of a generic 'just checking in'. It stops when the customer texts back, opts out, or the quote is approved or closed. On day 21 the estimator gets a 'call them yourself' email instead of a fourth message. When Jobber sends a signed QUOTE_APPROVED webhook, the workflow re-reads the quote and then adds a permit-and-utility checklist note to the quote, adds a row to the permit log, emails the customer 'what happens next' and tells the office. A rebate sentence goes in only if you set `REBATE_PROGRAM_URL` to your state's program page. It never mentions tax credits.

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 on Jobber who quote 100 A to 200 A upgrades, EV-ready service changes and subpanels.

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
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. In your Jobber app, subscribe to the quote-approved webhook and point it at /webhook/mss-el2-jobber. Set JOBBER_WEBHOOK_SECRET to the app's client secret (the signature is base64 HMAC-SHA256 of the raw body). Topic names are from Jobber's docs; confirm them in the app settings.
  8. UTILITY_NAME and UTILITY_LEAD_TIME (plain words, e.g. 'several weeks') drive the text. Check your utility's own timeline page; PPL, for example, asks for at least 12 weeks for a service upgrade.
  9. PANEL_TOUCH_DAYS (2,6,12), PANEL_HANDOFF_DAY (21), optional REBATE_PROGRAM_URL.
  10. The hazard-text recipe (E3) writes the inbound_texts and sms_optouts sheets this recipe reads. Without E3, point your Twilio inbound webhook at something that fills them, or replies won't stop the sequence.

Download

Download panel-upgrade-quote-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 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.

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

PASSE2-01Day 1 after the quote was sent: nothing yet
PASSE2-02Day 2: panel quotes get touch #1 (text if the client allows texts, else email) about permit + utility lead time; the recessed-lighting quote is skipped
PASSE2-03Same day, next hourly run: no duplicate
PASSE2-04Day 6: touch #2 explains install day (power off) and inspection, links the configured rebate page, never mentions tax credits
PASSE2-05Day 21: automatic follow-ups end and the salesperson gets a 'call them personally' email; customers get nothing
PASSE2-069:30 pm run: no text to the Illinois customer (TCPA 8 am-9 pm), the email-only client still gets email; the text goes out next morning
PASSE2-06bNext morning 8 am: the deferred text goes out once
PASSE2-07Workflow switched on late (day 9): only the touch that is due now (#2) goes out, not a burst
PASSE2-08Customer texted us back after the quote: no automatic touch, the office is told to call
PASSE2-09Customer is on the shared STOP list: no text, follow-ups stop, office informed
PASSE2-10Signed QUOTE_APPROVED webhook: re-queries the quote, adds a permit/utility checklist note in Jobber, a permit-log row, a 'next steps' email and an office email
PASSE2-11Same webhook delivered twice (at-least-once): nothing happens the second time
PASSE2-12After approval the follow-up sequence stops for that quote
PASSE2-13Forged X-Jobber-Hmac-SHA256: rejected before any Jobber call
PASSE2-14Approved quote that is not panel/service work (recessed lights): no checklist, no emails
PASSE2-15Jobber token expired during the webhook: refreshed, quote read and checklist note saved
PASSE2-16Jobber THROTTLED on the hourly quote read: one office notice, no messages; the next hour works normally
PASSE2-17Twilio and email API both answer 429 once: each send waits per Retry-After and goes out exactly once

Actual output from the test run

Scenario E2-02: the day-2 follow-up on a panel quote (invented customer and company). Names and numbers are invented.

Hi Maria, it's Tom at Brightline Electric. Any questions on the quote for your 200A panel upgrade with new meter base? Heads-up on timing: this kind of job needs a permit and an appointment with Example Power Co. to disconnect and reconnect power, and the utility side can take several weeks, so we start that paperwork as soon as you approve. Quote: https://clienthub.getjobber.com/client_hubs/mock/quotes/2201 Reply STOP to opt out. - Brightline Electric

Verified with mocks

  • Day 1 after the quote was sent: nothing yet
  • Day 2: panel quotes get touch #1 (text if the client allows texts, else email) about permit + utility lead time; the recessed-lighting quote is skipped
  • Same day, next hourly run: no duplicate
  • Day 6: touch #2 explains install day (power off) and inspection, links the configured rebate page, never mentions tax credits
  • Day 21: automatic follow-ups end and the salesperson gets a 'call them personally' email; customers get nothing
  • 9:30 pm run: no text to the Illinois customer (TCPA 8 am-9 pm), the email-only client still gets email; the text goes out next morning
  • Next morning 8 am: the deferred text goes out once
  • Workflow switched on late (day 9): only the touch that is due now (#2) goes out, not a burst
  • Customer texted us back after the quote: no automatic touch, the office is told to call
  • Customer is on the shared STOP list: no text, follow-ups stop, office informed
  • Signed QUOTE_APPROVED webhook: re-queries the quote, adds a permit/utility checklist note in Jobber, a permit-log row, a 'next steps' email and an office email
  • Same webhook delivered twice (at-least-once): nothing happens the second time
  • After approval the follow-up sequence stops for that quote
  • Forged X-Jobber-Hmac-SHA256: rejected before any Jobber call
  • Approved quote that is not panel/service work (recessed lights): no checklist, no emails
  • Jobber token expired during the webhook: refreshed, quote read and checklist note saved
  • Jobber THROTTLED on the hourly quote read: one office notice, no messages; the next hour works normally
  • Twilio and email API both answer 429 once: each send waits per Retry-After and goes out exactly once
  • 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 panel/service match is a keyword rule on the quote title and line items; adjust PANEL_RE to your naming.
  • Jobber's own quote follow-ups may already be on; switch one off so customers don't get both (the recipe skips clients with receivesQuoteFollowUps=false).
  • We don't verify incentive eligibility; the rebate link is a pointer only.
  • 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.