Home / Electricians / EV charger panel pre-check form: sort leads into likely fits / needs a look / likely upgrade

Electricians problem 4: EV-charger leads arrive without the facts needed to price them, and half need a panel conversation

EV charger panel pre-check form

Sort leads into likely fits / needs a look / likely upgrade

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

A short public form asks the main breaker size, open breaker spaces, which large electric loads the home has, and the distance from panel to parking. Written rules (not a load calculation) sort the lead into Tier A 'likely fits without a panel upgrade', Tier B 'needs a closer look' or Tier C 'likely needs a panel or service upgrade, or a load-management device'. The homeowner gets an automatic email that says plainly it's a pre-screen and a licensed electrician confirms on site. A text goes out only if they ticked the consent box, and only 8 a.m.-9 p.m. The workflow creates a Jobber client and request with all the answers and emails the office. Spam protection: a hidden honeypot field `company_website`, a signed form key (HMAC-SHA256) that expires after 24 hours, a minimum fill time, and 24-hour dedupe by phone or email.

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 who install Level 2 chargers and get web leads from homeowners.

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
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. Link to /webhook/mss-el4-form (it serves the form) or copy its HTML into your site, keeping the hidden form_ts, form_key and company_website fields. Set FORM_HMAC_SECRET to a long random string and FORM_MIN_SECONDS (3).
  8. Review the tier rules in build.py with your licensed electrician; they're deliberately conservative and they are not an NEC load calculation.

Download

Download ev-charger-panel-precheck-form.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.

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

PASSE4-01GET serves the form with a signed key and a hidden honeypot field, plain US English, no load-calc claim
PASSE4-02200 A, 3+ open spaces, 2 large loads: Tier A; thank-you page, Jobber client + request, homeowner email, text (consented), office email
PASSE4-03100 A service with electric heat, dryer, water heater: Tier C with the load-management option mentioned, no promises
PASSE4-04"I don't know" answers: Tier B (closer look), says why
PASSE4-05Honeypot company_website filled: same thank-you page, nothing sent, nothing in Jobber
PASSE4-06Forged form key: 400 'reload the form', nothing saved or sent
PASSE4-07Form open for over 24 h: 400 'reload', nothing saved or sent
PASSE4-08Submitted 1 second after the page loaded (bot speed): fake thank-you, nothing saved or sent
PASSE4-09No phone and no email: 400 asks for contact details, nothing saved
PASSE4-10Same phone/email again within 24 h: 'we already have your request', no duplicate Jobber client or emails
PASSE4-11No text consent checkbox: email only, never a text
PASSE4-12Submitted at 10:30 pm: email now, no text (8 am-9 pm rule)
PASSE4-13HTML in the name is escaped on the thank-you page
PASSE4-14Jobber access token expired: n8n refreshes it, the lead is saved
PASSE4-15Jobber THROTTLED on clientCreate: homeowner still gets the email, the office email says 'NOT in Jobber, add it by hand' with all answers
PASSE4-16Email API and Twilio answer 429 once: retried after Retry-After, each message sent exactly once

Verified with mocks

  • GET serves the form with a signed key and a hidden honeypot field, plain US English, no load-calc claim
  • 200 A, 3+ open spaces, 2 large loads: Tier A; thank-you page, Jobber client + request, homeowner email, text (consented), office email
  • 100 A service with electric heat, dryer, water heater: Tier C with the load-management option mentioned, no promises
  • "I don't know" answers: Tier B (closer look), says why
  • Honeypot company_website filled: same thank-you page, nothing sent, nothing in Jobber
  • Forged form key: 400 'reload the form', nothing saved or sent
  • Form open for over 24 h: 400 'reload', nothing saved or sent
  • Submitted 1 second after the page loaded (bot speed): fake thank-you, nothing saved or sent
  • No phone and no email: 400 asks for contact details, nothing saved
  • Same phone/email again within 24 h: 'we already have your request', no duplicate Jobber client or emails
  • No text consent checkbox: email only, never a text
  • Submitted at 10:30 pm: email now, no text (8 am-9 pm rule)
  • HTML in the name is escaped on the thank-you page
  • Jobber access token expired: n8n refreshes it, the lead is saved
  • Jobber THROTTLED on clientCreate: homeowner still gets the email, the office email says 'NOT in Jobber, add it by hand' with all answers
  • Email API and Twilio answer 429 once: retried after Retry-After, each message sent 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

  • Homeowners often don't know their breaker size; those leads land in Tier B by design.
  • It's not a load calculation and must never be presented as one. The homeowner email says so.
  • Jobber field names (RequestCreateInput.details, phone description) are from the docs and weren't checked against a live account.
  • 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.