Investing in real estate is one of the most reliable ways to build wealth, but not every property is a good deal. The Rental Property Cash-on-Cash ROI Calculator helps investors determine the efficiency of their investment capital. Unlike simple cap rate calculations, Cash-on-Cash Return measures the annual pre-tax cash flow relative to the actual cash invested (down payment), providing a more realistic view of your leveraged return.
How the Calculation Works
This calculator breaks down the finances of a rental property into three core components:
Acquisition Costs: The purchase price minus your down payment determines your loan amount.
Operating Expenses: This includes your mortgage principal and interest (calculated automatically based on the rate and term) plus your estimated monthly operating costs like taxes, insurance, HOA fees, and maintenance.
Net Cash Flow: This is your monthly rental income minus all total monthly expenses.
What is a "Good" Cash-on-Cash Return?
While target returns vary by market and strategy, many real estate investors aim for a Cash-on-Cash ROI between 8% and 12%. A return in this range typically outperforms the stock market average while providing the added benefits of property appreciation and tax depreciation.
Definitions
Loan Term: The duration of your mortgage, typically 15 or 30 years. Shorter terms increase monthly payments but reduce total interest paid.
Monthly Expenses: Always include property taxes, landlord insurance, vacancy reserves (usually 5%), and maintenance/CapEx (usually 5-10%) in this figure to get an accurate result.
Cash Flow: The profit remaining after all bills are paid. Positive cash flow is critical for long-term sustainability.
Note: This calculator assumes a fixed-rate mortgage and does not account for closing costs outside of the down payment. Always consult with a financial advisor before making large investment decisions.
function calculateRentalROI() {
// Get input values
var price = parseFloat(document.getElementById('propPrice').value);
var down = parseFloat(document.getElementById('downPayment').value);
var rate = parseFloat(document.getElementById('intRate').value);
var years = parseFloat(document.getElementById('loanTerm').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var expenses = parseFloat(document.getElementById('monthlyExp').value);
var errorDiv = document.getElementById('roiError');
var resultsDiv = document.getElementById('roiResults');
// Validation
if (isNaN(price) || isNaN(down) || isNaN(rate) || isNaN(years) || isNaN(rent) || isNaN(expenses)) {
errorDiv.style.display = 'block';
resultsDiv.style.display = 'none';
return;
}
if (down >= price) {
alert("Down payment usually cannot exceed or equal purchase price for a mortgage calculation.");
return;
}
errorDiv.style.display = 'none';
// Mortgage Calculation (M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1])
var loanAmount = price – down;
var monthlyRate = (rate / 100) / 12;
var totalPayments = years * 12;
var monthlyMortgage = 0;
if (rate === 0) {
monthlyMortgage = loanAmount / totalPayments;
} else {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
}
// Cash Flow Calculations
var totalMonthlyOutflow = monthlyMortgage + expenses;
var netMonthlyCashFlow = rent – totalMonthlyOutflow;
var annualCashFlow = netMonthlyCashFlow * 12;
// ROI Calculation (Cash on Cash)
// Formula: (Annual Cash Flow / Total Cash Invested) * 100
var roi = (annualCashFlow / down) * 100;
// Formatting numbers for display
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
// Update DOM
document.getElementById('resLoanAmount').innerText = formatter.format(loanAmount);
document.getElementById('resMortgage').innerText = formatter.format(monthlyMortgage);
document.getElementById('resOutflow').innerText = formatter.format(totalMonthlyOutflow);
var cashFlowEl = document.getElementById('resCashFlow');
cashFlowEl.innerText = formatter.format(netMonthlyCashFlow);
if (netMonthlyCashFlow >= 0) {
cashFlowEl.style.color = '#27ae60';
} else {
cashFlowEl.style.color = '#e74c3c';
}
var roiEl = document.getElementById('resROI');
roiEl.innerText = roi.toFixed(2) + '%';
if (roi >= 0) {
roiEl.style.color = '#27ae60';
} else {
roiEl.style.color = '#e74c3c';
}
resultsDiv.style.display = 'block';
}