Analyze your real estate investment performance instantly.
Purchase & Loan Details
Income & Recurring Expenses
Monthly Financial Overview
Principal & Interest (Mortgage)$0.00
Total Monthly Expenses (Inc. Reserves)$0.00
Net Monthly Cash Flow$0.00
Annual Returns
Net Operating Income (NOI)$0.00
Cash on Cash Return (CoC)0.00%
How to Calculate Rental Property Cash Flow
Understanding the liquidity of your real estate investment is crucial for long-term success. Rental property cash flow is the net amount of money moving into or out of a property after all expenses and debt service are paid. A positive cash flow indicates that the property is generating income, while negative cash flow means the property costs you money to hold.
Key Metrics Explained
Net Operating Income (NOI): This is your annual revenue minus necessary operating expenses (excluding mortgage payments). It measures the raw profitability of the property as an asset.
Cash on Cash Return (CoC): This metric compares your annual pre-tax cash flow to the total cash invested (down payment). It gives you a percentage return on your actual cash deployed, making it easy to compare against stocks or other investments.
Vacancy & Maintenance Reserves: Experienced investors always budget for the unexpected. Deducting a percentage for vacancies (months without a tenant) and maintenance ensures your cash flow calculation reflects reality.
Using This Calculator
This tool is designed specifically for buy-and-hold real estate investors. By inputting your purchase details, financing terms, and projected operating costs, you can instantly determine if a deal makes financial sense. Adjust the "Down Payment" and "Offer Price" to see how different deal structures affect your bottom line ROI.
function calculateRentalCashFlow() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('rc_price').value);
var downPercent = parseFloat(document.getElementById('rc_down_percent').value);
var rate = parseFloat(document.getElementById('rc_rate').value);
var termYears = parseFloat(document.getElementById('rc_term').value);
var rent = parseFloat(document.getElementById('rc_rent').value);
var annualTax = parseFloat(document.getElementById('rc_tax').value);
var annualIns = parseFloat(document.getElementById('rc_insurance').value);
var monthlyHOA = parseFloat(document.getElementById('rc_hoa').value);
var vacancyPercent = parseFloat(document.getElementById('rc_vacancy').value);
var maintenancePercent = parseFloat(document.getElementById('rc_maintenance').value);
// Validation to prevent NaN
if (isNaN(price) || isNaN(rent) || isNaN(rate) || isNaN(termYears)) {
alert("Please enter valid numbers for Price, Rent, Interest Rate, and Term.");
return;
}
// 2. Calculations
// Mortgage Calculation
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (rate / 100) / 12;
var numPayments = termYears * 12;
var mortgagePayment = 0;
if (monthlyRate > 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numPayments)) / (Math.pow(1 + monthlyRate, numPayments) – 1);
} else {
mortgagePayment = loanAmount / numPayments;
}
// Monthly Expense Breakdown
var monthlyTax = annualTax / 12;
var monthlyIns = annualIns / 12;
var monthlyVacancyCost = rent * (vacancyPercent / 100);
var monthlyMaintenanceCost = rent * (maintenancePercent / 100);
var totalMonthlyExpenses = mortgagePayment + monthlyTax + monthlyIns + monthlyHOA + monthlyVacancyCost + monthlyMaintenanceCost;
// Cash Flow
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// NOI (Net Operating Income) = Income – Operating Expenses (Excluding Debt Service)
var operatingExpensesMonthly = monthlyTax + monthlyIns + monthlyHOA + monthlyVacancyCost + monthlyMaintenanceCost;
var annualNOI = (rent – operatingExpensesMonthly) * 12;
// Cash on Cash Return = Annual Cash Flow / Total Cash Invested (assuming Closing Costs are roughly included or just using downpayment for simplicity in this specific calc)
var cashInvested = downPaymentAmount; // Can add closing costs variable if needed, sticking to prompt simplicity
var cocReturn = 0;
if (cashInvested > 0) {
cocReturn = (annualCashFlow / cashInvested) * 100;
}
// 3. Update UI
document.getElementById('res_mortgage').innerText = formatCurrency(mortgagePayment);
document.getElementById('res_expenses').innerText = formatCurrency(totalMonthlyExpenses);
var cashFlowElem = document.getElementById('res_cashflow');
cashFlowElem.innerText = formatCurrency(monthlyCashFlow);
// Style result based on positivity
if (monthlyCashFlow >= 0) {
cashFlowElem.className = 'result-value cash-flow-positive';
} else {
cashFlowElem.className = 'result-value cash-flow-negative';
}
document.getElementById('res_noi').innerText = formatCurrency(annualNOI);
document.getElementById('res_coc').innerText = cocReturn.toFixed(2) + '%';
// Show results container
document.getElementById('rc_results').style.display = 'block';
}
function formatCurrency(num) {
return '$' + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}