How to Track Permit Compliance Across Service Jobs
Tracking permit compliance across service jobs means putting permit state on the job record, reviewing the open set on a cadence, and treating final inspection as a tracked step rather than a remembered one. The office that can answer "what is still open?" without opening a spreadsheet is the office that is actually tracking compliance. Everything else is hoping nothing surfaces at resale.
Most HVAC and plumbing shops do not fail compliance because someone decided to skip a permit. They fail it because the permit got pulled and then fell off the list — the list lived in one inbox, one spreadsheet, or one person's head. This is a how-to for putting that list where the work already lives, and keeping it current as jobs move.
What "tracking permit compliance" actually means
Compliance tracking is not a dashboard for its own sake. It is the ability to answer four questions about any job, and about the whole book of work:
- Was a permit required, and was it pulled?
- Has it issued, or is it still in review?
- Has the final inspection been scheduled, passed, and filed?
- If energy code testing applies, is the CF-3R on record?
If those answers live in three systems, you do not have tracking. You have archaeology. Permits that are left open can come back to haunt you, and open permits produce no alerts on their own.
Put permit status on the job, not next to it
The most common permit-tracking system in residential trades is a shared spreadsheet maintained by one person. It works until that person is on vacation, out sick, or gone.
The fix is not a better spreadsheet. It is writing permit state onto the job record the crew already uses:
- Required / not required — decided at sale or dispatch, not after the truck is rolling.
- Submitted / issued / in correction / scheduled / closed — the states that actually change what the field can do tomorrow.
- Permit number and jurisdiction — so anyone can call the city without hunting an email.
- Documents — application, approved plans, correction notices, CF-3R, signed card — attached to the job, not an inbox.
Inside ServiceTitan, iPermit's mechanism is a tag. Add the iPermit tag and the job's existing data carries into the permit request. Status changes, notes, uploads, and inspection times transfer back automatically. Dispatch looking at tomorrow's board can see whether the permit issued. Nobody has to ask.
Build an open-permit report you actually run
A status field is useless if nobody queries it. Set a weekly (minimum) review of every permit that is not closed:
| Bucket | What you are looking for | Typical action |
|---|---|---|
| Submitted, not issued | Sitting past the jurisdiction's posted turnaround | Follow up on completeness and corrections |
| Issued, not installed | Fine — just keep it visible so the crew does not install ahead of it | Hold the schedule until issued |
| Installed, no final scheduled | This is where open permits are born | Book the inspection this week |
| Failed inspection / failed HERS | Correction sitting in an unowned inbox | Assign an owner, retest or reinspect |
| Passed, not closed | Signed card never filed against the permit number | File it. The job is not done until the record closes |
The installed-but-not-scheduled bucket is the highest-value one. The invoice is paid, the job feels complete, and the permit is still open. That is a tracking failure, not a technical one.
Assign an owner. "The office" is not an owner.
Every open permit needs a name. When ownership is "the office," follow-up dies at PTO, turnover, and peak season. The owner does not have to pull the permit themselves. They have to be the person who notices when it has not moved.
A workable split for a multi-job shop:
- Dispatcher sees issued/not-issued before a crew is sent.
- Office manager owns the weekly open-set review.
- Permit vendor (if you use one) owns filing, correction response, inspection scheduling, and closeout — and writes the result back to the job.
If the vendor does not write back, you still have two systems. See permit integration vs manual tracking for that comparison.
Stop work from happening before the permit issues
Installing ahead of an issued permit is almost always a sequencing accident. The job got scheduled, the crew showed up, and nobody checked. When permit state is on the job, that accident gets hard to make. The same status the office sees is the status on the board.
This is tracking as a control, not as a report. The report tells you what already went wrong. The job-level status prevents the next one.
Treat energy testing as a tracked step, not a side vendor
In California, most HVAC changeouts trigger field verification — duct leakage, refrigerant charge, airflow — performed by a certified rater and filed as a CF-3R before the permit can close. Under the 2025 Energy Code (effective January 1, 2026) this is formally ECC, Energy Code Compliance. The field work is the same.
If testing lives on a different calendar from the permit, a failed measure becomes a new booking with a third party. If it lives on the same job record, it is a re-test on an existing file. That difference is what tracking is for. iPermit's own certified raters run the test against the same job as the permit, and file through CHEERS. More than 500,000 tests completed.
What this looks like at volume
A shop running a handful of permits a month can hold the open set in memory. A shop running service volume across multiple jurisdictions cannot. iPermit submits 100% of permits within 24 hours, has pulled more than 1,000,000 permits since 1976, and works in 40+ states. For Home Depot service work, permit status also pushes into Home Depot's service provider platform, which is what those jobs require before payment releases — another reason the status has to be real, not a spreadsheet cell.
More than 1,000 contractors run this way today. The pattern is the same at every size: status on the job, an open-set review with a named owner, closeout as a step rather than a hope.
Do we need software to track permits if we only work in one city?
You need a queryable list and a closeout habit. Software helps because it survives PTO. A single-jurisdiction shop can hold the rules in staff memory; it cannot hold an accurate open set in someone's head once the count leaves a sticky note.
How often should we review open permits?
Weekly at minimum, daily during peak season. The installed-but-not-scheduled bucket is the one that turns into title-search problems a year later. Review that bucket first.
What if status lives in the city portal already?
The city portal is the jurisdiction's system of record, not yours. Your crew does not work from it, and it will not tell you which of your jobs are still open. Tracking has to live where dispatch already looks.
For the compliance side of the same problem, see 7 ways permit integrations improve compliance. To put status on the ServiceTitan job, see the ServiceTitan integration page and how to automate permit status updates. Talk to iPermit, or register at iPermitPro.com/signup.