I Built a Database of Every ZIP Code in America. Here’s What It’s Actually Good For (and Not).

5 minute read

Investment Assessment By Zip Code

My younger kiddo asked me the other day what I was working on, and I said “a spreadsheet of every ZIP code in the country.” She looked at me the way you’d look at someone who just told you their hobby is watching paint dry. Ah well, maybe I was cooler when I was younger…

So, about that “spreadsheet” — it’s really a SQLite database at this point. It has become the first thing I touch every time I’m wondering whether a market is worth a second look. And I think it’s worth walking through candidly: what it can tell you, what it can’t, and where I’ve had to stop myself from trusting a number more than it deserves.

The Question I Was Actually Trying to Answer

When we bought our rentals, market research meant me, a browser with forty tabs open, and a weekend I wasn’t getting back. Census data in one tab, rent comps in another, unemployment stats somewhere else, all on different geographies, different vintages, none of it talking to each other.

The real question I wanted answered wasn’t “what’s the population of this ZIP code.” It was: is this market actually getting better, or does it just look cheap right now? Those are very different questions, and answering the second one honestly requires the first one plus about five others, all at once, all comparable across ZIP codes.

So I built a database to do that comparison for me.

What’s Actually In There

The database pulls ZIP-code-level (and in more than a couple of cases, county-level) data from four sources:

  • Census — population and population growth
  • FRED (the St. Louis Fed’s economic database) — income and employment trends
  • HUD — rent and vacancy figures
  • Census Building Permits Survey — new housing supply in the pipeline

From those, I score every ZIP code on six metrics: population growth, employment trends, median income, rent growth, vacancy rate, and supply pipeline (how much new housing is being permitted nearby — more supply coming online is downward pressure on the rents you can charge). Each metric gets normalized and combined into a single market score, and the whole country lights up on a heatmap I can scan in about ten seconds.

That last part matters more than it sounds like it should. Ten seconds to go from “no idea” to “okay, that cluster of ZIP codes near the interstate is worth a closer look” is the entire point. It’s a screening tool, not a verdict.

Where This Genuinely Earns Its Keep

It replaces the forty-tabs problem. Comparable, same-vintage data across every metric, for every ZIP code, queryable in one place. I can’t overstate how much friction that removes. The forty-tabs version of me would spend a Saturday evaluating three markets. The database version can screen a few hundred in the time it takes to make coffee.

It’s honest about relative strength. A single ZIP code’s rent-growth number in isolation doesn’t tell you much — is 3% good? Depends entirely on what everywhere else is doing. Scoring every ZIP code on the same scale, at the same time, turns an ambiguous number into a comparison. This is what you actually need to make a decision.

It catches things I’d never think to check manually. The permits pipeline is the one that surprised me most. I wouldn’t have thought to go pull county-level building-permit filings for a market I was casually curious about. The database does it as a matter of course. And, it’s flagged more than one market that looked great on income and rent growth but had a wave of new supply about to hit — the kind of thing that quietly erodes your rents two years after you buy.

Where I Have to Talk Myself Out of Trusting the Scraped Data Too Much

This is the part I think matters more than the highlight reel, so let’s actually sit in it.

ZIP codes are a terrible unit of geography, and I use them anyway. ZIP codes were built by the Postal Service to deliver mail efficiently, not to describe economically coherent neighborhoods. A single ZIP code can span a genuinely rough pocket and a gentrifying strip three streets over. However, the aggregate score smooths right over that seam. I treat every score as “this ZIP code, on average” — never as a guarantee about the specific block a property sits on.

Lag is baked in, and it’s not the same lag for every metric. Census population figures update on a different clock than HUD rent data, which updates on a different clock than FRED’s employment series. A market can already be turning — for better or worse — for months before that shows up in the score. I’ve started thinking of the database less as “current conditions” and more as “conditions as of somewhere between three and eighteen months ago, metric depending.” That’s a real caveat, not a throwaway one. It’s why I like looking at the outputs from the with a healthy dose of skepticism.

A high score answers “is this market improving,” not “will this specific property cash-flow.” I have to remind myself of this constantly, because it’s tempting to let a good market score do more work than it earned. Six macro metrics tell you nothing about a specific listing’s condition, its actual achievable rent, its property taxes, or whether the roof needs replacing next year. The database gets you to the short list. It does not get you to a purchase decision.

Correlation across metrics can fake out the composite score. Rent growth and income growth tend to move together, because they’re both downstream of the same local economic story. When they do, they can reinforce each other in the composite score in a way that looks like more independent confirmation than it actually is. I haven’t fully solved this — right now I mostly just eyeball whether a market’s high score is coming from one or two metrics doing all the work versus a genuinely broad-based improvement, and I trust the latter more. This is something I want to dig into in the future as I get more comfortable with the data and its interpretation.

How I Actually Read a Query Coming Out of It

A few rules I’ve settled into, for anyone building something similar or just trying to sanity-check a number I hand them on this blog later:

  • A single metric is a data point, not a conclusion. I don’t act on rent growth or population growth alone. I want at least two or three metrics agreeing before I take a market seriously.
  • The score tells you where to look, not where to buy. Every market that clears the screen still gets the forty-tabs treatment — just for three markets instead of three hundred.
  • Recency matters …possibly more than the score itself. I check when each underlying data point was last refreshed before I trust a comparison between two close scores.
  • A weird outlier is usually a data problem, not a hidden gem. I’m learning that if a ZIP code’s score looks dramatically better than its neighbors for no obvious reason, my first move is to check the source data, not to get excited.

A Database Is Not A Substitute For Thought

The database didn’t replace my judgment — it changed what my judgment gets to spend its time on. Instead of burning a weekend figuring out whether a market is even worth investigating, I get to spend that time on the part that actually needs a human: walking a property, checking comps by hand, deciding whether I believe the story the numbers are telling.

My daughter’s spreadsheet-watching-paint-dry assessment wasn’t wrong, exactly. It’s just that watching the right paint dry, across every ZIP code in the country at once, turns out to save me a lot of Saturdays.

A reminder that we’re not licensed financial or investment professionals — just sharing what we’ve learned and how we think about it. Talk to a qualified advisor before making decisions with real money on the line.

Leave a Reply

Your email address will not be published. Required fields are marked *