Real estate investing relies heavily on mathematics. Unlike buying a home to live in, buying a rental property is a business decision that requires a clear understanding of profitability. This Cash on Cash Return Calculator helps investors analyze the performance of potential rental properties by comparing the annual cash flow to the total cash invested.
What is Cash on Cash Return?
Cash on Cash (CoC) return is a metric used in real estate transactions that calculates the cash income earned on the cash invested in a property. It is expressed as a percentage.
Unlike Return on Investment (ROI), which might consider total equity or debt paydown, Cash on Cash return focuses strictly on the liquid cash flow relative to the actual cash put into the deal. This makes it an essential metric for investors who finance their purchases, as it measures the efficiency of their down payment and closing costs.
The Formula
The calculation is relatively straightforward:
Cash on Cash Return = (Annual Pre-Tax Cash Flow / Total Cash Invested) × 100%
How to Use This Calculator
To get an accurate result, you need to input specific financial details about the property:
Purchase Price: The agreed-upon selling price of the property.
Down Payment: The cash amount you are paying upfront (excluding the loan).
Closing/Rehab Costs: Any additional cash needed to close the deal or perform immediate repairs to make the unit rentable.
Loan Details: Your interest rate and loan term (usually 30 years) determine your monthly mortgage payment (Principal & Interest).
Income & Expenses: Be realistic here. Include Property Taxes, Insurance, HOA fees, and a percentage buffer for Maintenance and Vacancy (typically 5-10% each).
What is a Good Cash on Cash Return?
There is no single answer, as "good" depends on the investor's goals and the current economic climate. However, general benchmarks include:
8% – 12%: Often considered a solid return for most buy-and-hold investors.
15%+: Considered an excellent return, often found in lower-cost markets or properties requiring significant rehabilitation (BRRRR strategy).
Below 5%: Might be acceptable in high-appreciation markets where cash flow is secondary to property value growth.
Why Monthly Expenses Matter
Many new investors make the mistake of only calculating the mortgage payment against the rent. This calculator accounts for the "hidden" costs of ownership. For example, if you rent a house for $2,000 and your mortgage is $1,200, you don't actually make $800 profit. After taxes, insurance, and setting aside money for a broken water heater or a month of vacancy, your actual cash flow might be closer to $300.
Use the Maintenance/Vacancy Reserve input to account for these future costs. A safe rule of thumb is setting aside 10-15% of the gross rent for these categories.
function calculateRentalROI() {
// 1. Get Inputs using var
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value);
var downPayment = parseFloat(document.getElementById('downPayment').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var loanTerm = parseFloat(document.getElementById('loanTerm').value);
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value);
var annualTax = parseFloat(document.getElementById('annualTax').value);
var annualInsurance = parseFloat(document.getElementById('annualInsurance').value);
var monthlyHOA = parseFloat(document.getElementById('monthlyHOA').value);
var maintenanceRate = parseFloat(document.getElementById('maintenanceRate').value);
// 2. Validation
var errorDiv = document.getElementById('error-message');
var resultsDiv = document.getElementById('results-area');
if (isNaN(purchasePrice) || isNaN(downPayment) || isNaN(interestRate) || isNaN(monthlyRent)) {
errorDiv.style.display = 'block';
resultsDiv.style.display = 'none';
return;
}
// Default optional fields to 0 if empty/NaN
if (isNaN(closingCosts)) closingCosts = 0;
if (isNaN(monthlyHOA)) monthlyHOA = 0;
if (isNaN(annualTax)) annualTax = 0;
if (isNaN(annualInsurance)) annualInsurance = 0;
if (isNaN(maintenanceRate)) maintenanceRate = 0;
if (isNaN(loanTerm)) loanTerm = 30;
errorDiv.style.display = 'none';
// 3. Calculation Logic
// A. Total Cash Invested
var totalInvested = downPayment + closingCosts;
// B. Mortgage Calculation (Principal & Interest)
var loanAmount = purchasePrice – downPayment;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var monthlyMortgage = 0;
if (loanAmount > 0 && interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (loanAmount > 0 && interestRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
}
// C. Expenses
var monthlyTax = annualTax / 12;
var monthlyIns = annualInsurance / 12;
var monthlyMaintenance = monthlyRent * (maintenanceRate / 100);
var totalMonthlyExpenses = monthlyMortgage + monthlyTax + monthlyIns + monthlyHOA + monthlyMaintenance;
// D. Cash Flow
var monthlyCashFlow = monthlyRent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// E. Cash on Cash Return
var cocReturn = 0;
if (totalInvested > 0) {
cocReturn = (annualCashFlow / totalInvested) * 100;
}
// 4. Update UI
// Helper for currency formatting
var fmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('res-investment').innerText = fmt.format(totalInvested);
document.getElementById('res-mortgage').innerText = fmt.format(monthlyMortgage);
document.getElementById('res-expenses').innerText = fmt.format(totalMonthlyExpenses);
document.getElementById('res-monthly-cf').innerText = fmt.format(monthlyCashFlow);
document.getElementById('res-annual-cf').innerText = fmt.format(annualCashFlow);
// Color code the result
var cocElement = document.getElementById('res-coc');
cocElement.innerText = cocReturn.toFixed(2) + "%";
if (cocReturn >= 8) {
cocElement.style.color = '#27ae60'; // Green for good
} else if (cocReturn > 0) {
cocElement.style.color = '#f39c12'; // Orange for okay
} else {
cocElement.style.color = '#c0392b'; // Red for loss
}
resultsDiv.style.display = 'block';
}