Home / Electricians / Electrical permit & inspection tracker: day-before reminders, failed-inspection alerts, forgotten finals

Electricians problem 1: Inspections fail for no-access, finals never get called, and permits quietly expire

Electrical permit & inspection tracker

Day-before reminders, failed-inspection alerts, forgotten finals

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

Every hour the workflow reads your permit log (a Google Sheet the office fills in when a permit is pulled) and, if your city uses Accela, the inspection results from Accela Construct. The afternoon before an inspection, the homeowner gets one reminder (text with consent, otherwise email, otherwise a 'call them' task for the office) with access tips: unlock the gate, clear the panel, keep pets in. A failed inspection emails the office with the inspector's comment and adds a Jobber job note. A passed final sends a close-out email to the office and a short note to the customer. At 7 a.m. a digest lists finals not called 30+ days after rough-in, permits expiring within 30 days and any Accela lookups that failed.

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

US residential electrical contractors (1-25 people) who pull several permits a week and track them in a spreadsheet or in their heads.

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
Accela Construct API (optional, only if your city runs Accela)No public price. Accela sells to cities and counties, not contractors; the lookup works only if your city lets outside apps read inspections 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. Create the permits sheet with the columns listed at the top of the main Code node in build.py (job_id, customer_name, customer_phone, customer_email, sms_ok, state, address, permit_no, ahj, permit_expires, accela_record, inspection_type, inspection_date, inspection_window, status, inspector_comment, rough_passed).
  8. Accela is optional and per-city. Many AHJs don't use Accela, and those that do may not expose inspections to third-party apps. Set MSS_ACCELA_API=https://apis.accela.com/v4, ACCELA_APP_ID, ACCELA_ACCESS_TOKEN only if your AHJ allows it; otherwise the office updates status in the sheet.
  9. Timing: INSPECTION_REMINDER_HOUR (16), PERMIT_DIGEST_HOUR (7), FINAL_STALE_DAYS (30), PERMIT_EXPIRY_WARN_DAYS (30).

Download

Download electrical-permit-inspection-tracker.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)

PASSE1-01Day before the inspection at 4 pm: consented customer gets one reminder text with access tips and STOP line
PASSE1-02Hourly run an hour later: no second reminder
PASSE1-03Day before but before 4 pm: nothing sent yet
PASSE1-04No written text consent: reminder goes by email instead, never by text
PASSE1-05Run at 9:15 pm (outside 8 am-9 pm for an Illinois number): no text, the reminder goes by email
PASSE1-06Shared opt-out list: after STOP no text (email instead); after a later START texts resume
PASSE1-07No consent and no email: the office gets a 'call the customer' task instead
PASSE1-08Failed inspection: office email with the inspector's comment and a Jobber job note; not repeated next hour
PASSE1-09Accela record with 29 inspections (2 pages): reads both pages, flags the failed final with the inspector comment
PASSE1-10Accela answers 429 with Retry-After: the run waits, retries and still flags the failed final
PASSE1-11Accela lookup fails for one permit: the run keeps going (other reminders still sent) and the daily digest lists the failed lookup
PASSE1-127 am digest: final not called 55 days after rough-in, permit expiring in 21 days; finished jobs left out; only once a day
PASSE1-13Final passed: office close-out email and a short 'your final passed' email to the customer, once
PASSE1-14Jobber access token expired: n8n refreshes it and the job note is still saved
PASSE1-15Jobber THROTTLED: the note text is emailed to the office so nothing is lost
PASSE1-16Twilio 429 with Retry-After: the reminder waits and is sent once

Actual output from the test run

Scenario E1-01: the reminder text the afternoon before an inspection (invented customer and company). Names and numbers are invented.

Reminder from Brightline Electric: your service change inspection at 14 Elm St, Springfield IL is tomorrow, Tuesday Nov 10, 8 am - noon. Please make sure the inspector can get to the panel and the work areas (gates unlocked, about 3 feet clear in front of the panel, pets put away). Reply STOP to opt out. - Brightline Electric

Verified with mocks

  • Day before the inspection at 4 pm: consented customer gets one reminder text with access tips and STOP line
  • Hourly run an hour later: no second reminder
  • Day before but before 4 pm: nothing sent yet
  • No written text consent: reminder goes by email instead, never by text
  • Run at 9:15 pm (outside 8 am-9 pm for an Illinois number): no text, the reminder goes by email
  • Shared opt-out list: after STOP no text (email instead); after a later START texts resume
  • No consent and no email: the office gets a 'call the customer' task instead
  • Failed inspection: office email with the inspector's comment and a Jobber job note; not repeated next hour
  • Accela record with 29 inspections (2 pages): reads both pages, flags the failed final with the inspector comment
  • Accela answers 429 with Retry-After: the run waits, retries and still flags the failed final
  • Accela lookup fails for one permit: the run keeps going (other reminders still sent) and the daily digest lists the failed lookup
  • 7 am digest: final not called 55 days after rough-in, permit expiring in 21 days; finished jobs left out; only once a day
  • Final passed: office close-out email and a short 'your final passed' email to the customer, once
  • Jobber access token expired: n8n refreshes it and the job note is still saved
  • Jobber THROTTLED: the note text is emailed to the office so nothing is lost
  • Twilio 429 with Retry-After: the reminder waits and is sent 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.
  • Accela Construct v4 record inspections endpoint and paging (from Accela's developer docs; not run against a city's live Accela).

Limitations

  • It doesn't schedule inspections; each AHJ has its own portal or phone line.
  • Accela access depends on each agency's app settings; we only tested against a mock built from the docs.
  • Permit expiry rules differ by AHJ; you enter the date.
  • 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.