How to Calculate Rental Property Return on Investment (ROI)
Investing in real estate is one of the most reliable ways to build wealth, but knowing your numbers is critical before signing any contract. The Cash on Cash ROI (Return on Investment) is the gold standard metric for rental property investors. It measures the annual return you make on the actual cash you have invested, rather than the total loan amount.
Understanding the Formula
This calculator determines the profitability of a potential rental property using the following steps:
Total Cash Invested: This is the sum of your down payment and closing costs. This represents the actual money leaving your pocket.
Net Operating Income (NOI): This is your annual rental income minus all operating expenses (taxes, insurance, maintenance, HOA fees), excluding the mortgage.
Cash Flow: We subtract the annual mortgage payments (principal and interest) from the NOI to find your actual profit.
Cash on Cash ROI: Finally, we divide the Annual Cash Flow by the Total Cash Invested to get a percentage yield.
Why Cash on Cash ROI Matters
Unlike a simple "Cap Rate," which looks at the property's value as if you bought it with all cash, the Cash on Cash ROI accounts for leverage (your mortgage). Since most investors use loans to buy property, this metric gives a realistic view of how hard your specific dollars are working for you compared to other investments like the stock market.
What is a Good ROI?
While target returns vary by market and strategy, many investors aim for a Cash on Cash ROI between 8% and 12%. Returns above 15% are generally considered excellent, though they may come with higher risks or require more active management. Use this calculator to stress-test your deals by adjusting the rental income or interest rate inputs.
function calculateROI() {
// 1. Get input values
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value);
var downPaymentPercent = parseFloat(document.getElementById('downPayment').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var loanTerm = parseFloat(document.getElementById('loanTerm').value);
var rentalIncome = parseFloat(document.getElementById('rentalIncome').value);
var monthlyExpenses = parseFloat(document.getElementById('expenses').value);
// 2. Validate inputs
if (isNaN(purchasePrice) || isNaN(downPaymentPercent) || isNaN(closingCosts) ||
isNaN(interestRate) || isNaN(loanTerm) || isNaN(rentalIncome) || isNaN(monthlyExpenses)) {
document.getElementById('errorMsg').style.display = 'block';
document.getElementById('results').style.display = 'none';
return;
}
// Reset error
document.getElementById('errorMsg').style.display = 'none';
// 3. Perform Calculations
// Loan Calculation
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var totalInitialInvestment = downPaymentAmount + closingCosts;
// Monthly Mortgage Payment Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTerm * 12;
var mortgagePayment = 0;
if (monthlyRate > 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
mortgagePayment = loanAmount / numberOfPayments;
}
// Cash Flow Calculations
var totalMonthlyOutflow = mortgagePayment + monthlyExpenses;
var monthlyCashFlow = rentalIncome – totalMonthlyOutflow;
var annualCashFlow = monthlyCashFlow * 12;
// ROI Calculation
var roi = 0;
if (totalInitialInvestment > 0) {
roi = (annualCashFlow / totalInitialInvestment) * 100;
}
// 4. Format and Display Results
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
document.getElementById('resInvestment').innerHTML = formatter.format(totalInitialInvestment);
document.getElementById('resMortgage').innerHTML = formatter.format(mortgagePayment);
document.getElementById('resTotalExpenses').innerHTML = formatter.format(totalMonthlyOutflow);
// Style Cash Flow based on positive/negative
var mCashEl = document.getElementById('resMonthlyCash');
mCashEl.innerHTML = formatter.format(monthlyCashFlow);
mCashEl.style.color = monthlyCashFlow >= 0 ? '#27ae60' : '#c0392b';
var aCashEl = document.getElementById('resAnnualCash');
aCashEl.innerHTML = formatter.format(annualCashFlow);
aCashEl.style.color = annualCashFlow >= 0 ? '#27ae60' : '#c0392b';
var roiEl = document.getElementById('resROI');
roiEl.innerHTML = roi.toFixed(2) + "%";
roiEl.style.color = roi >= 0 ? '#27ae60' : '#c0392b';
document.getElementById('results').style.display = 'block';
}