Calculate Cap Rate, Cash-on-Cash Return, and Net Operating Income (NOI) for your real estate rental property.
Purchase Information
Loan Details
Income & Expenses
Investment Analysis
Net Operating Income (NOI)$0.00
Monthly Cash Flow$0.00
Cap Rate0.00%
Cash-on-Cash Return0.00%
Total Cash Invested$0.00
Understanding Your Real Estate Investment Returns
Investing in rental property is one of the most reliable ways to build wealth, but simply buying a property doesn't guarantee profit. To succeed, investors must accurately analyze the numbers before signing a contract. This Investment Property ROI Calculator helps you determine the viability of a rental property by computing key performance metrics like Cap Rate, Cash-on-Cash Return, and Net Operating Income (NOI).
What is Net Operating Income (NOI)?
Net Operating Income is a fundamental figure in real estate analysis. It represents the total income the property generates after all operating expenses are paid, but before debt service (mortgage payments) and income taxes.
Formula: NOI = (Gross Rental Income – Vacancy Losses) – Operating Expenses
Operating expenses include property taxes, insurance, maintenance, repairs, and property management fees. Note that principal and interest payments on your loan are not included in NOI.
Cap Rate vs. Cash-on-Cash Return
Two of the most common confusion points for new investors are the difference between Capitalization Rate (Cap Rate) and Cash-on-Cash Return. Both measure performance, but they answer different questions.
Cap Rate: Measures the property's natural rate of return assuming you bought it with all cash. It allows you to compare the profitability of different properties regardless of how they are financed. A higher Cap Rate generally implies higher risk or a better deal.
Cash-on-Cash Return: Measures the return on the actual cash you invested (down payment + closing costs + rehab). This is arguably more important for investors using leverage (mortgages), as it tells you how hard your specific dollars are working.
How to Use This Calculator
To get the most accurate results, ensure you estimate expenses conservatively. A common mistake is underestimating Vacancy (the time the unit sits empty) and Maintenance (long-term repairs like roof replacement or HVAC).
Vacancy Rate: 5% is standard for strong markets, but 8-10% is safer for areas with higher turnover.
Maintenance/CapEx: Setting aside 5-10% of monthly rent ensures you have funds for repairs when things break.
Management Fee: If you hire a professional property manager, they typically charge 8-10% of the collected rent.
Improving Your ROI
If the calculator shows a negative cash flow or a low return, consider these strategies:
Negotiate a lower purchase price to increase immediate equity and lower mortgage payments.
Look for "value-add" opportunities where minor renovations can significantly increase the monthly rent.
Shop for better financing terms or lower interest rates to decrease your monthly debt service.
function calculateROI() {
// 1. Get Input Values
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPayment = parseFloat(document.getElementById('downPayment').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var rehabCosts = parseFloat(document.getElementById('rehabCosts').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTermYears = parseFloat(document.getElementById('loanTerm').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var annualTaxes = parseFloat(document.getElementById('annualTaxes').value) || 0;
var annualInsurance = parseFloat(document.getElementById('annualInsurance').value) || 0;
var maintenanceRate = parseFloat(document.getElementById('maintenanceRate').value) || 0;
var managementFeeRate = parseFloat(document.getElementById('managementFee').value) || 0;
// 2. Calculate Initial Investment (Denominator for Cash on Cash)
var totalCashInvested = downPayment + closingCosts + rehabCosts;
var loanAmount = purchasePrice – downPayment;
// 3. Calculate Income
var annualGrossIncome = monthlyRent * 12;
var vacancyLoss = annualGrossIncome * (vacancyRate / 100);
var effectiveGrossIncome = annualGrossIncome – vacancyLoss;
// 4. Calculate Operating Expenses
var annualMaintenance = annualGrossIncome * (maintenanceRate / 100);
var annualMgmtFee = annualGrossIncome * (managementFeeRate / 100);
var totalOperatingExpenses = annualTaxes + annualInsurance + annualMaintenance + annualMgmtFee;
// 5. Calculate NOI
var noi = effectiveGrossIncome – totalOperatingExpenses;
// 6. Calculate Mortgage Payment (Annual)
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var annualDebtService = 0;
if (loanAmount > 0 && interestRate > 0 && loanTermYears > 0) {
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTermYears * 12;
var monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
annualDebtService = monthlyMortgage * 12;
}
// 7. Calculate Cash Flow
var annualCashFlow = noi – annualDebtService;
var monthlyCashFlow = annualCashFlow / 12;
// 8. Calculate Ratios
var capRate = 0;
if (purchasePrice > 0) {
capRate = (noi / purchasePrice) * 100;
}
var cashOnCash = 0;
if (totalCashInvested > 0) {
cashOnCash = (annualCashFlow / totalCashInvested) * 100;
}
// 9. Formatting Helpers
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
// 10. Output Results
document.getElementById('result-noi').innerText = formatter.format(noi); // Annual NOI
document.getElementById('result-cashflow').innerText = formatter.format(monthlyCashFlow); // Monthly Cash Flow
document.getElementById('result-caprate').innerText = capRate.toFixed(2) + "%";
document.getElementById('result-coc').innerText = cashOnCash.toFixed(2) + "%";
document.getElementById('result-invested').innerText = formatter.format(totalCashInvested);
// Show results container
document.getElementById('calc-results').style.display = 'block';
}