OverviewData › How we match

How we match permits to properties

Plain-language walkthrough — the two datasets, the fields, the old broken match, and the fix.

← Data hubData sourcesStep 2 · CoveragePermit classification

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.

8020REI · Roofing data pipeline · permits ↔ properties standardization (findings 90–101). Example: 768 Crystal Dr, Palm Harbor — real case from Pinellas County gold permits.