When investing in rental properties, knowing your Cash on Cash (CoC) Return is arguably more important than the capitalization rate (Cap Rate), especially if you are using leverage (a mortgage). This metric tells you exactly how hard your actual invested dollars are working for you.
What is Cash on Cash Return?
Cash on Cash Return measures the annual pre-tax cash flow generated by the property divided by the total cash invested. Unlike standard ROI, which might look at total equity, CoC focuses purely on the liquidity you put into the deal.
The Formula: CoC Return = (Annual Pre-Tax Cash Flow / Total Cash Invested) × 100%
Input Definitions for accurate calculation:
Purchase Price: The agreed-upon selling price of the real estate asset.
Down Payment: The cash amount paid upfront to secure the mortgage.
Closing Costs & Repairs: Often overlooked, this includes inspection fees, loan origination fees, title insurance, and immediate repairs needed to make the property rent-ready. This is part of your "Total Cash Invested."
Operating Expenses: These are recurring monthly costs such as Property Taxes, Landlord Insurance, HOA fees, Property Management fees, and estimates for Vacancy and Maintenance.
What is a Good Cash on Cash Return?
While "good" is subjective, many real estate investors aim for a CoC return between 8% and 12%. This range typically beats the inflation-adjusted average of the stock market while providing the added benefits of property appreciation, tax depreciation, and principal pay-down.
Why Monthly Cash Flow Matters
Positive monthly cash flow ensures that the property pays for itself. If your Monthly Rental Income exceeds your Mortgage Payment plus Operating Expenses, you have a self-sustaining asset. A negative cash flow implies you are subsidizing the investment from your own pocket every month, which increases risk.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPay = parseFloat(document.getElementById('downPayment').value);
var closing = parseFloat(document.getElementById('closingCosts').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. Validate Inputs
var errorDiv = document.getElementById('errorDisplay');
var resultsDiv = document.getElementById('resultsArea');
if (isNaN(price) || isNaN(downPay) || isNaN(closing) || isNaN(rate) ||
isNaN(years) || isNaN(rent) || isNaN(expenses)) {
errorDiv.style.display = 'block';
resultsDiv.style.display = 'none';
return;
}
// Additional validation to prevent division by zero or negative logic
if (price <= 0 || downPay < 0 || years 0 && rate > 0) {
var mathPower = Math.pow(1 + monthlyRate, numberOfPayments);
mortgagePayment = loanAmount * ((monthlyRate * mathPower) / (mathPower – 1));
} else if (loanAmount > 0 && rate === 0) {
mortgagePayment = loanAmount / numberOfPayments;
} else {
mortgagePayment = 0; // Cash purchase or full down payment
}
// Total Monthly Outflow
var totalMonthlyCost = mortgagePayment + expenses;
// Cash Flow
var monthlyCashFlow = rent – totalMonthlyCost;
var annualCashFlow = monthlyCashFlow * 12;
// Total Cash Invested
var totalInvested = downPay + closing;
// Cash on Cash Return
var cocReturn = 0;
if (totalInvested > 0) {
cocReturn = (annualCashFlow / totalInvested) * 100;
} else {
cocReturn = 0; // Infinite return technically, but show 0 or handle separately
}
// 4. Update UI
resultsDiv.style.display = 'block';
// Helper for formatting currency
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
document.getElementById('resTotalInvested').innerText = formatter.format(totalInvested);
document.getElementById('resMortgage').innerText = formatter.format(mortgagePayment);
// Color coding for cash flow
var cfElement = document.getElementById('resMonthlyCashFlow');
cfElement.innerText = formatter.format(monthlyCashFlow);
cfElement.style.color = monthlyCashFlow >= 0 ? '#28a745' : '#dc3545';
document.getElementById('resAnnualCashFlow').innerText = formatter.format(annualCashFlow);
// CoC Formatting
var cocElement = document.getElementById('resCoC');
cocElement.innerText = cocReturn.toFixed(2) + "%";
cocElement.style.color = cocReturn >= 0 ? '#28a745' : '#dc3545';
}