Investing in real estate is one of the most reliable ways to build wealth, but the difference between a good investment and a liability often comes down to one metric: Cash Flow. Our Rental Property Cash Flow Calculator is designed to give investors a clear picture of their potential returns by analyzing income, expenses, and financing costs.
What is Monthly Cash Flow?
Cash flow is the net amount of money left over after all operating expenses and mortgage payments have been deducted from the rental income. Positive cash flow means the property is generating income for you every month, while negative cash flow implies that you must pay out of pocket to hold the property.
The formula is simple but crucial:
Gross Income: Total rent collected.
Operating Expenses: Taxes, insurance, HOA fees, maintenance, and vacancy reserves.
Net Operating Income (NOI): Gross Income minus Operating Expenses.
Cash Flow: NOI minus Mortgage Payments (Debt Service).
Why Cash on Cash Return Matters
While cash flow tells you the dollar amount you earn monthly, the Cash on Cash (CoC) Return tells you how hard your money is working. It measures the annual cash flow relative to the total capital you invested (down payment + closing costs + rehab costs).
A CoC return of 8-12% is generally considered a solid benchmark for residential rental properties, though this varies by market and strategy.
Estimating Expenses Accurately
Novice investors often overestimate cash flow by underestimating expenses. This calculator includes fields for:
Vacancy Rate: Properties are rarely occupied 365 days a year. A 5-8% vacancy buffer is standard.
Maintenance: Setting aside 10-15% of rent for repairs ensures you aren't caught off guard by a broken water heater or roof leak.
CapEx (Capital Expenditures): Major replacements like HVAC or roofing should be accounted for in your long-term maintenance budget.
Using the Cap Rate
The Capitalization Rate (Cap Rate) calculates the property's natural rate of return without factoring in the mortgage. It is calculated by dividing the annual NOI by the property's purchase price. This metric allows you to compare the profitability of different properties regardless of how they are financed.
function calculateCashFlow() {
// Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPercent = parseFloat(document.getElementById('downPayment').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var years = parseFloat(document.getElementById('loanTerm').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var taxYearly = parseFloat(document.getElementById('propertyTax').value) || 0;
var insuranceYearly = parseFloat(document.getElementById('insurance').value) || 0;
var maintenanceMonthly = parseFloat(document.getElementById('maintenance').value) || 0;
var hoaMonthly = parseFloat(document.getElementById('hoaFees').value) || 0;
// Calculations – Loan
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var totalInvestedCash = downPaymentAmount + closingCosts;
// Mortgage Calculation (P&I)
var monthlyRate = (interestRate / 100) / 12;
var totalPayments = years * 12;
var mortgagePayment = 0;
if (interestRate > 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else {
mortgagePayment = loanAmount / totalPayments;
}
// Calculations – Income & Expenses
var vacancyLoss = monthlyRent * (vacancyRate / 100);
var effectiveGrossIncome = monthlyRent – vacancyLoss;
var monthlyTax = taxYearly / 12;
var monthlyInsurance = insuranceYearly / 12;
// Total Operating Expenses (Excluding Mortgage)
var totalOperatingExpenses = monthlyTax + monthlyInsurance + maintenanceMonthly + hoaMonthly;
// Net Operating Income (NOI)
var monthlyNOI = effectiveGrossIncome – totalOperatingExpenses;
var annualNOI = monthlyNOI * 12;
// Cash Flow
var monthlyCashFlow = monthlyNOI – mortgagePayment;
var annualCashFlow = monthlyCashFlow * 12;
// Returns
var cashOnCash = 0;
if (totalInvestedCash > 0) {
cashOnCash = (annualCashFlow / totalInvestedCash) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// Update UI
document.getElementById('displayMortgage').innerText = "$" + mortgagePayment.toFixed(2);
// Total expenses shown to user includes vacancy loss?
// Usually expenses usually exclude vacancy (which is contra-revenue), but for simple display, we often show operating expenses.
// Let's show Operating Expenses + Vacancy so they see total outflow reduction from Gross Rent.
// Or keep it strict accounting: OpEx only. Let's do OpEx + Vacancy representation for clarity.
var displayExpensesTotal = totalOperatingExpenses + vacancyLoss;
document.getElementById('displayExpenses').innerText = "$" + displayExpensesTotal.toFixed(2);
document.getElementById('displayNOI').innerText = "$" + monthlyNOI.toFixed(2);
var cfElement = document.getElementById('displayCashFlow');
cfElement.innerText = "$" + monthlyCashFlow.toFixed(2);
if (monthlyCashFlow < 0) {
cfElement.classList.add('negative');
cfElement.classList.remove('highlight-result');
} else {
cfElement.classList.remove('negative');
cfElement.classList.add('highlight-result');
}
document.getElementById('displayCoC').innerText = cashOnCash.toFixed(2) + "%";
document.getElementById('displayCapRate').innerText = capRate.toFixed(2) + "%";
// Show Results
document.getElementById('resultsBox').style.display = 'block';
}