How we match permits to properties
Plain-language walkthrough — the two datasets, the fields, the old broken match, and the fix.
The two datasets we join
🔨 GOLD permits
Building permits (BuildZoom) — one row per permit filed
STREET, CITY, ZIP_CODEthe job-site address ✅ real
TYPE / SUBTYPEroof, pool, electrical…
ISSUED_DATEwhen permit pulled
STREET4JOIN1a join key — often corrupt
FA_PROPERTYIDthe (broken) link to FA
🏠 FA / silver
Property records (First American) — one row per parcel
PropertyIdunique parcel ID
SitusFullStreetAddress, SitusZIP5property address ✅ standardized
UseTypeSFH, condo…
YearBuilt, OwnerOccupied, OwnerTypefor the buy-box
EMVvalue
The goal: for each permit, find the one FA property it sits on — so we know that home's roof history, owner, age and value. The whole list depends on getting that link right.
❌ The old way — and why it was wrong
Matched on the permit's FA_PROPERTYID / STREET4JOIN1
1
Permit's real address: 768 CRYSTAL DR, PALM HARBOR 34683
This is where the roof work actually happened.
↓
2
But the join key was a different property: STREET4JOIN1 = 2500 WINDING CREEK BLVD
An unrelated parcel bled in by an upstream cross-join bug — not a typo of the real address, a whole different place. And FA_PROPERTYID was often empty [].
↓
3
Result: linked to the WRONG house (or none).
So a home that just got a new roof looked roof-free → it passed the "no recent roof" filter → it shipped on the list.
In Pinellas, the old link pointed to the wrong property ~80% of the time.
✅ The fix — standardize the address, then match
Ignore the broken key. Use the permit's own street → Smarty → FA.
1
Take the permit's real street 768 CRYSTAL DR, PALM HARBOR 34683
Straight from the permit — not the corrupt join key.
↓
2
Run it through Smarty (USPS address standardizer)
Fixes typos, wrong ZIPs, abbreviations → one official, canonical address: 768 Crystal Dr, Palm Harbor FL 34683-xxxx
↓
3
Match that canonical address to FA's address (SitusFullStreetAddress + ZIP)
FA is already standardized, so clean address ↔ clean address is an exact, reliable match. We keep a match only when it lands on exactly ONE FA parcel.
↓
4
Result: the correct property → FA_PROPERTYID_STD = 35103429 · 768 CRYSTAL DR
A new, trustworthy link. Mailability (USPS "deliverable") is tracked separately so we never mail a bad address.
Does it work? (FL-7, 7 counties, 27.4M permit rows)
84–90%
of roof permits now matched to the right SFH (rises with metro density)
100%
live re-check — every stored match confirmed by a fresh address lookup (not just cache)
0
rows lost — every permit accounted for, all 7 counties
~80%→right
old wrong-links replaced with correct ones
What we honestly can't match (and why that's OK)
A slice of permits don't get a link — and they shouldn't:
• Commercial / non-home addresses (Winn-Dixie, storage, banks) — not houses, correctly excluded.
• Condos / multi-unit — one permit, many units → ambiguous, so we don't guess.
• Real homes not in our FA snapshot — deliverable addresses FA doesn't have a record for. They can't be on the list anyway (we only ship FA-known homes); flagged for a future FA refresh.
Everything that should match, matches — and every match is re-checked against the permit, FA, and a live address lookup before it ships.
• Commercial / non-home addresses (Winn-Dixie, storage, banks) — not houses, correctly excluded.
• Condos / multi-unit — one permit, many units → ambiguous, so we don't guess.
• Real homes not in our FA snapshot — deliverable addresses FA doesn't have a record for. They can't be on the list anyway (we only ship FA-known homes); flagged for a future FA refresh.
Everything that should match, matches — and every match is re-checked against the permit, FA, and a live address lookup before it ships.
8020REI · Roofing data pipeline · permits ↔ properties standardization (findings 90–101). Example: 768 Crystal Dr, Palm Harbor — real case from Pinellas County gold permits.