Investing in real estate is one of the most reliable ways to build wealth, but the success of an investment hinges on the numbers. This Rental Property Cash Flow Calculator helps investors analyze a potential deal by breaking down income, operating expenses, and debt service to determine the true monthly profit.
Why Cash Flow Matters
Cash flow is the net amount of money moving in and out of a business. In real estate, positive cash flow means your rental income exceeds all expenses (mortgage, taxes, insurance, repairs). This "passive income" provides financial stability and determines whether a property is an asset or a liability.
Key Metrics Explained
NOI (Net Operating Income): This is your annual income minus operating expenses, excluding the mortgage payment. It measures the raw profitability of the property itself.
Cash on Cash ROI: This metric compares your annual pre-tax cash flow to the total cash invested (Down Payment + Closing Costs). It tells you how hard your actual dollars are working for you. A CoC return of 8-12% is often considered a solid benchmark for rental properties.
Vacancy Rate: No property is occupied 100% of the time. Prudent investors assume a vacancy rate (typically 5-8%) to account for turnover periods where no rent is collected.
CapEx & Maintenance: Even if a house is new, things break. Setting aside 5-10% of monthly rent for maintenance ensures you have funds ready for repairs without disrupting your cash flow.
How to Use This Calculator
Input your purchase details and loan terms first. Then, estimate your rental income based on local market comparables ("comps"). Be honest with your expense estimates—underestimating taxes, insurance, or property management fees is the most common mistake new investors make.
function calculateCashFlow() {
// 1. Get DOM elements and values
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPaymentPercent = parseFloat(document.getElementById('downPayment').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var loanTermYears = parseFloat(document.getElementById('loanTerm').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var rentalIncome = parseFloat(document.getElementById('rentalIncome').value);
var propertyTaxYear = parseFloat(document.getElementById('propertyTax').value);
var insuranceYear = parseFloat(document.getElementById('insurance').value);
var hoaMonth = parseFloat(document.getElementById('hoa').value);
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value);
var maintenanceRate = parseFloat(document.getElementById('maintenance').value);
var managementRate = parseFloat(document.getElementById('managementFee').value);
// 2. Validate inputs
if (isNaN(price) || isNaN(rentalIncome) || isNaN(interestRate) || isNaN(loanTermYears)) {
alert("Please enter valid numbers for Price, Income, Interest Rate, and Term.");
return;
}
// 3. Calculate Loan Details
var downPaymentAmount = price * (downPaymentPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var totalPayments = loanTermYears * 12;
// Mortgage Calculation (P&I)
var monthlyMortgage = 0;
if (interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else {
monthlyMortgage = loanAmount / totalPayments;
}
// 4. Calculate Operating Expenses
var monthlyTax = propertyTaxYear / 12;
var monthlyInsurance = insuranceYear / 12;
var vacancyCost = rentalIncome * (vacancyRate / 100);
var maintenanceCost = rentalIncome * (maintenanceRate / 100);
var managementCost = rentalIncome * (managementRate / 100);
var totalOperatingExpenses = monthlyTax + monthlyInsurance + hoaMonth + vacancyCost + maintenanceCost + managementCost;
var totalExpensesWithMortgage = totalOperatingExpenses + monthlyMortgage;
// 5. Calculate Metrics
var netOperatingIncome = rentalIncome – totalOperatingExpenses; // NOI is before mortgage
var monthlyCashFlow = rentalIncome – totalExpensesWithMortgage;
var annualCashFlow = monthlyCashFlow * 12;
var totalCashInvested = downPaymentAmount + closingCosts;
var cashOnCashROI = 0;
if (totalCashInvested > 0) {
cashOnCashROI = (annualCashFlow / totalCashInvested) * 100;
}
// 6. Formatting Currency
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
// 7. Display Results
document.getElementById('resMortgage').innerText = formatter.format(monthlyMortgage);
document.getElementById('resExpenses').innerText = formatter.format(totalExpensesWithMortgage);
document.getElementById('resNOI').innerText = formatter.format(netOperatingIncome);
var cashFlowEl = document.getElementById('resCashFlow');
cashFlowEl.innerText = formatter.format(monthlyCashFlow);
if(monthlyCashFlow >= 0) {
cashFlowEl.className = "positive";
} else {
cashFlowEl.className = "negative";
}
var cocEl = document.getElementById('resCOC');
cocEl.innerText = cashOnCashROI.toFixed(2) + "%";
if(cashOnCashROI >= 0) {
cocEl.className = "positive";
} else {
cocEl.className = "negative";
}
document.getElementById('results-area').style.display = 'block';
}