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
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.
- "Inspector will be there sometime between 8 and 4 … A failed inspection - even for no access- is $60." One contractor's experience. Source: r/electricians thread: what do you charge to pull permits? (Anecdote (Reddit); one contractor's experience)
- The City of Bellevue, WA bills an electrical reinspection at a one-hour minimum of $145. Source: City of Bellevue, WA: inspection, reinspection and overtime fees (City fee page)
- In MCE's 2026 survey of California electrification contractors (not only electricians), 35% of 40 respondents said inspection delays add cost and disrupt workflow. Source: MCE: Permitting Barriers in Residential Electrification (2026 contractor survey, PDF) (Utility program report; survey of 40 California electrification contractors)
- "A lot of people blow off final inspections but the town never closes the book on them … the open permit will surface." Source: Contractor Talk thread: permits issued, final inspections never scheduled (Forum anecdote)
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
| 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 |
| 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 |
| 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.
- 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).
- 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.
- 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)
| PASS | E1-01 | Day before the inspection at 4 pm: consented customer gets one reminder text with access tips and STOP line |
| PASS | E1-02 | Hourly run an hour later: no second reminder |
| PASS | E1-03 | Day before but before 4 pm: nothing sent yet |
| PASS | E1-04 | No written text consent: reminder goes by email instead, never by text |
| PASS | E1-05 | Run at 9:15 pm (outside 8 am-9 pm for an Illinois number): no text, the reminder goes by email |
| PASS | E1-06 | Shared opt-out list: after STOP no text (email instead); after a later START texts resume |
| PASS | E1-07 | No consent and no email: the office gets a 'call the customer' task instead |
| PASS | E1-08 | Failed inspection: office email with the inspector's comment and a Jobber job note; not repeated next hour |
| PASS | E1-09 | Accela record with 29 inspections (2 pages): reads both pages, flags the failed final with the inspector comment |
| PASS | E1-10 | Accela answers 429 with Retry-After: the run waits, retries and still flags the failed final |
| PASS | E1-11 | Accela lookup fails for one permit: the run keeps going (other reminders still sent) and the daily digest lists the failed lookup |
| PASS | E1-12 | 7 am digest: final not called 55 days after rough-in, permit expiring in 21 days; finished jobs left out; only once a day |
| PASS | E1-13 | Final passed: office close-out email and a short 'your final passed' email to the customer, once |
| PASS | E1-14 | Jobber access token expired: n8n refreshes it and the job note is still saved |
| PASS | E1-15 | Jobber THROTTLED: the note text is emailed to the office so nothing is lost |
| PASS | E1-16 | Twilio 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.