Calculating the potential return on investment (ROI) for a rental property is the single most important step before purchasing real estate. Unlike a primary residence, a rental property is a business, and its viability depends entirely on the numbers.
Positive Cash Flow is the holy grail of real estate investing. It represents the money left over each month after all operating expenses and debt service (mortgage payments) have been paid. A property with positive cash flow pays for itself while potentially appreciating in value over time.
Key Metrics Explained
1. Net Operating Income (NOI)
NOI is a calculation used to analyze the profitability of income-generating real estate investments. NOI equals all revenue from the property, minus all reasonably necessary operating expenses. Notably, NOI is a before-tax figure and excludes principal and interest payments on loans, capital expenditures, and depreciation.
2. Cap Rate (Capitalization Rate)
The Cap Rate measures a property's natural rate of return for a single year without taking into account debt. It is calculated by dividing the NOI by the property's purchase price. This metric allows you to compare properties directly, regardless of how they are financed.
3. Cash on Cash Return
This is arguably the most critical metric for investors using financing. It measures the annual cash flow relative to the amount of actual cash invested (down payment + closing costs). A Cash on Cash return of 8-12% is generally considered a solid benchmark in many markets.
How to Use This Calculator
To get the most accurate results, ensure you account for "hidden" costs. Many new investors forget to calculate Vacancy Rates (the time the property sits empty) and Maintenance/CapEx (saving for roof repairs, HVAC replacement, etc.). A safe rule of thumb is to allocate 5-10% of gross rent for maintenance and 5-8% for vacancy.
function calculateCashFlow() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var downPercent = parseFloat(document.getElementById('downPayment').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var termYears = parseFloat(document.getElementById('loanTerm').value) || 0;
var rent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var propTaxYearly = parseFloat(document.getElementById('propertyTax').value) || 0;
var insuranceYearly = parseFloat(document.getElementById('insurance').value) || 0;
var hoaMonthly = parseFloat(document.getElementById('hoaFee').value) || 0;
var maintPercent = parseFloat(document.getElementById('maintenance').value) || 0;
var mgmtPercent = parseFloat(document.getElementById('managementFee').value) || 0;
// 2. Calculate Mortgage (Principal + Interest)
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var totalPayments = termYears * 12;
var mortgagePayment = 0;
if (monthlyRate > 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else {
mortgagePayment = loanAmount / totalPayments;
}
// 3. Calculate Monthly Operating Expenses
var vacancyCost = rent * (vacancyRate / 100);
var maintCost = rent * (maintPercent / 100);
var mgmtCost = rent * (mgmtPercent / 100);
var taxMonthly = propTaxYearly / 12;
var insuranceMonthly = insuranceYearly / 12;
var totalOperatingExpenses = taxMonthly + insuranceMonthly + hoaMonthly + vacancyCost + maintCost + mgmtCost;
// 4. Calculate NOI (Net Operating Income) -> Monthly
var monthlyNOI = rent – totalOperatingExpenses;
var annualNOI = monthlyNOI * 12;
// 5. Calculate Cash Flow
var totalMonthlyExpenses = totalOperatingExpenses + mortgagePayment;
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// 6. Calculate Cash on Cash ROI
var totalCashInvested = downPaymentAmount + closingCosts;
var cocROI = 0;
if (totalCashInvested > 0) {
cocROI = (annualCashFlow / totalCashInvested) * 100;
}
// 7. Calculate Cap Rate
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// 8. Update DOM
document.getElementById('results').style.display = 'block';
// Helper for currency formatting
var fmtMoney = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
var fmtPercent = new Intl.NumberFormat('en-US', { style: 'percent', minimumFractionDigits: 2, maximumFractionDigits: 2 });
var cashFlowEl = document.getElementById('resCashFlow');
cashFlowEl.innerText = fmtMoney.format(monthlyCashFlow);
// Color coding for cash flow
if (monthlyCashFlow >= 0) {
cashFlowEl.className = 'result-value positive-flow';
} else {
cashFlowEl.className = 'result-value negative-flow';
}
document.getElementById('resCoc').innerText = cocROI.toFixed(2) + '%';
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + '%';
document.getElementById('resNOI').innerText = fmtMoney.format(monthlyNOI); // Displaying Monthly NOI
document.getElementById('resExpenses').innerText = fmtMoney.format(totalMonthlyExpenses);
document.getElementById('resMortgage').innerText = fmtMoney.format(mortgagePayment);
}