Investing in real estate is a powerful way to build wealth, but simply buying a property doesn't guarantee a profit. To succeed, investors must analyze the numbers objectively. This Rental Property Cash Flow Calculator helps you evaluate the financial viability of a potential investment by breaking down income, expenses, and financing costs.
Key Metrics Explained
Cash Flow
This is the money left over after all expenses and mortgage payments are paid. Positive cash flow ensures the property pays for itself and generates profit.
Formula: Income – Vacancy – Expenses – Debt Service
Net Operating Income (NOI)
NOI measures the profitability of a property before adding in any financing costs or taxes. It is purely based on the property's ability to generate revenue relative to its operating expenses.
Formula: (Gross Operating Income – Operating Expenses)
Cash on Cash Return (CoC)
This metric compares your annual pre-tax cash flow to the total cash invested (down payment + closing costs + rehab costs). It tells you how hard your actual dollars are working for you.
Cap rate estimates the return on investment if you paid all cash for the property. It helps compare different properties regardless of financing.
Formula: (Net Operating Income / Current Market Value) × 100
Example Calculation
Let's look at a realistic scenario for a single-family home rental:
Purchase Price: $250,000
Down Payment: 20% ($50,000)
Monthly Rent: $2,200
Interest Rate: 6.5%
Assuming operating expenses (taxes, insurance, maintenance) and a 5% vacancy allowance total roughly $800/month, and the mortgage principal and interest comes to roughly $1,264/month:
The Monthly Cash Flow would be approximately $136 ($2,200 rent – $800 expenses – $1,264 mortgage). While modest, this positive flow means the tenant is buying the house for you, while you benefit from potential appreciation and tax advantages.
function calculateROI() {
// 1. Get Input Values
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPaymentPercent = parseFloat(document.getElementById('downPayment').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 vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var annualTax = parseFloat(document.getElementById('propertyTax').value) || 0;
var annualInsurance = parseFloat(document.getElementById('insurance').value) || 0;
var maintenancePercent = parseFloat(document.getElementById('maintenance').value) || 0;
var hoaFees = parseFloat(document.getElementById('hoaFees').value) || 0;
var managementFeePercent = parseFloat(document.getElementById('managementFee').value) || 0;
// 2. Perform Calculations
// Loan Calculations
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var totalCashInvested = downPaymentAmount + closingCosts;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var mortgagePayment = 0;
if (interestRate > 0 && loanTerm > 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (loanTerm > 0) {
mortgagePayment = loanAmount / numberOfPayments;
}
// Income Calculations
var vacancyCost = monthlyRent * (vacancyRate / 100);
var grossOperatingIncome = monthlyRent – vacancyCost;
// Expense Calculations
var monthlyTax = annualTax / 12;
var monthlyInsurance = annualInsurance / 12;
var maintenanceCost = monthlyRent * (maintenancePercent / 100);
var managementCost = monthlyRent * (managementFeePercent / 100);
var totalOperatingExpenses = monthlyTax + monthlyInsurance + maintenanceCost + hoaFees + managementCost;
// Core Metrics
var noiMonthly = grossOperatingIncome – totalOperatingExpenses;
var monthlyCashFlow = noiMonthly – mortgagePayment;
var annualCashFlow = monthlyCashFlow * 12;
var annualNOI = noiMonthly * 12;
// Return Metrics
var capRate = 0;
if (purchasePrice > 0) {
capRate = (annualNOI / purchasePrice) * 100;
}
var cashOnCash = 0;
if (totalCashInvested > 0) {
cashOnCash = (annualCashFlow / totalCashInvested) * 100;
}
// 3. Format and Display Results
// Function to format currency
function formatMoney(num) {
return "$" + num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
// Function to format percentage
function formatPercent(num) {
return num.toFixed(2) + "%";
}
document.getElementById('resMonthlyCashFlow').innerText = formatMoney(monthlyCashFlow);
document.getElementById('resCashOnCash').innerText = formatPercent(cashOnCash);
document.getElementById('resNOI').innerText = formatMoney(noiMonthly);
document.getElementById('resTotalExpenses').innerText = formatMoney(totalOperatingExpenses);
document.getElementById('resMortgage').innerText = formatMoney(mortgagePayment);
document.getElementById('resCapRate').innerText = formatPercent(capRate);
// Styling for positive/negative flow
var cashFlowElement = document.getElementById('resMonthlyCashFlow');
if (monthlyCashFlow >= 0) {
cashFlowElement.className = "result-value highlight-value positive";
} else {
cashFlowElement.className = "result-value highlight-value negative";
}
document.getElementById('results').style.display = 'block';
}