How to read your county assessor's file like a marketer.
Your county keeps a file describing the physical characteristics of every home it taxes, and usually publishes it. Almost no contractor reads it. This is a walk through the columns of one: Cook County, Illinois, 1,114,335 residential parcels, 23 fields each. What every field means, which decision it changes, and where it will lie to you.
First, what this file is
The assessor's job is to tax property, so the file describes property: how big, how old, what it is made of, who lives there. Nobody assembled it for marketing, which is exactly why it works. A column collected to defend a tax bill has no reason to flatter anyone, and it covers every parcel rather than the slice that filled out a form. Cook is the worked example because its file is large and deep. Yours will use other names and codes.
One discipline before any of it: count a column's values before you build on it. Cook's construction_quality is 98.81% "Average" and its repair_condition is 98.54% "Average". Both read like gold on a schema listing, and neither can separate anything, because a field with ninety-eight percent of its mass on one value has no variance left to sort with. Every field below survived that check.
01 · year_built
The clock, and only the clock.
The year the structure went up, as the assessor recorded it. Not the year it was renovated, re-roofed, or re-sided. Cook populates it on 1,114,319 of 1,114,335 parcels: median 1954, 84.6% built before 1980, and 32,000 homes sharing the most common single year, 1955.
It sets campaign timing, at a resolution the county median hides. Township medians run from 1904 to 1994, ninety years apart inside one county.
Where it misleads: 36 parcels predate 1850, the oldest reading 1801, so treat the tails as data entry. The deeper silence is that it dates the house and never the components on it. A 1954 house wearing a 2019 roof and a 1954 house on its original second roof are the same row here.
Sort by build year at the smallest geography your file offers. You work blocks; the county average describes nobody.
02 · roof_material
A monoculture that still hides two markets.
Six values on 1,114,270 populated parcels, one of which owns the county: 89.42% Shingle + Asphalt, 8.23% Tar + Gravel, then Shake at 0.79%, Other 0.63%, Tile 0.56%, Slate 0.38%.
A share that lopsided reads like a dead column until you cut it. Tar and gravel is 37.5% of the county's multi-family stock against 2.9% of single-family, which is the file quietly telling you which roofs are flat. Rare materials cluster just as hard: Barrington township runs 22.9% shake. Different product, different bid, different crew.
Where it misleads: the field records a dominant material, one value for the whole structure. Porches, dormers, and additions are invisible in it. Segmentation key, never a takeoff.
Cross material with structure type before writing a column off. That 8% minority is a whole flat-roof trade.
03 · ext_wall_material
The column that tells you where not to spend.
Four wall values on 1,114,289 parcels: 44.01% Masonry, 30.86% Frame, 23.60% Frame + Masonry, 1.53% Stucco.
Most fields here help you find buyers. This one earns its keep by removing them. 334,865 single-family owner-occupied Cook homes are coded Masonry, and every siding mailer landing on one is spent before the envelope opens. The frame-bearing set, single-family and owner-occupied, comes to 491,296 homes. Masonry share by township then runs 84.4% down to 4.1%, a twentyfold spread.
Where it misleads: the category labels are local inventions, so a filter written against one county's codes will quietly mis-sort the next one's. And masonry homes still buy gutters, soffit, trim, and windows. Suppress them from siding, not from the business.
Suppression is cheaper than persuasion. One clause here removes a third of a million homes that were never going to buy.
Lower bars are the siding markets. Schaumburg township is 69.8% Frame.
04 · basement_type
Where the water has somewhere to go.
60.26% Full, 21.90% Partial, 12.47% Slab, 5.37% Crawl across 1,114,049 populated rows. Full plus partial is 82.16% of the county.
Cut it by era and the obvious guess breaks. Basement share does not fall with age: pre-1940 stock is 86.5% basemented, the 1940 to 1959 cohort drops to 76.0%, and post-2000 construction runs 87.0%. The postwar subdivision boom is this county's slab era. Joined to build year, the outer boundary of the local waterproofing market is 652,401 owner-occupied homes built before 1980 with a full or partial basement.
Where it misleads: the column reports that a basement exists. Nothing about finish, depth, drain tile, or whether it has ever taken water. It sizes a market and cannot rank a street.
Pair basement type with build era. A slab-heavy postwar tract and a prewar basement grid are two businesses.
05 · owner_occupied
Which pitch, not which prospect.
A one/zero flag on 1,114,309 populated rows. 84.88% of Cook residential parcels carry a one.
Split by structure and it separates: 89.3% of single-family parcels against 60.9% of multi-family. Split by township, 95.3% at the top of the county to 67.8% at the bottom. Read that spread as a lane rather than a score. In an absentee-heavy township the decision-maker is a landlord, the objection is return on cost instead of curb appeal, and the mail goes to a different address than the roof it describes.
Where it misleads: it is a snapshot from the assessment cycle. Every sale since the file was cut is stale in it, and it says nothing about tenure or ability to pay. Choose a script with it, never a household.
The 15% absentee slice carries its own economics: fewer buyers, several roofs each, and a completely different first sentence.
06 · building_sqft & land_sqft
Two size columns doing two different jobs.
building_sqft sets the ticket: median 1,509 square feet across 1,114,306 populated parcels, quartiles at 1,145 and 2,244, ninetieth percentile 3,151. Single-family median is 1,372; multi-family is 2,572, and that second number is the trap. On a multi-unit parcel the value covers the whole building, and the column's maximum reads 330,535 square feet. Average it without splitting single from multi and a handful of apartment buildings sets your ticket assumption.
land_sqft answers a different question: the yard, the gutter run, the place a truck and a dumpster have to fit. Median 5,040 square feet on 1,108,454 parcels. 35.7% sit on under 4,000, and 53,186 of them, 4.8% of the county, measure exactly 3,125: the standard twenty-five by one-hundred-twenty-five foot city lot, fifty thousand times over.
Where both mislead: footprint is not roof area. Neither knows stories, pitch, or overhang.
If your crew needs a driveway and a side yard, a third of this county is a logistics problem first. Price it that way.
| Cut | Square feet |
|---|---|
| 25th percentile | 1,145 |
| Median | 1,509 |
| 75th percentile | 2,244 |
| 90th percentile | 3,151 |
| Median, single-family | 1,372 |
| Median, multi-family | 2,572 |
07 · assessed_value
A budget proxy with a warning label.
Median assessed value in Cook is $22,920 across the 1,099,940 parcels carrying a positive value, quartiles at $14,699 and $34,267.
Do not read those as home prices. This is an assessed figure produced on the county's own cycle under the county's own rules; it is not a sale price and it does not compare across county lines. What it does well is rank. Township medians run from $8,500 to $101,585, a twelvefold spread inside one county, stable enough to sort a price sheet: financing-forward where the number sits low, premium material where it sits high.
Where it misleads, twice over. The level moves when the county reassesses rather than when the market does. And the top of that township list is no wealth ranking: townships thick with multi-unit buildings carry a whole building's value on a single row.
Use rank, never dollars. Deciles inside your own service area survive the next reassessment.
| Township | Median assessed |
|---|---|
| North Chicago | $101,585 |
| New Trier | $85,000 |
| Lake View | $67,001 |
| Worth | $22,000 |
| Bremen | $14,000 |
| Thornton | $8,500 |
08 · township_code & neighborhood_code
The columns that make the other seven actionable.
Cook carries 39 township codes and 926 distinct neighborhood codes, and they nest: a five-digit neighborhood code is the two-digit township plus a three-digit local area. The median neighborhood holds 707 parcels; the largest holds 14,088.
Seven hundred parcels is a canvass, a mail drop, a Saturday. Inside Worth township alone, the 30 neighborhood codes with 300 or more dated parcels carry median build years from 1903 to 1995: most of the county's stock-age range, one township.
Two failure modes, cheap to hit and silent when you do. 9,475 Cook rows carry a township code with no name, so joining on the name drops them and joining on the code keeps them. And 4 neighborhood codes appear under two township codes: the code is not unique by itself, the pair is.
Every ranking should come out at neighborhood level. County numbers win arguments; neighborhood numbers get printed on a route sheet.
| Measure | Value |
|---|---|
| Township codes | 39 |
| Neighborhood codes | 926 |
| Median parcels per neighborhood | 707 |
| Largest neighborhood | 14,088 |
| Rows with code but no name | 9,475 |
| Codes reused across townships | 4 |
09 · What the file cannot tell you
There is no roof-age column.
Nothing in these 23 fields records when anything was last replaced. Permits are the usual patch, with sharp edges of their own.
Cook's roof-permit table holds 94,645 parcel numbers. Only 82,591 join to the assessor file, so 12,054, about 12.7% of the record, fail to match and a naive join loses them without complaint. The dates are worse: 94,612 carry a last-permit year of 2018 or later and just 33 predate 2018, while the column's minimum reads 202, a typo the loader kept.
So an absence here means no permit inside a nine-season window, and a campaign reading it as never replaced is buying its own error at scale. Turned around, the same table is the strongest suppression signal available.
Know your permit file's coverage window before trusting an absence in it. An empty cell is evidence only where the record is complete.
| Check | Parcels |
|---|---|
| Parcels in permit table | 94,645 |
| Matching a parcel in assessor file | 82,591 |
| Failing to match | 12,054 |
| Last permit year 2018 or later | 94,612 |
| Last permit year before 2018 | 33 |
Putting it together
Three filters, one county file, no software.
Each is a single query against the columns above, run on Cook this morning.
| Trade | Filter | Homes |
|---|---|---|
| Roofing | Single-family, asphalt roof, owner-occupied, built 2001 or earlier, no roof permit on file | 693,720 |
| Siding | Frame or frame-plus-masonry walls, single-family, owner-occupied | 491,296 |
| Waterproofing | Full or partial basement, owner-occupied, built before 1980 | 652,401 |
Those are market sizes rather than lists, and each is far too large to mail. What follows is ranking: which seven-hundred-parcel neighborhood inside that 693,720 has the oldest stock, the thinnest recent permit record, and the storm history behind it. That ranking, across counties, refreshed as the files update, is what a Territory X-Ray does for a living.
None of which changes the honest version of the advice. Your county publishes some version of this file. Pull it, count the values in every column before trusting one, suppress the homes that structurally cannot buy your product, rank what is left by build era at the smallest geography you have, and mail that. A contractor with a spreadsheet and one afternoon beats a contractor with a radius and a hunch, every season, for nothing.
Territory Intelligence · by email
Get the next brief when it publishes.
County briefs, township reads, and storm-window notes for exterior contractors. Aggregate market data only. No spam, no shared lists.
Subscribed. The next brief will land in your inbox.
Method & sources
Every figure on this page was computed from official public records at publication: the Cook County Assessor's residential property-characteristics file covering 1,114,335 parcels (build year, roof material, exterior wall material, basement type, occupancy flag, building and land square footage, assessed value, township and neighborhood codes), plus county building-permit records for the roof-permit coverage checks. Percentages are shares of parcels with the relevant field populated, excluding NULL and blank values; each section states the populated denominator it used. Median and percentile figures exclude zero and NULL values.
Everything here is aggregate. No individual home, parcel number, address, or owner is identified, and nothing on this page is a claim about any specific property's condition. This brief is built from public county records; TerritoryX has no affiliation with any county office.
You can read the file. We read it for 926 neighborhoods at once.
The Territory X-Ray runs these columns, plus roof geometry modeled from public LiDAR, storm history, permit suppression and flood layers, on the towns you actually work: ranked neighborhoods, reason codes, and the first campaign worth your money.
Request a Territory X-Ray