Please check all inputs and ensure they are valid numbers.
Total Cash Invested:$0.00
Monthly Mortgage Payment:$0.00
Monthly Cash Flow:$0.00
Annual Cash Flow:$0.00
Cash on Cash Return:0.00%
What is Cash on Cash Return?
Cash on Cash Return (CoC) is a rate of return ratio used in real estate transactions that calculates the cash income earned on the cash invested in a property. Unlike standard Return on Investment (ROI) calculations, CoC measures the annual return the investor made on the property in relation to the amount of mortgage paid during the same year. It is widely considered one of the most important metrics for rental property investing because it provides a clear picture of the investment's performance based on the actual cash deployed.
How the Calculation Works
The formula for Cash on Cash Return is relatively straightforward:
Cash on Cash Return = (Annual Pre-Tax Cash Flow / Total Cash Invested) x 100%
Annual Pre-Tax Cash Flow: This is calculated by taking your total annual rental income and subtracting 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 rehab or repair costs required to get the property rentable.
What is a Good Cash on Cash Return?
There is no "one size fits all" answer, as acceptable returns vary by market and investor goals. However, general benchmarks include:
8-12%: Generally considered a solid return for most residential rental properties in stable markets.
15%+: Considered an excellent return, often found in higher-risk neighborhoods or through deals requiring significant "sweat equity" (rehab work).
Below 5%: Often considered poor for pure cash flow investing, though investors relying on rapid appreciation might accept lower immediate cash returns.
Why Use This Metric?
Using a Cash on Cash Return calculator allows investors to compare different investment opportunities side-by-side. For example, you might choose between putting $50,000 down on a single-family home or using that same $50,000 to buy two cheaper condos. By calculating the CoC for both scenarios, you can determine which option works harder for your specific dollar.
function calculateCoC() {
// Retrieve inputs
var purchasePrice = parseFloat(document.getElementById("purchasePrice").value);
var downPaymentPercent = parseFloat(document.getElementById("downPayment").value);
var closingCosts = parseFloat(document.getElementById("closingCosts").value);
var rehabCosts = parseFloat(document.getElementById("rehabCosts").value);
var interestRate = parseFloat(document.getElementById("interestRate").value);
var loanTerm = parseFloat(document.getElementById("loanTerm").value);
var monthlyRent = parseFloat(document.getElementById("monthlyRent").value);
var monthlyExpenses = parseFloat(document.getElementById("monthlyExpenses").value);
// Validation
if (isNaN(purchasePrice) || isNaN(downPaymentPercent) || isNaN(closingCosts) ||
isNaN(rehabCosts) || isNaN(interestRate) || isNaN(loanTerm) ||
isNaN(monthlyRent) || isNaN(monthlyExpenses)) {
document.getElementById("errorMsg").style.display = "block";
document.getElementById("resultsArea").style.display = "none";
return;
}
document.getElementById("errorMsg").style.display = "none";
// 1. Calculate Loan Details
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
// 2. Calculate Total Cash Invested
// Total Invested = Down Payment + Closing Costs + Rehab Costs
var totalInvested = downPaymentAmount + closingCosts + rehabCosts;
// 3. Calculate Monthly Mortgage Payment
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
// i = monthly interest rate, n = number of payments
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var monthlyMortgage = 0;
if (monthlyRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
// If interest rate is 0
if (loanTerm > 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
monthlyMortgage = 0; // Should not happen with valid input
}
}
// 4. Calculate Cash Flow
var totalMonthlyOutflow = monthlyMortgage + monthlyExpenses;
var monthlyCashFlow = monthlyRent – totalMonthlyOutflow;
var annualCashFlow = monthlyCashFlow * 12;
// 5. Calculate Cash on Cash Return
var cocReturn = 0;
if (totalInvested > 0) {
cocReturn = (annualCashFlow / totalInvested) * 100;
}
// Display Results
document.getElementById("resTotalInvested").innerHTML = "$" + totalInvested.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById("resMortgage").innerHTML = "$" + monthlyMortgage.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Handle negative numbers formatting
var monthlyFlowStr = monthlyCashFlow.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
if (monthlyCashFlow < 0) {
document.getElementById("resMonthlyCashFlow").innerHTML = "-$" + Math.abs(monthlyCashFlow).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById("resMonthlyCashFlow").style.color = "#c0392b";
} else {
document.getElementById("resMonthlyCashFlow").innerHTML = "$" + monthlyFlowStr;
document.getElementById("resMonthlyCashFlow").style.color = "#2c3e50";
}
var annualFlowStr = annualCashFlow.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
if (annualCashFlow < 0) {
document.getElementById("resAnnualCashFlow").innerHTML = "-$" + Math.abs(annualCashFlow).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
} else {
document.getElementById("resAnnualCashFlow").innerHTML = "$" + annualFlowStr;
}
var cocStr = cocReturn.toFixed(2) + "%";
document.getElementById("resCoC").innerHTML = cocStr;
if (cocReturn < 0) {
document.getElementById("resCoC").style.color = "#c0392b";
} else {
document.getElementById("resCoC").style.color = "#27ae60";
}
document.getElementById("resultsArea").style.display = "block";
}