Analyze your real estate investment potential in seconds.
Monthly Mortgage (P&I)
$0.00
Total Monthly Expenses
$0.00
Monthly Cash Flow
$0.00
Cash on Cash Return
0.00%
Cap Rate
0.00%
Total Initial Investment
$0.00
How to Calculate Rental Property Cash Flow
Investing in real estate requires more than just looking at the monthly rent. To understand if a property is a good deal, you must calculate the Net Cash Flow. This is the amount of money left over after every single expense—including the mortgage, taxes, insurance, and maintenance reserves—has been paid.
Our calculator uses the standard industry formulas to provide you with three critical metrics:
Monthly Cash Flow: The actual "pocket money" generated each month.
Cap Rate (Capitalization Rate): The rate of return on a real estate investment property based on the income that the property is expected to generate, assuming it was bought with cash.
Cash on Cash Return: The ratio of annual before-tax cash flow to the total amount of cash invested, expressed as a percentage. This is often considered the most important metric for financed deals.
Real-World Example Analysis
Imagine you buy a duplex for $300,000 with a 20% down payment ($60,000). If your total monthly expenses (mortgage, taxes, insurance, and repairs) equal $2,100 and your rent is $2,500, your cash flow is $400 per month.
Metric
Good Range
Why it matters
Cap Rate
4% – 10%
Measures property value vs. income independent of financing.
Cash on Cash
8% – 12%+
Shows the actual return on the physical cash you spent.
Vacancy Rate
5% – 8%
Conservative buffer for when the property is unrented.
Why the 1% Rule Isn't Enough
Many investors use the "1% Rule" (rent should be 1% of purchase price) as a quick screen. However, in high-interest rate environments or high-tax states, a property meeting the 1% rule might still produce negative cash flow. Always use a detailed calculator like the one above to account for mortgage interest and rising insurance premiums before making an offer.
function calculateRentalROI() {
var price = parseFloat(document.getElementById('propPrice').value) || 0;
var downPct = parseFloat(document.getElementById('downPercent').value) || 0;
var rate = parseFloat(document.getElementById('intRate').value) || 0;
var term = parseFloat(document.getElementById('loanTerm').value) || 0;
var rent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var taxes = parseFloat(document.getElementById('annualTax').value) || 0;
var insurance = parseFloat(document.getElementById('annualIns').value) || 0;
var maintPct = parseFloat(document.getElementById('maintPercent').value) || 0;
// Calculations
var downPayment = price * (downPct / 100);
var loanAmount = price – downPayment;
var monthlyRate = (rate / 100) / 12;
var totalPayments = term * 12;
var monthlyMortgage = 0;
if (rate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else {
monthlyMortgage = loanAmount / totalPayments;
}
var monthlyTaxes = taxes / 12;
var monthlyIns = insurance / 12;
var monthlyMaint = rent * (maintPct / 100);
var totalMonthlyExpenses = monthlyMortgage + monthlyTaxes + monthlyIns + monthlyMaint;
var netCashFlow = rent – totalMonthlyExpenses;
var annualNOI = (rent – (monthlyTaxes + monthlyIns + monthlyMaint)) * 12;
var capRate = (annualNOI / price) * 100;
var cashOnCash = ((netCashFlow * 12) / downPayment) * 100;
// Display Results
document.getElementById('resMortgage').innerText = '$' + monthlyMortgage.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resExpenses').innerText = '$' + totalMonthlyExpenses.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resCashFlow').innerText = '$' + netCashFlow.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resCoC').innerText = isFinite(cashOnCash) ? cashOnCash.toFixed(2) + '%' : 'N/A';
document.getElementById('resCap').innerText = capRate.toFixed(2) + '%';
document.getElementById('resInvest').innerText = '$' + downPayment.toLocaleString();
document.getElementById('results').style.display = 'block';
}