Real estate investing is a numbers game. Whether you are analyzing a potential turnkey rental, a BRRRR strategy project, or a simple single-family home purchase, understanding your numbers is crucial to avoiding bad investments. This Rental Property ROI Calculator helps investors quickly determine the viability of a property by analyzing Cash Flow, Cap Rate, and Cash on Cash Return.
Understanding the Key Metrics
When evaluating a rental property, there are three primary metrics expert investors look at:
Cash Flow: This is the profit remaining after all expenses (mortgage, taxes, insurance, vacancy, repairs) are paid. Positive cash flow ensures the property pays for itself.
Cash on Cash Return (CoC): This measures the annual return on the actual cash you invested (down payment + closing costs). A CoC return of 8-12% is often considered a solid benchmark for residential real estate.
Cap Rate (Capitalization Rate): This metric calculates the natural rate of return on the property assuming it was bought with cash. It helps compare properties regardless of financing terms.
How to Calculate Cash on Cash Return
The formula for Cash on Cash Return is straightforward but requires accurate data inputs:
Annual Pre-Tax Cash Flow / Total Cash Invested = Cash on Cash Return %
To use this calculator effectively, ensure you estimate expenses conservatively. Always include buffers for vacancy (typically 5-8%) and maintenance (typically 1% of property value annually) to get a realistic picture of your investment performance.
What is a Good ROI for Rental Property?
While every investor has different goals, a "good" ROI depends on your strategy. For passive long-term hold investors, a Cash on Cash return of 6-8% might be acceptable if the property is in a high-appreciation area. For aggressive investors looking for immediate income, returns of 10-15% are often the target. Use this tool to compare multiple properties and find the one that aligns with your financial freedom goals.
function calculateROI() {
// 1. Get Inputs using var
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPmt = parseFloat(document.getElementById('downPayment').value) || 0;
var closing = parseFloat(document.getElementById('closingCosts').value) || 0;
var rate = parseFloat(document.getElementById('interestRate').value) || 0;
var years = parseFloat(document.getElementById('loanTerm').value) || 0;
var rent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var taxes = parseFloat(document.getElementById('annualTaxes').value) || 0;
var insurance = parseFloat(document.getElementById('annualInsurance').value) || 0;
var hoa = parseFloat(document.getElementById('monthlyHOA').value) || 0;
var vacancyPct = parseFloat(document.getElementById('vacancyRate').value) || 0;
// Validation to prevent bad math
if (price <= 0 || years 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numPayments)) / (Math.pow(1 + monthlyRate, numPayments) – 1);
} else {
mortgagePayment = loanAmount / numPayments;
}
// 3. Calculate Monthly Expenses
var monthlyTaxes = taxes / 12;
var monthlyInsurance = insurance / 12;
var vacancyCost = rent * (vacancyPct / 100);
var totalMonthlyExpenses = mortgagePayment + monthlyTaxes + monthlyInsurance + hoa + vacancyCost;
// 4. Calculate Cash Flow
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// 5. Calculate Net Operating Income (NOI)
// NOI = Revenue – Operating Expenses (Excluding Mortgage)
var annualOperatingExpenses = (monthlyTaxes + monthlyInsurance + hoa + vacancyCost) * 12;
var annualRevenue = rent * 12;
var noi = annualRevenue – annualOperatingExpenses;
// 6. Calculate Returns
var totalCashInvested = downPmt + closing;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (noi / price) * 100;
}
// 7. Format and Display Results
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
document.getElementById('resMortgage').innerText = formatter.format(mortgagePayment);
document.getElementById('resTotalExpenses').innerText = formatter.format(totalMonthlyExpenses);
var cashFlowEl = document.getElementById('resMonthlyCashFlow');
cashFlowEl.innerText = formatter.format(monthlyCashFlow);
// Style cash flow based on positivity
if (monthlyCashFlow >= 0) {
cashFlowEl.classList.remove('negative');
cashFlowEl.classList.add('positive');
} else {
cashFlowEl.classList.remove('positive');
cashFlowEl.classList.add('negative');
}
document.getElementById('resNOI').innerText = formatter.format(noi);
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
var cocEl = document.getElementById('resCoC');
cocEl.innerText = cocReturn.toFixed(2) + "%";
if (cocReturn >= 0) {
cocEl.classList.remove('negative');
cocEl.classList.add('positive');
} else {
cocEl.classList.remove('positive');
cocEl.classList.add('negative');
}
// Show results area
document.getElementById('results').style.display = 'block';
}