Understanding Real Estate ROI and Cash-on-Cash Return
Calculating the Return on Investment (ROI) is the most critical step for any real estate investor. It allows you to compare different properties and decide where your capital will work the hardest. While there are many ways to measure success, the two most common metrics are Cash-on-Cash Return and Cap Rate.
What is Cash-on-Cash Return?
Cash-on-Cash Return measures the annual cash flow relative to the amount of actual cash you invested. This is often more useful for residential investors than standard ROI because it accounts for financing (mortgages). It answers the question: "Of the money I physically took out of my bank account, what percentage am I getting back each year?"
The Formula
Cash-on-Cash Return = (Annual Pre-Tax Cash Flow / Total Cash Invested) x 100
Key Factors That Influence Your Return
Operating Expenses: These include property taxes, insurance, repairs, and property management fees. Investors often use the "50% Rule," which suggests that 50% of a property's income will go toward expenses (excluding the mortgage).
Vacancy Rate: No property stays occupied 100% of the time. Smart investors factor in a 5-8% vacancy loss.
Leverage: Using a mortgage increases your potential return on the cash you personally invested, but it also increases your risk.
Cap Rate: This is the Net Operating Income divided by the Purchase Price. It represents the property's natural rate of return without considering debt.
Example Scenario
Imagine you buy a property for $250,000. You put $50,000 down and spend $15,000 on closing costs and initial repairs. Your total cash out of pocket is $65,000.
If your monthly rent is $2,200 and your total expenses (including mortgage) are $1,500, your monthly cash flow is $700. Your annual cash flow is $8,400. Your Cash-on-Cash return would be 12.9% ($8,400 / $65,000).
function calculateRentalROI() {
// Get Inputs
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPayment = parseFloat(document.getElementById('downPayment').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var repairCosts = parseFloat(document.getElementById('repairCosts').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var mortgagePayment = parseFloat(document.getElementById('mortgagePayment').value) || 0;
var monthlyExpenses = parseFloat(document.getElementById('monthlyExpenses').value) || 0;
// Calculations
var totalCashInvested = downPayment + closingCosts + repairCosts;
var monthlyCashFlow = monthlyRent – (mortgagePayment + monthlyExpenses);
var annualCashFlow = monthlyCashFlow * 12;
// Cash on Cash Return
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// Cap Rate Calculation (Unleveraged)
// NOI = Annual Rent – Annual Expenses (excluding mortgage)
var annualRent = monthlyRent * 12;
var annualOperatingExpenses = monthlyExpenses * 12;
var netOperatingIncome = annualRent – annualOperatingExpenses;
var capRate = 0;
if (purchasePrice > 0) {
capRate = (netOperatingIncome / purchasePrice) * 100;
}
// Display Results
document.getElementById('roi-results').style.display = 'block';
document.getElementById('resTotalInvested').innerText = '$' + totalCashInvested.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0});
document.getElementById('resMonthlyCash').innerText = '$' + monthlyCashFlow.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0});
document.getElementById('resAnnualCash').innerText = '$' + annualCashFlow.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0});
document.getElementById('resCoC').innerText = cocReturn.toFixed(2) + '%';
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + '%';
// Color coding for cash flow
if (monthlyCashFlow < 0) {
document.getElementById('resMonthlyCash').style.color = '#d32f2f';
document.getElementById('resAnnualCash').style.color = '#d32f2f';
} else {
document.getElementById('resMonthlyCash').style.color = '#2e7d32';
document.getElementById('resAnnualCash').style.color = '#2e7d32';
}
}