The “Bullshit Detector” for Zillow. Stop guessing and start underwriting like a pro—directly on the listing page.
Zillow’s “Estimated Monthly Payment” is designed for homeowners, not investors. It misses the variables that kill cash flow: closing costs, repair budgets, and the inevitable 2026 property tax reassessment. DealView bridges the gap between a Zillow listing and a professional spreadsheet.
Every listing card gets a gross yield badge before you click in. Gross yield is annual rent ÷ list price — the fastest way to filter deals at a glance.
Rent data comes directly from Zillow’s own Rent Zestimate — no external API, no cost, no guessing. Listings with no rent data (new construction, etc.) show no badge.
chrome.storage.local. We never see your data.zillow.com access and local storage. No tracking across other sites.| Metric | What it means |
|---|---|
| Gross Yield | Annual rent ÷ purchase price. The quick-scan filter. ≥ 6% passes the 1% rule. |
| Cap Rate | Annual NOI ÷ purchase price. Financing-independent return. 5%+ is solid for residential. |
| Cash-on-Cash | Annual cashflow ÷ total cash invested (down + closing costs + repairs). Your real return. |
| DSCR | NOI ÷ annual mortgage. Lenders require ≥ 1.25 for investment loans. |
| Monthly NOI | Rent minus operating expenses (excl. mortgage). |
| GRM | Price ÷ annual rent. Under 15× is strong; over 25× is expensive for cash-flow investors. |
Expense ratio default: 40% of gross rent — split into property management (7%), vacancy (5%), and taxes/insurance/maintenance (28%). All three are editable in the panel.
Every number in the panel traces back to one of these sources:
| Data | Source | Cache |
|---|---|---|
| List price, beds/baths/sqft, status, address | Zillow DOM (data-testid selectors) |
Live |
| Rent Zestimate | Zillow __NEXT_DATA__ SSR blob (hard load) or DOM element (SPA nav) |
Live |
| Mortgage rate (30yr / 15yr) | FRED API — series MORTGAGE30US / MORTGAGE15US |
24 hours |
| HUD Fair Market Rent | HUD API — SAFMR zip-level, falls back to county average | 30 days |
| Census median rent + household income | Census ACS 5-year estimates (2023), variables B25064_001E + B19013_001E |
90 days |
| Annual property tax | Zillow Facts & Features module (DOM regex on data-testid="facts-and-features-module") |
Live |
ZIP code and state are extracted from the listing address h1, with a fallback to the Zillow URL path (e.g. /homedetails/123-Main-St-Austin-TX-78749/...) for reliability when the DOM is slow to render.
Standard amortizing loan formula:
M = P × [r(1+r)^n] / [(1+r)^n − 1]
P = listPrice × (1 − downPaymentPct) (loan amount)
r = annualRate / 12 (monthly rate)
n = termMonths (360 for 30yr, 180 for 15yr)
Example: $500K home, 20% down, 6.85% rate, 30yr → $2,626/mo
totalExpenseRatio = pmFeePct + vacancyRatePct + otherExpenseRatio
monthlyExpenses = rentEstimate × totalExpenseRatio
Defaults: 7% (PM) + 5% (vacancy) + 28% (taxes/ins/maint) = 40% total
When Zillow provides the actual annual property tax, the taxes/ins/maint field pre-fills as:
adjustedOther = min(round(annualTax / 12 / rent × 100) + 13, 45)
The 13% is a fixed allowance for insurance + maintenance. The actual tax % replaces the estimated tax within the 28% default.
grossYield = (rentEstimate × 12) / listPrice
The “1% rule” in yield terms: monthly rent ≥ 1% of price → 12% gross yield.
monthlyNOI = rentEstimate × (1 − totalExpenseRatio)
annualNOI = monthlyNOI × 12
NOI is independent of financing — it measures the asset’s income as a business.
capRate = annualNOI / listPrice
The return assuming all-cash purchase. Lets you compare properties independent of how each is financed.
monthlyCashflow = rentEstimate − monthlyMortgage − (rentEstimate × totalExpenseRatio)
= monthlyNOI − monthlyMortgage
Negative = net out-of-pocket cost every month.
totalInitialInvestment = (listPrice × downPaymentPct) + (listPrice × closingCostPct) + repairBudget
cashOnCash = (monthlyCashflow × 12) / totalInitialInvestment
Your actual return on every dollar brought to closing — accounts for leverage, all expenses, and real out-of-pocket cost.
dscr = annualNOI / (monthlyMortgage × 12)
Min rent for 1.25× DSCR (shown when DSCR < 1.25):
minRent = ceil((1.25 × monthlyMortgage) / (1 − totalExpenseRatio))
Derived by solving (rent × (1−expenses) × 12) / (mortgage × 12) = 1.25 for rent.
GRM = listPrice / (rentEstimate × 12)
Inverse of gross yield × 100. Under 15× is strong; over 25× is expensive for cash-flow investors.
rentToIncome = (rentEstimate × 12) / censusMedianHouseholdIncome
Measures tenant affordability in the ZIP. Above 30% = housing burden threshold, higher vacancy risk. Source: Census ACS B19013_001E.
U.S. Dept. of Housing and Urban Development publishes FMRs annually. Represents the 40th percentile of gross rents — what HUD will pay for Section 8 housing. A government-set floor: the lowest the market is expected to sustain. Good conservative underwriting baseline.
Tier shown in the panel matches the listing’s actual bed count (efficiency / 1BR / 2BR / 3BR / 4BR+).
cd extension
npm install
npx wxt dev # builds + watches for changes
Built with WXT · React · TypeScript · Chrome MV3
DealView is an estimation tool. Real estate investing involves significant risk. Always verify your final numbers with a licensed lender and local tax assessor.
Found a bug? Zillow changed their layout? Email caleb@mazowventures.com or open an Issue on this repo.