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
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.
- PPL Electric asks for a "Minimum of 12 weeks before your planned work" for a service upgrade. Your utility's timeline may be very different. Source: PPL Electric: timeline for service requests (Utility page)
- Roseville, CA requires the green tag (passed inspection) before the meter is set on a service upgrade. Source: City of Roseville, CA: residential electric service upgrade process (PDF) (City handout)
- "We just use an Excel spreadsheet … a line for follow up notes." We found no reliable public close-rate figure, so we cite none. Source: Mike Holt forum thread: bid tracking database (Forum anecdote)
- The IRS says the 25C credit isn't allowed for property placed in service after December 31, 2025, so the follow-ups never mention tax credits. Source: IRS FAQ: modification of sections 25C, 25D, 25E, 30C, 30D, 45L, 45W and 179D under Public Law 119-21 (IRS guidance)
- DOE lists state-run panel rebates of up to $4,000 for eligible households; the recipe links your state's program only if you add the link. Source: U.S. Department of Energy: Home Upgrades (state-run rebates) (Federal agency page)
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
| Tool | Official 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 |
| n8n | Community 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
- 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.
- 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.
- 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.
- 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.
- Company details: COMPANY_NAME, COMPANY_PHONE, COMPANY_ADDRESS, COMPANY_LICENSE, COMPANY_TZ. Every message names your company.
- 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.
- 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.
- 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.
- PANEL_TOUCH_DAYS (2,6,12), PANEL_HANDOFF_DAY (21), optional REBATE_PROGRAM_URL.
- 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)
| PASS | E2-01 | Day 1 after the quote was sent: nothing yet |
| PASS | E2-02 | 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 |
| PASS | E2-03 | Same day, next hourly run: no duplicate |
| PASS | E2-04 | Day 6: touch #2 explains install day (power off) and inspection, links the configured rebate page, never mentions tax credits |
| PASS | E2-05 | Day 21: automatic follow-ups end and the salesperson gets a 'call them personally' email; customers get nothing |
| PASS | E2-06 | 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 |
| PASS | E2-06b | Next morning 8 am: the deferred text goes out once |
| PASS | E2-07 | Workflow switched on late (day 9): only the touch that is due now (#2) goes out, not a burst |
| PASS | E2-08 | Customer texted us back after the quote: no automatic touch, the office is told to call |
| PASS | E2-09 | Customer is on the shared STOP list: no text, follow-ups stop, office informed |
| PASS | E2-10 | 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 |
| PASS | E2-11 | Same webhook delivered twice (at-least-once): nothing happens the second time |
| PASS | E2-12 | After approval the follow-up sequence stops for that quote |
| PASS | E2-13 | Forged X-Jobber-Hmac-SHA256: rejected before any Jobber call |
| PASS | E2-14 | Approved quote that is not panel/service work (recessed lights): no checklist, no emails |
| PASS | E2-15 | Jobber token expired during the webhook: refreshed, quote read and checklist note saved |
| PASS | E2-16 | Jobber THROTTLED on the hourly quote read: one office notice, no messages; the next hour works normally |
| PASS | E2-17 | Twilio 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.