Rental property cash flow is the net amount of money remaining after all property-related expenses and mortgage payments have been deducted from the gross rental income. Positive cash flow ensures that the property pays for itself and generates profit, while negative cash flow implies that the investor must contribute money out of pocket to sustain the investment.
Calculating cash flow accurately is crucial for real estate investors to evaluate the viability of a deal. It involves looking beyond just the rent and mortgage, factoring in vacancy rates, maintenance reserves, taxes, insurance, and homeowner association (HOA) fees.
Key Metrics: CoC Return and Cap Rate
This calculator provides two essential metrics for evaluating real estate performance:
Cash on Cash (CoC) Return: This measures the annual pre-tax cash flow divided by the total cash invested (Down Payment + Closing Costs). It tells you how hard your actual cash is working for you. A CoC of 8-12% is often considered a strong return in many markets.
Cap Rate (Capitalization Rate): This measures the Net Operating Income (NOI) against the property's purchase price, ignoring debt financing. It is useful for comparing the intrinsic profitability of different properties regardless of how they are financed.
Example Calculation
Consider a property purchased for $200,000 with a 20% down payment ($40,000). If the monthly rent is $2,000, but you have $300 in taxes/insurance, $200 set aside for maintenance, and a mortgage payment of roughly $1,000, your cash flow is calculated by subtracting these outflows from the income.
Using the inputs above, you can tweak the Vacancy Rate and Maintenance % to see how sensitive your investment is to unforeseen vacancies or repairs.
function calculateRentalCashFlow() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var loanTerm = parseFloat(document.getElementById('loanTerm').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value);
var yearlyTax = parseFloat(document.getElementById('propertyTax').value);
var yearlyIns = parseFloat(document.getElementById('insurance').value);
var monthlyHOA = parseFloat(document.getElementById('hoaFees').value);
var maintenancePercent = parseFloat(document.getElementById('maintenance').value);
// Validation to prevent NaN errors
if (isNaN(price)) price = 0;
if (isNaN(downPercent)) downPercent = 0;
if (isNaN(interestRate)) interestRate = 0;
if (isNaN(closingCosts)) closingCosts = 0;
if (isNaN(rent)) rent = 0;
if (isNaN(vacancyRate)) vacancyRate = 0;
if (isNaN(yearlyTax)) yearlyTax = 0;
if (isNaN(yearlyIns)) yearlyIns = 0;
if (isNaN(monthlyHOA)) monthlyHOA = 0;
if (isNaN(maintenancePercent)) maintenancePercent = 0;
// 2. Loan Calculations
var downPayment = price * (downPercent / 100);
var loanAmount = price – downPayment;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var monthlyMortgage = 0;
if (interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// 3. Income & Expense Calculations
var grossIncome = rent;
var vacancyLoss = grossIncome * (vacancyRate / 100);
var maintenanceCost = grossIncome * (maintenancePercent / 100);
var monthlyTax = yearlyTax / 12;
var monthlyIns = yearlyIns / 12;
var totalOpEx = monthlyTax + monthlyIns + monthlyHOA + maintenanceCost;
var noi = (grossIncome – vacancyLoss) – totalOpEx; // Net Operating Income
var monthlyCashFlow = noi – monthlyMortgage;
var yearlyCashFlow = monthlyCashFlow * 12;
// 4. Return Metrics
var totalCashInvested = downPayment + closingCosts;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (yearlyCashFlow / totalCashInvested) * 100;
}
var yearlyNOI = noi * 12;
var capRate = 0;
if (price > 0) {
capRate = (yearlyNOI / price) * 100;
}
// 5. Update UI
document.getElementById('resultsArea').style.display = 'block';
var currencyFormat = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('resGrossIncome').innerText = currencyFormat.format(grossIncome);
document.getElementById('resVacancy').innerText = "-" + currencyFormat.format(vacancyLoss);
document.getElementById('resOpEx').innerText = "-" + currencyFormat.format(totalOpEx);
document.getElementById('resNOI').innerText = currencyFormat.format(noi);
document.getElementById('resMortgage').innerText = "-" + currencyFormat.format(monthlyMortgage);
var cashFlowEl = document.getElementById('resCashFlow');
cashFlowEl.innerText = currencyFormat.format(monthlyCashFlow);
if(monthlyCashFlow >= 0) {
cashFlowEl.className = "result-value highlight-positive";
} else {
cashFlowEl.className = "result-value highlight-negative";
}
document.getElementById('resCashInvested').innerText = currencyFormat.format(totalCashInvested);
var cocEl = document.getElementById('resCoC');
cocEl.innerText = cocReturn.toFixed(2) + "%";
if(cocReturn >= 0) cocEl.className = "result-value highlight-positive";
else cocEl.className = "result-value highlight-negative";
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
}