My Scoring Tool Almost Missed That a “Good” Market Was Actually a Coin Flip

4 minute read

Cash Flow Risk

I built a market assessment engine specifically so I wouldn’t have to eyeball spreadsheets and talk myself into deals. So it’s a little embarrassing that, until today, the tool’s price-to-rent grading didn’t actually predict the thing I care about: whether a property cash flows.

Here’s what I mean, using ZIP 07083 — Union, NJ — as the test case, because it happened to be sitting at the top of my recent searches when I made the fix.

The Question

Union scores a 70/100 on my six-metric engine. That’s a B — “good market,” strong buy signal, the whole banner. Tight vacancy (4.1%), healthy unemployment (4.2%), solid income ($114,938 median). On paper, exactly the kind of place I’d tell you to dig deeper on.

But the price-to-rent ratio is 17.9x. And that number was graded an A. Which raises the obvious question: how does a market get an A on four metrics, and an A on a key measure of investment feasibility but would have shaky cash flow. On the surface this was still coming out looking “strong buy”, but represented a much riskier investment profile than the report card illustrated. That mismatch is what sent me back into assessment_engine.py this morning.

What Actually Changed

The underlying price-to-rent calculation didn’t change — it’s still home price divided by annual rent, same Census ACS and HUD FMR inputs as before. What changed is how I score the result, and I tied it directly to something every buy-and-hold investor already uses as a gut check: the 1% rule.

New tiers:

GradePrice-to-rentScoreMonthly rent ÷ price
A≤ 8.3x20 (100%)≥ 1.0% — meets the 1% rule
B≤ 10.5x16 (80%)≥ 0.8%
C≤ 14.0x12 (60%)≥ 0.6%
D≤ 18.0x7 (35%)≥ 0.45%
F> 18.0x3 (15%)< 0.45%

Here’s the arithmetic behind that top row, since I don’t like handing you a table without showing my work: if monthly rent needs to be at least 1% of purchase price, then price divided by monthly rent has to be 100 or less, which means price divided by annual rent — the ratio my tool actually reports — has to be 100 ÷ 12, or about 8.3x. That’s where the A cutoff comes from. Same logic scales down the table: the D/F line at 18.0x works out to roughly a 0.463% monthly rent-to-price ratio, which is why I rounded it to “≥ 0.45%” in the label.

Now go back to Union NJ. 17.9x. Run that through the same formula — 1 ÷ (17.9 × 12) — and you get 0.466% monthly, call it 5.6% annual. That’s a hair over the 0.45% floor, which is exactly why its A rating raised a warning flag for me. Under the old scoring, a market like this could still post a decent-looking composite score because price-to-rent was just one input among six, weighted the same regardless of how far it missed the mark. Now, missing the 1% rule this badly costs you real points, and it shows.

Why I Also Fixed Population Growth

While I was in there, I made a second change that’s less dramatic but matters more over a hold period: population growth used to be a single year-over-year comparison. One good or bad Census estimate could swing the grade, and ACS 5-year figures already carry enough sampling noise that a one-year snapshot is a shaky thing to underwrite a decade-long hold on.

It’s now a rolling 3-year CAGR instead. Union’s current read is +1.04% annually — in line with the national average — but the number is doing a steadier job now: it’s smoothing across three years of estimates instead of betting the grade on whichever single year happened to land in the data pull. A market that had one weird up-year won’t get an A it doesn’t deserve, and one bad year won’t tank a market that’s actually growing fine.

What This Means for a Market Like Union

Put the pieces together and 07083 tells a more honest story than the old headline did. Demand fundamentals are genuinely strong — tight vacancy, healthy employment, income that supports real rent growth. But you’re paying a lot for that demand, and there’s a heavy supply pipeline on top of it: 59.7 permits per 1,000 units, an F on my sixth metric. New construction at that pace tends to put a ceiling on rent growth right as you’d be counting on it to bail out a thin cash-flow deal.

None of that means don’t buy in Union. It means don’t buy in Union assuming day-one cash flow. Any deal here needs more scrutiny around cash flow. And it also warrants an honest appreciation thesis, or unusually favorable financing, to make the math work — the score is telling you to underwrite it as an appreciation play, not a yield play, and to be skeptical of pro formas that lean on rent growth outpacing a market that’s about to see a wave of new supply.

Where This Could Still Be Wrong

A couple of honest caveats. The 1% rule is a rough screening heuristic, not gospel — plenty of good long-term holds never clear it, especially in high-appreciation coastal and near-coastal metros, and Union sits inside the New York-Newark-Jersey City metro, which is exactly the kind of market where that rule of thumb has always struggled. I’m using it as a scoring anchor because it’s a well-understood shorthand, not because I think 1% is some magic cash-flow line. As always, investors need to do their own homework before making offers and signing on to a deal with less than solid fundamentals.

And the population and price-to-rent inputs are both still running off 2022 ACS data — that’s the most recent 5-year release available, but it means the “3-year CAGR” is really the most recent 3 years the Census has published, not the most recent 3 calendar years. If you’re underwriting a specific deal here, that lag is worth remembering.

Wrap Up

The whole point of building this tool was to stop me from fudging a deal I wanted to like. Today’s fix is a small, unglamorous change — a table of grade cutoffs, a rolling average instead of a single-year snapshot — but it’s exactly the kind of thing that keeps a scoring engine honest. A market can still be worth buying into at a lower price-to-rent. It just shouldn’t be able to hide so easily.

A reminder that we’re not licensed financial or investment professionals — just sharing what we’ve learned building and using this tool. Talk to a qualified advisor before putting real money into a deal.


Read time: ~6 minutes

Building the Thing I Wish I’d Had Before I Bought My First Rental

5 minute read

It’s 11:40pm. Do you know where your polygons are?

It’s 11:40pm on a Friday and I’m staring at a ZIP code boundary that won’t render correctly on a map for the 20th time. The polygon is trying to wrap itself around the entire Eastern seaboard because somewhere in a coordinate system I don’t fully understand, a projection did something a projection should not do. My wife went to bed an hour ago. I am debugging a map.

This is, apparently, how I relax now.

I own two rental properties. I underwrote both of them the old-fashioned way: a spreadsheet, a lot of Zillow tabs, some gut feel, and a healthy dose of “well, it seemed fine.” It worked out. But “it worked out” is not a strategy, and I’ve always wanted something more rigorous — something that forces me to ask the boring, unglamorous questions before I fall in love with a listing photo of a nice kitchen.

So I’m building one. It’s called, very unpoetically, the REW platform (real estate underwriting — I never claimed to be a marketer). And I want to talk about it now, while it’s unfinished, rather than waiting until it’s polished enough to be impressive. Partly because I think the process is more interesting than the finished product. Mostly because I suspect I’m going to get a bunch of this wrong, and I’d rather be honest about that from the start than pretend I built a flawless machine on the first pass.

The Actual Problem I’m Trying to Solve

Here’s the question that matters: out of every possible place I could buy a rental property, how do I quickly rule out the bad ones and spend my real time and energy only on the good ones?

Most people do this backwards. They fall for a specific house, then start justifying the numbers to themselves. I’ve done this. It’s a great way to talk yourself into a mediocre deal because you already mentally moved in.

So I’m trying to build a pipeline that works in the opposite order: start broad, get skeptical fast, and only let a deal survive if it earns its way through several rounds of me actively trying to kill it.

Right now, that pipeline has three stages.

Stage One: Is This ZIP Code Even Worth Looking At?

Before I care about any specific house, I want to know something more fundamental: is this area one where owning a rental makes sense at all?

I built a scoring engine that pulls data from a handful of sources — Census, HUD, FRED — and boils a ZIP code down to six metrics I actually care about as a landlord:

  • Population growth (are people moving here, or leaving?)
  • Unemployment (is the local job base healthy?)
  • Price-to-rent ratio (are prices in line with what rent can support, or wildly detached from it?)
  • Median income (can the local population actually afford the rents I’d need to charge?)
  • Vacancy rate (is there a glut of empty units I’d be competing against?)
  • Supply pipeline (how much new housing is already under construction or permitted nearby?)

That last one took me the longest to get right, mostly because “how much is being built near here” turns out to be a genuinely annoying question to answer with public data. I ended up pulling county-level building permit data from the Census Bureau and matching it up as best I can to individual ZIP codes. It’s not perfect. I know it’s not perfect. But it’s a meaningfully better signal than “I have a feeling about this neighborhood,” which was more or less my prior methodology.

The output of stage one is just a score and a rough read on the market. It’s not a green light to buy anything. It’s closer to deciding whether a neighborhood deserves five more minutes of my attention.

Stage Two: Now Let’s Try to Kill It

This is my favorite part, mostly because it’s the part I was worst at doing manually.

Once a ZIP code clears the first screen, I don’t move straight to a full underwriting model. Instead, I run a quick, deliberately unforgiving pass on the specific property: rough rent estimate, rough expenses, rough financing assumptions, and a gut-check cash flow number. Nothing fancy. The whole point of this stage is speed and skepticism, not precision.

I’m explicitly trying to find a reason to say no. If a property can’t survive a lazy, surface-level version of the math, it has no business surviving the detailed version. This saves me from the trap I fell into with my own properties: spending three hours building a beautiful, detailed model for a deal that a five-minute sanity check would have thrown out immediately.

Think of it as triage. A property that fails here doesn’t get a eulogy. It just doesn’t move to the next room.

Stage Three: Full Underwriting, For the Survivors Only

Only the properties that make it through both filters get the full treatment: a detailed cash flow model, sensitivity around rent and expense assumptions, and eventually — this part isn’t built yet — Monte Carlo simulation across a range of market conditions, so I can see not just “what’s the expected return” but “how bad could this realistically get, and how bad could it get in an unlucky sequence of years.” Longtime readers know I have a soft spot for that kind of analysis; I wrote about the same idea applied to a stock/bond portfolio a while back, and I think the same logic applies just as well to a single rental property.

That full underwriting step is the expensive one, in terms of both my time and the computer’s. Which is exactly why I don’t want to run it on every listing I glance at. The first two stages exist entirely to protect the third one.

Where This Actually Stands Right Now

I want to be honest about the state of things, because I think “in progress” is a more useful thing to model publicly than “finished.”

The ZIP scoring engine works, mostly, though I’m still finding edge cases — ZIP codes that straddle county lines are a special kind of headache I did not anticipate when I started this. The quick-kill screen exists but needs more real-world deals run through it before I trust its instincts. And the full underwriting stage is still mostly aspirational; right now it’s a folder full of half-finished code and a Monte Carlo module I keep meaning to properly hook up.

I’m also in the middle of moving the whole thing off my laptop and onto a little Linux box that lives in my house, partly because I like understanding my own tools end to end, and partly because I’d rather not depend on someone else’s server for something I’m going to trust with real buying decisions. That’s its own rabbit hole, and probably its own post.

None of this is a product yet. It might never be, in the sense of something anyone else uses. But it’s already changing how I think about the two properties I own, and it’s forcing me to write down assumptions I used to just carry around in my head, which is worth something on its own.

Why Bother

I could just keep doing this in a spreadsheet. Plenty of successful investors do exactly that, forever, and do fine.

But I like building things, and I like being forced to be explicit about my reasoning instead of trusting a gut feeling I can’t fully explain even to myself. If I’m going to make real decisions with real money — and eventually, real decisions on behalf of anyone else who ever looks over my shoulder — I want a process I can actually defend, one metric at a time, rather than a vibe.

I’ll keep sharing this as it develops, including the parts that don’t work, the ZIP codes that break my map projections at midnight, and whatever the quick-kill screen gets embarrassingly wrong the first few times I trust it. That feels more honest than waiting until it’s shiny.

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