Real Estate ROI Calculator: Cash on Cash & Cap Rate
Investing in real estate is one of the most reliable ways to build wealth, but simply buying a property doesn't guarantee a profit. To succeed, investors must rigorously analyze the numbers before signing a contract. Our Investment Property ROI Calculator helps you evaluate the potential profitability of a rental property by calculating key metrics like Cash on Cash Return, Cap Rate, and Monthly Cash Flow.
How to Calculate Real Estate Investment Returns
This calculator focuses on the two most critical metrics for rental property investors:
1. Cash on Cash Return (CoC)
Cash on Cash Return measures the annual return on the actual cash you invested in the deal. It is arguably the most important metric for investors using financing (mortgages).
Formula:(Annual Pre-Tax Cash Flow / Total Cash Invested) × 100
The "Total Cash Invested" includes your down payment, closing costs, and any immediate renovation or repair costs required to get the property rented.
2. Capitalization Rate (Cap Rate)
The Cap Rate indicates the rate of return on a real estate investment property based on the income that the property is expected to generate. It ignores the mortgage financing method and looks purely at the asset's performance.
Formula:(Net Operating Income / Property Asset Value) × 100
Net Operating Income (NOI) is your annual revenue minus necessary operating expenses (management, taxes, insurance, repairs), excluding mortgage payments.
Understanding Your Results
When you input your data into the calculator above, here is what the outputs mean for your investment strategy:
Monthly Cash Flow: This is your "take-home" profit each month after the mortgage and all expenses are paid. A positive cash flow is essential for long-term sustainability.
Total Cash Needed: This represents the liquidity you need upfront. It sums up your down payment, closing costs, and rehab budget.
Good vs. Bad ROI: While targets vary by market and strategy, many investors aim for a Cash on Cash return of 8-12% or higher. A Cap Rate of 5-10% is generally considered healthy, depending on the risk level of the neighborhood.
Example Calculation
Let's say you are looking at a single-family home with the following numbers:
Using the calculator, you would find that your total cash invested is roughly $55,000 (including closing costs). If your monthly mortgage payment is roughly $1,000, your monthly cash flow is $200 ($2,000 rent – $800 exp – $1,000 mtg). This results in an annual cash flow of $2,400. Your Cash on Cash return would be roughly 4.3%.
function calculateRealEstateROI() {
// 1. Get Elements by ID
var priceInput = document.getElementById("purchasePrice");
var closingInput = document.getElementById("closingCosts");
var rehabInput = document.getElementById("rehabCosts");
var downInput = document.getElementById("downPayment");
var rateInput = document.getElementById("interestRate");
var termInput = document.getElementById("loanTerm");
var rentInput = document.getElementById("monthlyRent");
var expenseInput = document.getElementById("monthlyExpenses");
var errorDiv = document.getElementById("errorMsg");
var resultsDiv = document.getElementById("roiResults");
// 2. Parse Values
var price = parseFloat(priceInput.value);
var closing = parseFloat(closingInput.value);
var rehab = parseFloat(rehabInput.value);
var downPayment = parseFloat(downInput.value);
var rate = parseFloat(rateInput.value);
var term = parseFloat(termInput.value);
var rent = parseFloat(rentInput.value);
var expenses = parseFloat(expenseInput.value);
// 3. Validation
if (isNaN(price) || isNaN(closing) || isNaN(rehab) || isNaN(downPayment) ||
isNaN(rate) || isNaN(term) || isNaN(rent) || isNaN(expenses)) {
errorDiv.style.display = "block";
resultsDiv.style.display = "none";
return;
}
errorDiv.style.display = "none";
// 4. Calculations
// Total Cash Invested (Basis for CoC)
var totalCashInvested = downPayment + closing + rehab;
// Loan Amount
var loanAmount = price – downPayment;
// Mortgage Payment (Monthly)
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyRate = (rate / 100) / 12;
var numberOfPayments = term * 12;
var monthlyMortgage = 0;
if (loanAmount > 0 && monthlyRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (loanAmount > 0 && monthlyRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
}
// Net Operating Income (Annual) = (Monthly Rent – Monthly Expenses) * 12
var monthlyNOI = rent – expenses;
var annualNOI = monthlyNOI * 12;
// Cash Flow
var monthlyCashFlow = monthlyNOI – monthlyMortgage;
var annualCashFlow = monthlyCashFlow * 12;
// Cap Rate = (Annual NOI / (Purchase Price + Rehab Costs)) * 100
// Note: Some use just purchase price, but Cost Basis (Price + Rehab) is safer for investors.
var costBasis = price + rehab;
var capRate = 0;
if (costBasis > 0) {
capRate = (annualNOI / costBasis) * 100;
}
// Cash on Cash Return = (Annual Cash Flow / Total Cash Invested) * 100
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// 5. Update UI
document.getElementById("resultTotalInvestment").innerText = "$" + totalCashInvested.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById("resultMortgage").innerText = "$" + monthlyMortgage.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
var cfElement = document.getElementById("resultMonthlyCashFlow");
cfElement.innerText = "$" + monthlyCashFlow.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Color code cash flow
if (monthlyCashFlow >= 0) {
cfElement.style.color = "#27ae60"; // Green
} else {
cfElement.style.color = "#c0392b"; // Red
}
document.getElementById("resultNOI").innerText = "$" + annualNOI.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById("resultCapRate").innerText = capRate.toFixed(2) + "%";
var cocElement = document.getElementById("resultCoC");
cocElement.innerText = cocReturn.toFixed(2) + "%";
// Color code CoC
if (cocReturn >= 0) {
cocElement.style.color = "#27ae60";
} else {
cocElement.style.color = "#c0392b";
}
resultsDiv.style.display = "block";
}