Calculating the potential return on investment (ROI) is the most critical step in real estate investing. Unlike purchasing a primary residence, buying a rental property is a business decision that relies heavily on the numbers. This calculator helps you determine the Cash on Cash Return (CoC), which is arguably the most important metric for cash-flow investors.
What is Cash on Cash Return?
Cash on Cash Return measures the annual pre-tax cash flow relative to the total amount of cash invested. It tells you exactly how hard your money is working for you. The formula is:
For example, if you invest $50,000 cash to buy a property (down payment + closing costs) and it generates $5,000 in positive cash flow per year after all expenses and mortgage payments, your Cash on Cash Return is 10%.
Key Metrics Explained
Net Operating Income (NOI): This is your total income (rent – vacancy) minus operating expenses (taxes, insurance, maintenance, management). Note that NOI does not include mortgage payments.
Cash Flow: This is your NOI minus your debt service (mortgage payments). This is the actual profit you pocket every month.
Total Cash Invested: This includes your down payment, closing costs, and any immediate renovation costs required to get the property rented.
What is a Good Cash on Cash Return?
While "good" is subjective, many real estate investors aim for a Cash on Cash Return between 8% and 12%. Returns above 15% are considered excellent but are often found in riskier neighborhoods or require significant renovation work (BRRRR strategy). In contrast, the stock market historically returns about 7-10% annually, so real estate should ideally aim to beat that or provide other benefits like appreciation and tax depreciation.
function calculateROI() {
// Get Inputs
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPaymentPercent = parseFloat(document.getElementById('downPaymentPercent').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var rehabCosts = parseFloat(document.getElementById('rehabCosts').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTerm = parseFloat(document.getElementById('loanTerm').value) || 30;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var propertyTax = parseFloat(document.getElementById('propertyTax').value) || 0;
var insurance = parseFloat(document.getElementById('insurance').value) || 0;
var maintenancePercent = parseFloat(document.getElementById('maintenance').value) || 0;
var managementFeePercent = parseFloat(document.getElementById('managementFee').value) || 0;
var hoaFees = parseFloat(document.getElementById('hoaFees').value) || 0;
// 1. Calculate Initial Cash Invested
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var totalInvested = downPaymentAmount + closingCosts + rehabCosts;
// 2. Calculate Mortgage Payment
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var monthlyMortgage = 0;
if (interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// 3. Calculate Income
var annualGrossRent = monthlyRent * 12;
var vacancyLoss = annualGrossRent * (vacancyRate / 100);
var effectiveGrossIncome = annualGrossRent – vacancyLoss;
// 4. Calculate Operating Expenses
var annualMaintenance = annualGrossRent * (maintenancePercent / 100);
var annualManagement = effectiveGrossIncome * (managementFeePercent / 100); // Usually charged on collected rent
var totalOperatingExpenses = propertyTax + insurance + annualMaintenance + annualManagement + hoaFees;
// 5. Calculate Metrics
var noi = effectiveGrossIncome – totalOperatingExpenses;
var annualDebtService = monthlyMortgage * 12;
var annualCashFlow = noi – annualDebtService;
var monthlyCashFlow = annualCashFlow / 12;
var cocReturn = 0;
if (totalInvested > 0) {
cocReturn = (annualCashFlow / totalInvested) * 100;
}
// Display Results
document.getElementById('res-totalInvested').innerText = formatCurrency(totalInvested);
document.getElementById('res-mortgage').innerText = formatCurrency(monthlyMortgage);
document.getElementById('res-cashFlow').innerText = formatCurrency(monthlyCashFlow);
document.getElementById('res-noi').innerText = formatCurrency(noi);
document.getElementById('res-coc').innerText = cocReturn.toFixed(2) + '%';
// Color coding for Cash Flow
var cfElement = document.getElementById('res-cashFlow');
if (monthlyCashFlow >= 0) {
cfElement.style.color = '#27ae60'; // Green
} else {
cfElement.style.color = '#c0392b'; // Red
}
// Show results area
document.getElementById('results-area').style.display = 'block';
}
function formatCurrency(num) {
return '$' + num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
}