Permit Check on the opportunity

Inside a sales opportunity, type an address (or pick a city/county) and see exactly who governs the build and what the post-frame permitting is.

What it is

A panel that lives inside the opportunity card. It resolves an address to the governing jurisdiction — city if the parcel is inside city limits, county if it is not — and shows whether a building permit is required, the fee structure, the typical cost, review time, ag/farm exemption, whether stamped plans are needed, the department to phone, and the source URLs it was read from. It renders as a map with colour-coded city/county/state borders, a text answer, or both side by side.

Also called: permit lookup · do I need a permit · pole barn permit check · barndominium permit requirements · jurisdiction lookup

See it
Permit Check
Permit Checkpermitting by jurisdiction — don’t quote on a guessHide
5719 Pine Grove Rd, Columbia, MO, 65201MapBothText
AllRoadsBorders

Decision-support only — not a permit determination. Always confirm with the local authority before quoting.

The opened Permit Check section inside an opportunity modal: map on the left with an orange city outline inside a blue county outline, answer card on the right reading 'Building permit REQUIRED in City of Columbia'. Rendered by src/components/permits/PermitCheckPanel.tsx. The real screen, drawn from the product’s own design system. Sample data — no customer information appears here.
How it works
  1. 1The panel mounts inside the opportunity modal, pre-filled with the contact's property address
  2. 2Google Geocoder turns the address into coordinates
  3. 3The US Census geographies endpoint returns the authoritative county FIPS and, if the point falls inside an incorporated place, the place FIPS
  4. 4POST /api/permits {action:'answer'} calls the permit_answer_by_fips() RPC and batches the citation URLs
  5. 5The governing rule renders as a colour-coded card; the county rule renders underneath as 'county context (also applies)' when a city governs
  6. 6Census TIGER polygons are fetched on demand and drawn as city / county / state borders, and the map fits to the most specific one
  7. 7The answer is frozen onto the opportunity as a lead_permit_lookups row so the quote is defensible later
Why we built it

Migration 091 states the purpose outright: '…so a job is never closed on a false "no permit" assumption that later becomes a surprise permit bill.' The panel header adds the sales framing — 'permitting by jurisdiction — don't quote on a guess' — and the footer never lets it become a determination: 'Decision-support only — not a permit determination. Always confirm with the local authority before quoting.'

The problem
  • A quote goes out assuming no permit, and the fee turns up after the contract is signed
  • Nobody knows whether the city or the county rules apply to a rural parcel on the edge of town
  • The rep has to phone around to find which office issues the permit
Sound familiar?
What you get
The permitting answer is on screen before the price is
The department, phone number and official site are one click away
The answer a quote was based on is kept on the record
What's inside
Address, city or county search
One box that takes a street address, a city name or a county name and resolves it to the governing permitting authority.
State → County → City picker
Three linked dropdowns for when the rep knows the area but not the spelling.
Precise jurisdiction borders on a map
Real Census boundary polygons drawn in three colours — city orange, county blue, state purple — with a pin on the parcel.
City rule vs county rule, decided by FIPS
Whether the city or the county governs is resolved from authoritative Census FIPS codes, not from fuzzy name matching.
The permit answer — fee, timeframe, exemption, who to call
A single card that answers permit required / fee / review time / ag exemption / engineered plans / who to phone, with a confidence badge and sources.
"Not collected yet — call the office" instead of a guess
When there is no verified rule for a jurisdiction, the panel says so and tells the rep to phone — it never invents an answer.
The answer is frozen onto the opportunity
Every lookup is recorded against the opportunity — address, coordinates, matched FIPS, and a frozen copy of the answer that was on screen.
Automatic permit check on every lead with an address
Any card whose lead form gave an address is answered without anyone asking, on board load, at no per-card cost.
Permit chip on the pipeline card
A short coloured chip on each sales card — 'Permit required · Boone County' — so the board can be scanned for who has a surprise coming.
The panel fills itself from the contact's property address
Open a card and the permit panel is already answered from the address the lead form, website or CSV import landed on the contact.
Only pin a geocode you can trust
A marker is dropped only for a rooftop or interpolated geocode; anything approximate gets no pin at all.
Every city in a county, each its own colour
Pick a county and every incorporated place in and around it is outlined in its own colour, with a clickable colour-keyed legend.
Click a jurisdiction on the map for its permitting
Clicking any drawn city or county opens a modal with that jurisdiction's permitting.
Map / Both / Text with a draggable split
Three views with a draggable divider, remembered between visits, so the map and a long rule can both be read.
Declutter the map to just the borders
All / Roads / Borders presets that strip Google's business POIs and transit clutter down to land, water and jurisdiction lines.
Decision support, never a determination
Every permit surface carries the same line: decision-support only, confirm with the local authority before quoting.
Permit data served through an org-scoped server route
The browser never touches the permit tables directly; every read and write goes through POST /api/permits with org_id and the user stamped server-side.

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →