The listing says "6.5 percent cap rate, great cash flow." You build the numbers yourself and the property barely covers its own mortgage. Both statements can be true: the cap rate ignores financing, and the cash flow depends on assumptions the listing didn't show.
AI prompts for real estate investors are useful for exactly this gap. They can force a deal into a consistent structure, flag inputs nobody has verified, and write the questions you should ask before you commit. They are bad at arithmetic, markets and judgement. So the pattern in this post is: the model structures and questions, a script does the maths, and you decide.
This is not financial, tax, legal or investment advice, and it makes no claims about any market. Every figure below comes from an invented property I made up to show the method. The numbers are real output from a script I ran on 2026-10-09; the inputs are not real. The prompts are untested templates.
For the agent side of property work, see AI prompts for real estate agents, which covers listing copy and fair-housing checks. This post is for the buyer's side.
What do cap rate, cash-on-cash and DSCR actually measure?
Three ratios, three different questions:
| Metric | Formula | Question it answers |
|---|---|---|
| Cap rate | NOI / purchase price | What does the property earn, ignoring how it's financed? |
| Cash-on-cash | Annual pre-tax cash flow / total cash invested | What do I earn on the cash I put in? |
| DSCR | NOI / annual debt service | Does the property's income cover the loan payments, and by how much? |
NOI (net operating income) is income after vacancy and operating expenses, before debt payments, tax on your income and depreciation. Cash flow is NOI minus debt service. The definitions are standard, but check how your lender and your local market define each line, because treatment of items such as capital reserves and management fees varies.
How do I run the arithmetic without trusting the model?
Ask the model for the logic, then run the script yourself. This is the core of the script I ran, shortened for the page (Python standard library only; the version I ran also printed every line item and had a utilities input set to zero):
def monthly_payment(principal, annual_rate, years):
r = annual_rate / 12
n = years * 12
return principal * r / (1 - (1 + r) ** -n)
def analyse(price, down_pct, rate, years, closing, rehab,
rent_month, vacancy_pct, taxes, insurance,
maintenance_pct, mgmt_pct, capex_pct):
loan = price * (1 - down_pct)
cash_in = price * down_pct + closing + rehab
gpi = rent_month * 12
egi = gpi * (1 - vacancy_pct)
opex = taxes + insurance + egi * (maintenance_pct + mgmt_pct + capex_pct)
noi = egi - opex
debt_service = monthly_payment(loan, rate, years) * 12
cash_flow = noi - debt_service
return noi / price, cash_flow / cash_in, noi / debt_service, noi, cash_flow
The full run used a 250,000 purchase, 25 percent down, a 7.0 percent 30-year loan, 6,000 closing costs, 9,000 rehab, rent of 2,100 a month, 5 percent vacancy, taxes of 3,000 and insurance of 1,200 a year, and maintenance, management and capital reserves at 5, 8 and 5 percent of collected rent. All invented. Output:
--- Base case (invented property A) ---
Loan amount: 187,500
Cash invested: 77,500
Gross potential income: 25,200
Vacancy allowance: 1,260
Effective gross income: 23,940
Operating expenses: 8,509
NOI: 15,431
Monthly P&I payment: 1,247.44
Annual debt service: 14,969
Annual cash flow: 461
Cap rate: 6.17%
Cash-on-cash: 0.60%
DSCR: 1.03
--- Stress case: rent 2,000, vacancy 10%, rate 7.5% ---
NOI: 13,512
Monthly P&I payment: 1,311.03
Annual debt service: 15,732
Annual cash flow: -2,220
Cap rate: 5.40%
Cash-on-cash: -2.86%
DSCR: 0.86
Smallest monthly rent (steps of 5) with DSCR >= 1.25 in base case: 2455
(The stress case printout is trimmed to the lines that matter.) Read it as a reader would: a 6.17 percent cap rate looks respectable and the same deal returns 0.60 percent on cash invested, because debt service eats almost all of the NOI. A modest stress on rent, vacancy and rate pushes DSCR below 1.00. The 1.25 line in the last output is an example target I chose to show the method, not a lender requirement.
None of this says the property is good or bad. It says which inputs the answer is sensitive to, and that is what you take back to the listing.
Prompt 1: structure the deal and expose missing inputs
I'm evaluating a rental property. Below is the information I have. Do NOT
calculate returns. Do the following:
1. Put every number into a table: item, value, source (listing / seller /
my estimate / public record / lender quote), and status (VERIFIED /
UNVERIFIED).
2. List each input needed for an underwriting model that is missing:
rent, vacancy, taxes, insurance, utilities, maintenance, management,
capital reserves, closing costs, rate, term, down payment.
3. For each UNVERIFIED or missing item, say where I'd verify it (for
example lease, tax bill, insurer quote, lender estimate) in one line.
4. Flag any number that looks inconsistent with another number.
INFORMATION:
[PASTE LISTING TEXT, SELLER FIGURES, YOUR NOTES]
The status column is the important one. Seller-provided expenses are the usual weak point, and a model that labels them UNVERIFIED is doing more for you than one that adds them up.
Prompt 2: have the model write the calculator, then check it
Write a short Python script (standard library only) that takes these inputs
and prints: effective gross income, operating expenses, NOI, monthly loan
payment, annual debt service, annual cash flow, cap rate, cash-on-cash
return and DSCR.
Define each formula in a comment. Use a standard amortised monthly payment.
Do not hard-code my numbers; take them as a dictionary I can edit.
Then list three ways the result could be wrong (for example, which expenses
people forget).
Run it, then verify the loan payment against a lender's calculator or a spreadsheet PMT function. If your result and theirs differ, fix yours before anything else. Only run code you've read.
Prompt 3: stress-test the assumptions
Here is my underwriting summary: [PASTE YOUR OWN NUMBERS AND THE SCRIPT OUTPUT].
List the five assumptions the result is most sensitive to, with a reason
for each. For each, give a downside value I should test, framed as a
question to check rather than a fact (for example, "what if rent is X lower
than the listing's figure?"). Do not claim what typical vacancy, rent growth,
taxes or repair costs are in any location. Where a figure depends on the
local market, write [LOCAL: verify with ...].
Then change those inputs in your script and rerun. The earlier stress case did this by hand: lower rent, doubled vacancy, higher rate.
Prompt 4: due-diligence question list
Property type: [TYPE]. Occupied by tenants: [YES/NO]. Seller documents I
have: [LIST]. I'm in [COUNTRY/REGION].
Write a due-diligence checklist grouped by: title and legal, tenancy and
leases, physical condition, financials, financing, insurance, local rules.
For each item: what to ask for, who can confirm it, and what a red flag
looks like.
Do not state any law, tax rule or regulation as fact. Where one applies,
phrase it as "Ask a local [lawyer / tax adviser / inspector] about ...".
The checklist is a prompt for conversations with qualified people, not a replacement for them. A model's memory of landlord-tenant law or transfer rules is not a source.
Prompt 5: compare two deals fairly
Compare Deal A and Deal B using the table below. Do not recalculate.
List where each is stronger and weaker on cap rate, cash-on-cash and DSCR,
which inputs are verified vs unverified in each, and what single piece of
missing information would most change the ranking. Do not recommend
either; tell me what I'd need to believe for each to be the better choice.
[PASTE YOUR TABLE]
"What would I need to believe" is a better question than "which is better". It surfaces the assumption the deal rests on.
Failure modes to check for
| What goes wrong | Why | What to do |
|---|---|---|
| Model gets a loan payment wrong | Amortisation is easy to fumble in prose | Script plus lender or spreadsheet check |
| Forgotten expenses make NOI look high | Seller figures often omit reserves and management | Include reserves and management in every case |
| Market "facts" stated confidently | Recollection, not data | Ban market claims; verify from local sources |
| Cap rate used as the only metric | Ignores financing | Report all three metrics together |
| One scenario only | Looks precise, hides sensitivity | Always run a stress case |
| Tenant details pasted into a chat | Convenience | Placeholders; approved tools only |
What not to automate
- The decision to buy. The model can't inspect the building, meet the tenants or know how much loss you can absorb.
- Market, tax and legal conclusions. Rents, taxes, rules on tenancy, ownership structure and financing terms come from primary sources and qualified advisers.
- Lender and insurer terms. Get them in writing from the lender and insurer, not from a model's guess.
- Arithmetic you haven't checked. Verify with a second method before you rely on it.
- Documents with personal data in unapproved tools. Rent rolls and leases identify real people.
If the habit of separating verified facts from guesses is new, avoiding hallucinations explains the use-only-this-source pattern, and how to fact-check AI answers is a short checklist for the output. Browse the prompt library for more templates to adapt.



