Investing in real estate is one of the most reliable ways to build wealth, but not every property is a good investment. The difference between a profitable asset and a financial burden often comes down to one metric: Cash Flow. Our Rental Property Cash Flow Calculator helps investors analyze potential deals by breaking down income, operating expenses, and debt service.
How to Calculate Rental Property Cash Flow
Cash flow is the money left over after all expenses have been paid. The basic formula used in real estate investing is:
Operating expenses include property taxes, insurance, maintenance, property management fees, and HOA dues. Debt service refers to your monthly mortgage principal and interest payments.
Key Metrics Explained
Net Operating Income (NOI): This is the profitability of the property before mortgage payments. It is calculated by subtracting operating expenses from the gross income. Lenders often look at NOI to determine if a property generates enough income to cover the loan.
Cap Rate (Capitalization Rate): Calculated as (Annual NOI / Purchase Price) × 100. This percentage allows you to compare the profitability of different properties regardless of how they are financed. A higher cap rate generally indicates a better return, though often with higher risk.
Cash on Cash Return: This metric measures the annual return on the actual cash you invested (down payment + closing costs). It gives you a clear picture of how hard your money is working for you compared to other investments like stocks or bonds.
Example Calculation
Let's say you purchase a property for $250,000 with 20% down ($50,000). You rent it out for $2,200 per month.
If your mortgage is $1,200, taxes and insurance are $350, and you set aside $150 for maintenance, your total outflows are $1,700. Your monthly cash flow would be $500 ($2,200 – $1,700). This represents the passive income you pocket every month.
Why Use a Cash Flow Calculator?
Emotions can cloud judgment when buying real estate. A beautiful house might seem like a great rental, but if the numbers don't work, it's a bad investment. By using a specialized calculator, you can objectively assess the financial viability of a property, adjust for variables like vacancy rates or higher interest rates, and make data-driven decisions to grow your portfolio.
function calculateInvestment() {
// 1. Get Input Values
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPaymentPercent = parseFloat(document.getElementById('downPaymentPercent').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTerm = parseFloat(document.getElementById('loanTerm').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var annualPropertyTax = parseFloat(document.getElementById('annualPropertyTax').value) || 0;
var annualInsurance = parseFloat(document.getElementById('annualInsurance').value) || 0;
var monthlyHOA = parseFloat(document.getElementById('monthlyHOA').value) || 0;
var monthlyMaintenance = parseFloat(document.getElementById('monthlyMaintenance').value) || 0;
// 2. Calculate Mortgage (P&I)
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var monthlyMortgage = 0;
if (interestRate > 0 && loanTerm > 0) {
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (loanTerm > 0) {
// 0% interest case
monthlyMortgage = loanAmount / (loanTerm * 12);
}
// 3. Calculate Expenses & NOI
// Operating Expenses (Tax, Ins, HOA, Maint) – Excluding Mortgage
var monthlyTax = annualPropertyTax / 12;
var monthlyInsurance = annualInsurance / 12;
var totalOperatingExpensesMonthly = monthlyTax + monthlyInsurance + monthlyHOA + monthlyMaintenance;
var monthlyNOI = monthlyRent – totalOperatingExpensesMonthly;
var annualNOI = monthlyNOI * 12;
// 4. Calculate Cash Flow
// Total Outflow includes Mortgage
var totalMonthlyOutflow = totalOperatingExpensesMonthly + monthlyMortgage;
var monthlyCashFlow = monthlyRent – totalMonthlyOutflow;
var annualCashFlow = monthlyCashFlow * 12;
// 5. Calculate Returns
var totalCashInvested = downPaymentAmount + closingCosts;
var cashOnCashReturn = 0;
if (totalCashInvested > 0) {
cashOnCashReturn = (annualCashFlow / totalCashInvested) * 100;
}
var capRate = 0;
if (purchasePrice > 0) {
capRate = (annualNOI / purchasePrice) * 100;
}
// 6. Display Results
document.getElementById('resMortgage').innerText = formatCurrency(monthlyMortgage);
document.getElementById('resExpenses').innerText = formatCurrency(totalMonthlyOutflow); // Showing total outflow (Expenses + Mortgage) contextually or split?
// Usually "Expenses" implies Operating. Let's clarify label or show Operating + Mortgage.
// For the UI, let's show Total Monthly Outflow (Exp + Mtg) to be clear why Cashflow is what it is.
// Re-labeling in JS for clarity:
document.getElementById('resExpenses').innerText = formatCurrency(totalMonthlyOutflow);
document.getElementById('resNOI').innerText = formatCurrency(monthlyNOI);
var cfElement = document.getElementById('resCashFlow');
cfElement.innerText = formatCurrency(monthlyCashFlow);
if(monthlyCashFlow >= 0) {
cfElement.className = "result-value positive";
} else {
cfElement.className = "result-value negative";
}
document.getElementById('resCoC').innerText = cashOnCashReturn.toFixed(2) + "%";
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
// Show results div
document.getElementById('results').style.display = 'block';
}
function formatCurrency(num) {
return "$" + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}