Cash on Cash Return (CoC) is one of the most critical metrics for real estate investors. Unlike simple ROI, which might look at total profit against total price, CoC Return measures the annual pre-tax cash flow generated by the property relative to the actual amount of cash invested. This is particularly useful for leveraged investments where you use a mortgage to purchase the property.
How is Cash on Cash Return Calculated?
The formula is relatively straightforward but requires accurate data regarding your initial outlay and ongoing operations:
Annual Pre-Tax Cash Flow: This is your gross rent minus all operating expenses (taxes, insurance, maintenance, HOA) and debt service (mortgage payments).
Total Cash Invested: This includes your down payment, closing costs, and any immediate renovation or repair costs paid out of pocket.
The formula is: (Annual Pre-Tax Cash Flow / Total Cash Invested) × 100 = CoC Return %.
What is a "Good" Cash on Cash Return?
While target returns vary by market and investor strategy, a common benchmark for residential rental properties is between 8% and 12%. In highly competitive markets with potential for high appreciation, investors might accept lower cash flow returns (4-6%). In riskier or lower-cost markets, investors often seek 15% or higher to compensate for potential vacancy or maintenance issues.
Why Use This Calculator?
Before making an offer on a rental property, it is vital to separate emotion from mathematics. This Rental Property Cash on Cash Return Calculator helps you determine if a property will generate positive cash flow from day one, ensuring your capital is working efficiently. By adjusting the "Monthly Rent" or "Offer Price" (Purchase Price), you can determine the maximum you should pay to hit your target yield.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value);
var closing = parseFloat(document.getElementById('closingCosts').value);
var repairs = parseFloat(document.getElementById('repairCosts').value);
var down = parseFloat(document.getElementById('downPayment').value);
var rate = parseFloat(document.getElementById('interestRate').value);
var years = parseFloat(document.getElementById('loanTerm').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var expenses = parseFloat(document.getElementById('monthlyExpenses').value);
// 2. Validation
if (isNaN(price) || isNaN(down) || isNaN(rent) || isNaN(expenses)) {
alert("Please ensure all fields contain valid numbers.");
return;
}
// 3. Calculate Loan Details
var loanAmount = price – down;
var monthlyInterestRate = (rate / 100) / 12;
var numberOfPayments = years * 12;
// Mortgage Calculation (Principal + Interest)
var monthlyMortgage = 0;
if (rate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else if (loanAmount > 0) {
monthlyMortgage = loanAmount *
(monthlyInterestRate * Math.pow(1 + monthlyInterestRate, numberOfPayments)) /
(Math.pow(1 + monthlyInterestRate, numberOfPayments) – 1);
}
// 4. Calculate Cash Flow
var totalMonthlyOutflow = monthlyMortgage + expenses;
var monthlyCashFlow = rent – totalMonthlyOutflow;
var annualCashFlow = monthlyCashFlow * 12;
// 5. Calculate Total Investment
var totalCashInvested = down + closing + repairs;
// 6. Calculate CoC Return
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// 7. Display Results
// Helper for currency formatting
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
document.getElementById('resTotalInvested').innerText = formatter.format(totalCashInvested);
document.getElementById('resMortgage').innerText = formatter.format(monthlyMortgage);
document.getElementById('resTotalMonthlyExp').innerText = formatter.format(totalMonthlyOutflow);
document.getElementById('resMonthlyCashFlow').innerText = formatter.format(monthlyCashFlow);
document.getElementById('resAnnualCashFlow').innerText = formatter.format(annualCashFlow);
var cocElement = document.getElementById('resCoC');
cocElement.innerText = cocReturn.toFixed(2) + "%";
// Color coding for negative flow
if (cocReturn < 0) {
cocElement.style.color = "#e74c3c";
} else {
cocElement.style.color = "#27ae60";
}
// Show results div
document.getElementById('results').style.display = 'block';
}