For rental property investors, not all metrics are created equal. While "cap rate" is popular for valuing commercial properties, Cash-on-Cash (CoC) Return is arguably the most critical metric for residential real estate investors using leverage (mortgages). It measures the annual return on the actual cash you invested, rather than the total value of the property.
The Cash-on-Cash Return Calculator above helps you quickly analyze a deal by factoring in income, operating expenses, and debt service to give you a clear picture of your actual profitability.
How the Calculation Works
The formula is straightforward but requires accurate inputs to be effective:
Annual Pre-Tax Cash Flow: This is your gross rental income minus all operating expenses (taxes, insurance, maintenance, vacancy) and debt service (mortgage payments).
Total Cash Invested: This includes your down payment, closing costs, and any immediate repair costs required to make the property rentable.
A "good" Cash-on-Cash return varies by market and investor strategy, but generally:
8% – 12%: Often considered a solid return in stable markets, beating the average stock market return.
12% – 15%: Excellent returns, usually found in cash-flow-heavy markets or deals with value-add potential.
Above 20%: Exceptional, but often comes with higher risks or requires significant "sweat equity" (rehab work).
Why Cash Flow Matters More Than Appreciation
While property appreciation builds long-term wealth, cash flow keeps you in business. A property with negative cash flow becomes a liability that drains your bank account every month. Using this calculator ensures you buy assets that pay you to own them, providing a buffer against market downturns.
Tips for Improving Your ROI
If the calculator shows a return lower than your target, consider these adjustments:
Negotiate Price: Lowering the purchase price reduces your loan amount and down payment.
Reduce Vacancy: High-quality tenants and marketing can lower vacancy rates below the standard 5-8%.
Increase Rent: Can minor cosmetic upgrades justify a higher monthly rent?
function calculateRentalROI() {
// 1. Get Inputs using var
var price = parseFloat(document.getElementById('purchasePrice').value);
var closing = parseFloat(document.getElementById('closingCosts').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var years = parseFloat(document.getElementById('loanTerm').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var taxes = parseFloat(document.getElementById('annualTaxes').value);
var insurance = parseFloat(document.getElementById('annualInsurance').value);
var vacancyPercent = parseFloat(document.getElementById('vacancyRate').value);
var maintPercent = parseFloat(document.getElementById('maintenanceRate').value);
// 2. Input Validation
if (isNaN(price) || isNaN(rent) || isNaN(downPercent) || isNaN(interestRate) || isNaN(years)) {
alert("Please fill out all required fields with valid numbers.");
return;
}
// Handle optional fields as 0 if empty
if (isNaN(closing)) closing = 0;
if (isNaN(taxes)) taxes = 0;
if (isNaN(insurance)) insurance = 0;
if (isNaN(vacancyPercent)) vacancyPercent = 0;
if (isNaN(maintPercent)) maintPercent = 0;
// 3. Logic & Calculations
// Mortgage Calculation
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = years * 12;
var monthlyMortgage = 0;
if (interestRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
monthlyMortgage = (loanAmount * monthlyRate) / (1 – Math.pow(1 + monthlyRate, -numberOfPayments));
}
// Operating Expenses
var monthlyTaxes = taxes / 12;
var monthlyInsurance = insurance / 12;
var monthlyVacancy = rent * (vacancyPercent / 100);
var monthlyMaintenance = rent * (maintPercent / 100);
// Total Monthly Outflow (Mortgage + Expenses)
var totalMonthlyExpenses = monthlyMortgage + monthlyTaxes + monthlyInsurance + monthlyVacancy + monthlyMaintenance;
// Cash Flow
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// Investment Base
var totalCashInvested = downPaymentAmount + closing;
// Cash on Cash Return
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// 4. Update UI
document.getElementById('roi-results').style.display = 'block';
// Format currency helper
var fmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('resMortgage').innerText = fmt.format(monthlyMortgage);
document.getElementById('resExpenses').innerText = fmt.format(totalMonthlyExpenses);
// Handle negative cash flow styling
var mFlowEl = document.getElementById('resMonthlyCashFlow');
mFlowEl.innerText = fmt.format(monthlyCashFlow);
if(monthlyCashFlow < 0) {
mFlowEl.classList.add('roi-negative');
mFlowEl.classList.remove('roi-highlight');
} else {
mFlowEl.classList.remove('roi-negative');
mFlowEl.classList.add('roi-highlight');
}
document.getElementById('resCashInvested').innerText = fmt.format(totalCashInvested);
var aFlowEl = document.getElementById('resAnnualCashFlow');
aFlowEl.innerText = fmt.format(annualCashFlow);
if(annualCashFlow < 0) {
aFlowEl.classList.add('roi-negative');
aFlowEl.classList.remove('roi-highlight');
} else {
aFlowEl.classList.remove('roi-negative');
aFlowEl.classList.add('roi-highlight');
}
var cocEl = document.getElementById('resCoC');
cocEl.innerText = cocReturn.toFixed(2) + "%";
if(cocReturn < 0) {
cocEl.style.color = "#c0392b";
} else {
cocEl.style.color = "#27ae60";
}
}