Investing in rental real estate is one of the most reliable ways to build long-term wealth, but not every property is a good deal. To ensure your investment is profitable, you must accurately calculate your Cash Flow and Return on Investment (ROI).
This Rental Property Cash Flow Calculator helps investors evaluate potential deals by factoring in mortgage costs, operating expenses, and vacancy rates. Below, we break down the key metrics every landlord should understand.
1. Net Operating Income (NOI)
NOI is the total income generated by the property minus all necessary operating expenses. Note: NOI does not include mortgage payments. It is a pure measure of the property's ability to generate revenue.
Cash flow is the money left over after paying all expenses, including your mortgage. Positive cash flow means the property pays for itself and puts money in your pocket every month. Negative cash flow implies you are losing money to hold the asset.
Experienced investors typically look for at least $100-$200 per door in net monthly cash flow to buffer against unexpected repairs.
3. Cash on Cash Return (CoC)
This metric measures the annual return on the actual cash you invested (down payment + closing costs + rehab costs), rather than the total loan amount. It allows you to compare real estate investments against other assets like stocks.
8-12% is generally considered a good CoC return in most markets.
15%+ is considered an excellent return.
4. Cap Rate (Capitalization Rate)
The Cap Rate measures the natural rate of return of the property assuming you bought it with all cash (no loan). It helps compare the profitability of properties in different areas regardless of financing terms.
Formula: NOI / Purchase Price
Common Operating Expenses to Watch
Vacancy Rate: You won't have a tenant 12 months a year forever. Use 5-8% to be safe.
Maintenance: Roofs leak and toilets break. Budgeting 5-10% of the rent for repairs is crucial.
CapEx (Capital Expenditures): Major replacements like HVAC or roofing.
function calculateRental() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var termYears = parseFloat(document.getElementById('loanTerm').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var taxYear = parseFloat(document.getElementById('propTax').value);
var insYear = parseFloat(document.getElementById('insurance').value);
var hoaMonth = parseFloat(document.getElementById('hoa').value);
var maintPercent = parseFloat(document.getElementById('maintenance').value);
var vacancyPercent = parseFloat(document.getElementById('vacancy').value);
// Validation
if (isNaN(price) || isNaN(rent) || isNaN(interestRate) || price 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// Expense Calculations (Monthly)
var monthlyTax = taxYear / 12;
var monthlyIns = insYear / 12;
var monthlyMaint = rent * (maintPercent / 100);
var monthlyVacancy = rent * (vacancyPercent / 100);
var totalOperatingExpenses = monthlyTax + monthlyIns + hoaMonth + monthlyMaint + monthlyVacancy;
var totalMonthlyCosts = totalOperatingExpenses + monthlyMortgage;
// Income Metrics
var netOperatingIncomeMonth = rent – totalOperatingExpenses;
var cashFlow = rent – totalMonthlyCosts;
var annualNOI = netOperatingIncomeMonth * 12;
var annualCashFlow = cashFlow * 12;
// ROI Metrics
var totalCashInvested = downPayment + closingCosts;
var cashOnCash = 0;
if (totalCashInvested > 0) {
cashOnCash = (annualCashFlow / totalCashInvested) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// 3. Display Results
document.getElementById('resultBox').style.display = 'block';
// Format Currency Helper
function fmt(num) {
return "$" + num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
function fmtPct(num) {
return num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + "%";
}
document.getElementById('resIncome').innerText = fmt(rent);
document.getElementById('resMortgage').innerText = fmt(monthlyMortgage);
document.getElementById('resExpenses').innerText = fmt(totalOperatingExpenses);
var cfEl = document.getElementById('resCashFlow');
cfEl.innerText = fmt(cashFlow);
if(cashFlow < 0) {
cfEl.classList.add('negative-flow');
} else {
cfEl.classList.remove('negative-flow');
}
document.getElementById('resNOI').innerText = fmt(annualNOI);
document.getElementById('resCoC').innerText = fmtPct(cashOnCash);
document.getElementById('resCapRate').innerText = fmtPct(capRate);
}