Working demo · built in n8n

Deal email in. Underwritten PASS/FAIL out.

Five broker emails went into this workflow. Five underwritten verdicts came out, each with the reason attached. The AI reads the email and explains the result — it never touches a calculation. Every number below came from the run.

2:12, no audio. You are watching the actual workflow run in n8n - every figure on screen is real output, not an illustration.

The pipeline

1 · IntakeDeal emails, one at a time. In production this is a Gmail trigger on deals@.
2 · Extract AIAddress, price, rehab, ARV, rent, taxes, insurance out of messy text. Told to return null rather than estimate.
3 · Validate no AIParses "75k" to 75000, checks required fields, flags ARV below price or rent too high for the price.
4 · Underwrite no AIAll-in cost, loan, cash to close, refi, cash left, NOI, debt service, cash flow, DSCR, CoC, ROI, cap rate, 70% rule.
5 · Buy box no AITen checks read from a Google Sheet. Each returns its own pass/fail line.
6 · Explain AIReceives the finished numbers and writes three sentences. Forbidden to recalculate.

What came out of the run

dealpricerehabARVrentall-incash leftcash flowDSCRverdict
3812 W 130th St, Cleveland$75,000$25,000$145,000$1,595$107,681$1,106$228/mo1.31PASS
2140 Larchmont Rd, Cleveland$145,000$55,000$215,000$1,850$213,904$55,879-$17/mo0.98FAIL
9021 Sycamore Ln, Columbus$118,000—$175,000—————NEEDS DATA
77 Beacon Hill Dr, Pittsburgh$88,000$22,000$155,000$1,650$118,644$4,719$236/mo1.30FAIL
4408 Grove Ave, Cincinnati$82,000$28,000$165,000$1,795$118,204$0$288/mo1.34PASS

Why each one landed where it did. Cincinnati ranked first: all-in is 72% of ARV and the refinance pulls every dollar back out. Cleveland W 130th passed with $1,106 left in. Larchmont failed six checks — the all-in is 99% of ARV. Pittsburgh is the interesting one: the numbers work, but the ZIP is outside the target list and the price is $1,500 over the 70% rule, so it fails with exactly those two lines. Sycamore was never underwritten at all — rent and rehab were missing, so it returns NEEDS DATA instead of a metric built on a guess.

The buy box is configuration, not code

I changed one cell in the sheet — min_dscr from 1.25 to 1.35 — and re-ran. No workflow edit.

dealDSCRbeforeafterreason
3812 W 130th St, Cleveland1.31PASSFAILDSCR 1.31 vs min 1.35
4408 Grove Ave, Cincinnati1.34PASSFAILDSCR 1.34 vs min 1.35

Purchase price, rehab ceiling, ARV rules, rent-to-price, cash left, CoC, cap rate, LTV, target ZIPs and every financing assumption work the same way.

What this is — and what it isn't yet

This is the screening core: intake, extraction, validation, underwriting, buy box, ranking and explanation, running end to end. It is not yet pulling third-party property data — the deal numbers come from the email, which is exactly how a broker submission arrives. The next two steps are the ones worth researching before building: pointing intake at deals@, and replacing the broker's ARV and rent with an API-sourced figure carrying a confidence and a source. The underwriting engine is plain code and moves anywhere: n8n, a Python service, or a Lambda.