Analyze the profitability of your real estate investment instantly.
Purchase Information
$
$
Loan Details
$
%
Income & Expenses
$
%
$
$
$
$
Investment Analysis
Cash on Cash ROI
0.00%
Cap Rate
0.00%
Monthly Cash Flow
$0.00
Annual Cash Flow
$0.00
Monthly Expenses
$0.00
Monthly Mortgage
$0.00
Understanding Rental Property ROI
Return on Investment (ROI) is the most critical metric for any real estate investor. Unlike buying a home to live in, buying a rental property is a business decision that relies on mathematics, not emotion. This calculator helps you determine if a potential property will generate positive cash flow or become a financial burden.
Key Metrics Explained
1. Cash on Cash ROI
This is arguably the most important number for investors. It calculates the cash income earned on the cash invested in a property. It tells you how hard your money is working for you.
Formula: (Annual Pre-Tax Cash Flow / Total Cash Invested) x 100
A "good" Cash on Cash return varies by market, but many investors target 8-12%.
2. Cap Rate (Capitalization Rate)
Cap Rate measures the property's natural rate of return assuming you bought it with all cash (no loan). It allows you to compare the profitability of different properties regardless of how they are financed.
Formula: (Net Operating Income / Current Market Value) x 100
3. Net Operating Income (NOI)
This is your total revenue minus all necessary operating expenses (taxes, insurance, maintenance, vacancy, HOA). Note that mortgage payments are not included in NOI.
How to Use This Calculator
Purchase Price & Loan: Enter the negotiated price and your financing details. High interest rates significantly impact cash flow.
Vacancy Rate: Never assume 100% occupancy. A standard vacancy rate is 5-8% (representing about 2-4 weeks empty per year).
Maintenance: Even new homes need repairs. Budgeting 1% of the property value annually or a flat monthly fee is prudent.
Cash Flow: This is your profit after paying the mortgage and all expenses. Positive cash flow creates financial freedom.
Why Cash Flow Matters More Than Appreciation
While property appreciation (increase in value over time) is a great bonus, it is speculative. Cash flow is tangible income you receive monthly. Experienced investors prioritize properties with positive monthly cash flow to ensure the asset pays for itself during market downturns.
function calculateROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var downPayment = parseFloat(document.getElementById('downPayment').value) || 0;
var rate = parseFloat(document.getElementById('interestRate').value) || 0;
var term = parseFloat(document.getElementById('loanTerm').value) || 0;
var rent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var tax = parseFloat(document.getElementById('propertyTax').value) || 0;
var insurance = parseFloat(document.getElementById('insurance').value) || 0;
var maintenance = parseFloat(document.getElementById('maintenance').value) || 0;
var hoa = parseFloat(document.getElementById('hoa').value) || 0;
// 2. Calculate Mortgage Payment
var loanAmount = price – downPayment;
var monthlyRate = (rate / 100) / 12;
var numberOfPayments = term * 12;
var monthlyMortgage = 0;
if (rate > 0 && loanAmount > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (rate === 0 && term > 0) {
monthlyMortgage = loanAmount / numberOfPayments;
}
// 3. Calculate Monthly Expenses (Operating)
var monthlyTax = tax / 12;
var monthlyInsurance = insurance / 12;
var vacancyCost = rent * (vacancyRate / 100);
// Total Operating Expenses (Excluding Mortgage – for Cap Rate/NOI)
var monthlyOperatingExpenses = monthlyTax + monthlyInsurance + maintenance + hoa + vacancyCost;
// Total Expenses (Including Mortgage – for Cash Flow)
var totalMonthlyExpenses = monthlyOperatingExpenses + monthlyMortgage;
// 4. Calculate Income & Cash Flow
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// 5. Calculate NOI (Net Operating Income)
// NOI = Annual Income – Annual Operating Expenses
var annualRent = rent * 12;
var annualOperatingExpenses = monthlyOperatingExpenses * 12;
var annualNOI = annualRent – annualOperatingExpenses;
// 6. Calculate Metrics
// Total Cash Invested
var totalInvested = downPayment + closingCosts;
// Cash on Cash ROI = (Annual Cash Flow / Total Cash Invested) * 100
var cashOnCashROI = 0;
if (totalInvested > 0) {
cashOnCashROI = (annualCashFlow / totalInvested) * 100;
}
// Cap Rate = (Annual NOI / Purchase Price) * 100
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// 7. Update DOM Results
var resultArea = document.getElementById('resultsArea');
resultArea.style.display = 'block';
// Helper for currency format
var fmtMoney = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('resultROI').innerText = cashOnCashROI.toFixed(2) + "%";
document.getElementById('resultCapRate').innerText = capRate.toFixed(2) + "%";
document.getElementById('resultCashFlow').innerText = fmtMoney.format(monthlyCashFlow);
document.getElementById('resultAnnualCashFlow').innerText = fmtMoney.format(annualCashFlow);
document.getElementById('resultExpenses').innerText = fmtMoney.format(totalMonthlyExpenses);
document.getElementById('resultMortgage').innerText = fmtMoney.format(monthlyMortgage);
// Styling for positive/negative cash flow
var cashFlowEl = document.getElementById('resultCashFlow');
if (monthlyCashFlow >= 0) {
cashFlowEl.classList.remove('negative');
cashFlowEl.classList.add('positive');
} else {
cashFlowEl.classList.remove('positive');
cashFlowEl.classList.add('negative');
}
var roiEl = document.getElementById('resultROI');
if (cashOnCashROI >= 0) {
roiEl.classList.remove('negative');
roiEl.classList.add('positive');
} else {
roiEl.classList.remove('positive');
roiEl.classList.add('negative');
}
}