Analyze cash flow, cap rate, and cash-on-cash return for your investment property.
Purchase & Financing
Income & Expenses
Monthly Principal & Interest:$0.00
Total Monthly Expenses:$0.00
Monthly Cash Flow:$0.00
Net Operating Income (Annual):$0.00
Cap Rate:0.00%
Cash on Cash Return:0.00%
Understanding Rental Property ROI Analysis
Investing in real estate is a numbers game. Unlike buying a personal home where emotion plays a large role, a rental property is a business. To ensure profitability, investors must look beyond the purchase price and analyze the Key Performance Indicators (KPIs) of the asset. This Rental Property ROI Calculator helps you evaluate the three most critical metrics: Cash Flow, Cap Rate, and Cash on Cash Return.
1. Monthly Cash Flow
Cash flow is the profit you take home each month after all operating expenses and debt service (mortgage payments) have been paid. It is calculated as:
Positive cash flow is essential for long-term sustainability. It provides a buffer against vacancies and repairs. A common rule of thumb for beginners is to aim for at least $100-$200 per door in net positive cash flow per month.
2. Capitalization Rate (Cap Rate)
The Cap Rate measures the natural rate of return on the property assuming you bought it in all cash. It allows you to compare the profitability of one property against another, regardless of how they are financed.
Formula: (Net Operating Income / Purchase Price) x 100
Net Operating Income (NOI) is your total revenue minus operating expenses (taxes, insurance, maintenance) but excluding mortgage payments. A "good" cap rate varies by market, but generally, 4% to 5% is common in high-appreciation areas, while 8% to 10% is targeted in high-cash-flow (but lower appreciation) markets.
3. Cash on Cash Return (CoC)
This is arguably the most important metric for investors using leverage (loans). It measures the annual return on the actual cash you invested (down payment + closing costs).
Formula: (Annual Pre-Tax Cash Flow / Total Cash Invested) x 100
For example, if you invest $50,000 as a down payment and the property generates $5,000 in positive cash flow per year, your Cash on Cash return is 10%. This metric allows you to compare real estate returns directly against other investments like stocks or bonds.
How to Use This Calculator
Input your purchase price and financing details to determine your monthly mortgage obligation. Be honest with your expense estimates—don't forget to account for "hidden" costs like vacancy (periods where the property is empty) and maintenance reserves (saving for a new roof or HVAC). By adjusting the variables, such as the down payment or rent amount, you can see exactly what is required to make a deal profitable.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('roi_price').value);
var downPercent = parseFloat(document.getElementById('roi_down_percent').value);
var interestRate = parseFloat(document.getElementById('roi_rate').value);
var termYears = parseFloat(document.getElementById('roi_term').value);
var monthlyRent = parseFloat(document.getElementById('roi_rent').value);
var annualTaxes = parseFloat(document.getElementById('roi_taxes').value);
var annualInsurance = parseFloat(document.getElementById('roi_insurance').value);
var otherMonthly = parseFloat(document.getElementById('roi_other_monthly').value);
// Validation: Ensure essential numbers are present
if (isNaN(price) || isNaN(downPercent) || isNaN(interestRate) || isNaN(termYears) || isNaN(monthlyRent)) {
alert("Please enter valid numbers for Price, Down Payment, Rate, Term, and Rent.");
return;
}
// Handle optional fields if empty
if (isNaN(annualTaxes)) annualTaxes = 0;
if (isNaN(annualInsurance)) annualInsurance = 0;
if (isNaN(otherMonthly)) otherMonthly = 0;
// 2. Perform Calculations
// Loan Calculation
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = termYears * 12;
// Mortgage Payment (Principal & Interest)
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyMortgage = 0;
if (interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// Expenses
var monthlyTaxes = annualTaxes / 12;
var monthlyInsurance = annualInsurance / 12;
var totalMonthlyOperatingExpenses = monthlyTaxes + monthlyInsurance + otherMonthly;
var totalMonthlyExpensesWithDebt = totalMonthlyOperatingExpenses + monthlyMortgage;
// Net Operating Income (NOI) = Income – Operating Expenses (Excluding Mortgage)
var monthlyNOI = monthlyRent – totalMonthlyOperatingExpenses;
var annualNOI = monthlyNOI * 12;
// Cash Flow
var monthlyCashFlow = monthlyRent – totalMonthlyExpensesWithDebt;
var annualCashFlow = monthlyCashFlow * 12;
// Returns
// Cap Rate = (Annual NOI / Price) * 100
var capRate = (annualNOI / price) * 100;
// Cash on Cash Return = (Annual Cash Flow / Cash Invested) * 100
// NOTE: For simplicity, Cash Invested here is just the Down Payment.
// In a real scenario, you would add closing costs and rehab costs.
var cashInvested = downPaymentAmount;
var cocReturn = 0;
if (cashInvested > 0) {
cocReturn = (annualCashFlow / cashInvested) * 100;
}
// 3. Update DOM with Results
document.getElementById('res_mortgage').innerText = '$' + monthlyMortgage.toFixed(2);
document.getElementById('res_total_exp').innerText = '$' + totalMonthlyExpensesWithDebt.toFixed(2);
var cfElement = document.getElementById('res_cashflow');
cfElement.innerText = '$' + monthlyCashFlow.toFixed(2);
cfElement.style.color = monthlyCashFlow >= 0 ? '#27ae60' : '#c0392b'; // Green if positive, Red if negative
document.getElementById('res_noi').innerText = '$' + annualNOI.toFixed(2);
document.getElementById('res_cap_rate').innerText = capRate.toFixed(2) + '%';
var cocElement = document.getElementById('res_coc');
cocElement.innerText = cocReturn.toFixed(2) + '%';
cocElement.style.color = cocReturn >= 0 ? '#27ae60' : '#c0392b';
// Show results container
document.getElementById('roi_results').style.display = 'block';
}