Investing in real estate is one of the most reliable ways to build wealth, but not every property is a good deal. The Rental Property Cash Flow Calculator helps you evaluate the potential profitability of an investment property before you buy. By inputting your purchase costs, loan terms, anticipated rent, and operating expenses, you can determine if a property will generate positive cash flow or become a financial burden.
What is Cash Flow?
Cash flow is the net amount of cash moving into and out of your rental business. Positive cash flow occurs when a property's income exceeds its expenses, providing you with profit every month. Negative cash flow means you are losing money on the property monthly, which may be sustainable in the short term if appreciation is high, but is generally risky.
Key Metrics Explained
NOI (Net Operating Income): This is your annual income minus all operating expenses (taxes, insurance, maintenance, vacancy) but excluding mortgage payments. It measures the raw profitability of the asset itself.
Cash on Cash Return (CoC): This metric compares your annual pre-tax cash flow to the total cash invested (Down Payment + Closing Costs). It tells you how hard your money is working for you. A CoC return of 8-12% is often considered a solid benchmark for rental investors.
Cap Rate: Calculated as NOI divided by the property's purchase price. It allows you to compare the profitability of different properties regardless of how they are financed.
Hidden Expenses to Watch For
Many new investors make the mistake of only calculating the mortgage payment against the rent. To get an accurate picture, you must account for:
Vacancy: Properties won't be rented 365 days a year. Budgeting 5-8% for vacancy helps smooth out turnover periods.
CapEx (Capital Expenditures): Big-ticket items like roofs, HVAC systems, and water heaters eventually need replacing. Setting aside reserves monthly prevents financial shock.
Property Management: Even if you plan to self-manage, it's wise to run the numbers with a management fee (typically 8-10%) to ensure the deal still works if you decide to hire a professional later.
function calculateROI() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPayment = parseFloat(document.getElementById('downPayment').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTerm = parseFloat(document.getElementById('loanTerm').value) || 30;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var otherIncome = parseFloat(document.getElementById('otherIncome').value) || 0;
var annualTax = parseFloat(document.getElementById('propertyTax').value) || 0;
var annualIns = parseFloat(document.getElementById('insurance').value) || 0;
var monthlyHOA = parseFloat(document.getElementById('hoaFees').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var maintRate = parseFloat(document.getElementById('maintenanceRate').value) || 0;
var mgmtRate = parseFloat(document.getElementById('mgmtFee').value) || 0;
// 2. Calculate Loan Logic
var loanAmount = price – downPayment;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var monthlyMortgage = 0;
if (loanAmount > 0) {
if (interestRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
}
}
// 3. Calculate Income
var totalMonthlyIncome = monthlyRent + otherIncome;
var annualIncome = totalMonthlyIncome * 12;
// 4. Calculate Variable Expenses (Percentages based on Rent)
var monthlyVacancy = (vacancyRate / 100) * monthlyRent;
var monthlyMaint = (maintenanceRate / 100) * monthlyRent;
var monthlyMgmt = (mgmtRate / 100) * monthlyRent;
// 5. Calculate Total Expenses
var monthlyTax = annualTax / 12;
var monthlyIns = annualIns / 12;
var totalMonthlyOperatingExpenses = monthlyTax + monthlyIns + monthlyHOA + monthlyVacancy + monthlyMaint + monthlyMgmt;
var totalMonthlyExpenses = totalMonthlyOperatingExpenses + monthlyMortgage;
// 6. Calculate Results
var monthlyCashFlow = totalMonthlyIncome – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// NOI (Net Operating Income) = Income – Operating Expenses (No Mortgage)
var monthlyNOI = totalMonthlyIncome – totalMonthlyOperatingExpenses;
var annualNOI = monthlyNOI * 12;
// Cash on Cash Return
var totalCashInvested = downPayment + closingCosts;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// Cap Rate
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// 7. Format Helper
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
// 8. Display Results
document.getElementById('resTotalIncome').innerText = formatter.format(totalMonthlyIncome);
document.getElementById('resMortgage').innerText = formatter.format(monthlyMortgage);
document.getElementById('resOperatingExp').innerText = formatter.format(totalMonthlyOperatingExpenses);
document.getElementById('resCashFlow').innerText = formatter.format(monthlyCashFlow);
document.getElementById('resNOI').innerText = formatter.format(annualNOI);
document.getElementById('resCoC').innerText = cocReturn.toFixed(2) + "%";
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
// Visual styling for Cash Flow
var cashFlowEl = document.getElementById('resCashFlow');
if (monthlyCashFlow >= 0) {
cashFlowEl.className = "result-value positive-cashflow";
} else {
cashFlowEl.className = "result-value negative-cashflow";
}
// Show results area
document.getElementById('results-area').style.display = "block";
}