Analyze cash flow, Cap Rate, and Cash-on-Cash Return for your real estate investments.
(Taxes, Insurance, HOA, Maintenance)
Please enter valid positive numbers for all fields.
Monthly Cash Flow
$0.00
Cash on Cash ROI
0.00%
Cap Rate
0.00%
NOI (Annual)
$0.00
Financial Breakdown
Initial Cash Invested (Down + Closing)
$0.00
Monthly Mortgage Payment (P&I)
$0.00
Monthly Vacancy Reserve
$0.00
Total Monthly Expenses (All costs)
$0.00
Annual Gross Income
$0.00
Understanding Rental Property ROI
Investing in real estate is one of the most reliable ways to build wealth, but simply buying a property and renting it out doesn't guarantee a profit. To succeed, investors must rigorously analyze the numbers before signing on the dotted line. This Rental Property ROI Calculator helps you evaluate the profitability of a potential investment property by calculating key metrics like Cash Flow, Cash-on-Cash Return, and Cap Rate.
Key Metrics Explained
1. Cash Flow
Cash flow is the profit you bring in each month after all expenses are paid. It is calculated by subtracting your total monthly expenses (mortgage, taxes, insurance, vacancy reserves, maintenance) from your monthly rental income. Positive cash flow is essential for a sustainable long-term investment.
Formula: Monthly Rent – Total Monthly Expenses = Cash Flow
2. Cash-on-Cash Return (CoC ROI)
This is arguably the most important metric for rental investors. It measures the annual return you earn on the actual cash you invested (down payment + closing costs), rather than the total price of the property. It allows you to compare real estate returns against other investment vehicles like stocks or bonds.
Formula: (Annual Cash Flow / Total Cash Invested) × 100
3. Capitalization Rate (Cap Rate)
The Cap Rate measures the property's natural rate of return assuming you bought it with all cash (no mortgage). It helps compare the profitability of similar properties in the same area without the influence of financing terms. A higher Cap Rate generally indicates a better return, though often associated with higher risk areas.
Formula: (Net Operating Income / Purchase Price) × 100
How to Use This Calculator
Purchase Price: The contract price of the home.
Down Payment: The percentage of the price you pay upfront. 20-25% is standard for investment loans.
Expenses: Be realistic. Include property taxes, insurance, HOA fees, and estimates for repairs.
Vacancy Rate: Properties aren't rented 365 days a year. A 5-8% vacancy rate is a safe conservative estimate for most markets.
What is a Good ROI?
While targets vary by investor and strategy, many real estate investors aim for a Cash-on-Cash return of 8-12%. For cash flow, a common rule of thumb is to aim for at least $100-$200 per door per month in pure profit. However, in high-appreciation markets, investors might accept lower immediate cash flow in exchange for long-term equity growth.
function calculateROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var termYears = parseFloat(document.getElementById('loanTerm').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var otherExp = parseFloat(document.getElementById('monthlyExpenses').value);
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value);
// 2. Validation
if (isNaN(price) || isNaN(downPercent) || isNaN(interestRate) || isNaN(termYears) ||
isNaN(rent) || isNaN(otherExp) || isNaN(closingCosts) || isNaN(vacancyRate)) {
document.getElementById('errorMsg').style.display = 'block';
document.getElementById('resultsSection').style.display = 'none';
return;
}
document.getElementById('errorMsg').style.display = 'none';
// 3. Loan Calculations
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var totalPayments = termYears * 12;
// Mortgage P&I Formula
var monthlyMortgage = 0;
if (interestRate === 0) {
monthlyMortgage = loanAmount / totalPayments;
} else {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
}
// 4. Expense Calculations
var monthlyVacancyCost = rent * (vacancyRate / 100);
var totalMonthlyExpenses = monthlyMortgage + otherExp + monthlyVacancyCost;
var annualOperatingExpenses = (otherExp + monthlyVacancyCost) * 12; // Excludes mortgage for NOI
// 5. Profitability Calculations
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var totalInvested = downPaymentAmount + closingCosts;
// NOI (Net Operating Income) = Income – Operating Expenses (No Mortgage)
var annualNOI = (rent * 12) – annualOperatingExpenses;
// Metrics
var cashOnCash = 0;
if (totalInvested > 0) {
cashOnCash = (annualCashFlow / totalInvested) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// 6. Formatting Helper
function formatMoney(num) {
return '$' + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}
// 7. Update DOM
document.getElementById('monthlyCashFlow').innerHTML = formatMoney(monthlyCashFlow);
document.getElementById('monthlyCashFlow').style.color = monthlyCashFlow >= 0 ? '#27ae60' : '#c0392b';
document.getElementById('cashOnCash').innerHTML = cashOnCash.toFixed(2) + '%';
document.getElementById('cashOnCash').style.color = cashOnCash >= 0 ? '#2c3e50' : '#c0392b';
document.getElementById('capRate').innerHTML = capRate.toFixed(2) + '%';
document.getElementById('annualNOI').innerHTML = formatMoney(annualNOI);
document.getElementById('totalInvested').innerHTML = formatMoney(totalInvested);
document.getElementById('monthlyMortgage').innerHTML = formatMoney(monthlyMortgage);
document.getElementById('monthlyVacancy').innerHTML = formatMoney(monthlyVacancyCost);
document.getElementById('totalMonthlyExp').innerHTML = formatMoney(totalMonthlyExpenses);
document.getElementById('annualGross').innerHTML = formatMoney(rent * 12);
// Show Results
document.getElementById('resultsSection').style.display = 'block';
}