Analyze the profitability of your real estate investment by calculating Cash Flow, Cap Rate, and Cash on Cash Return.
30 Years
20 Years
15 Years
10 Years
Investment Analysis
Monthly Mortgage Payment:—
Monthly Cash Flow:—
Net Operating Income (NOI) / Year:—
Cap Rate:—
Cash on Cash Return:—
Understanding Your Rental Property ROI Results
Evaluating a rental property requires looking beyond just the monthly rent check. This Rental Property ROI Calculator helps investors determine if a property is a viable asset by breaking down the key performance metrics used by professionals.
Key Metrics Explained:
Monthly Cash Flow: This is your net profit each month after the mortgage, taxes, insurance, and operating expenses are paid. A positive cash flow indicates the property pays for itself and generates income.
Cap Rate (Capitalization Rate): Calculated as Net Operating Income / Purchase Price. This metric represents the natural rate of return on the property assuming you bought it in cash. It is useful for comparing the raw potential of different properties regardless of financing.
Cash on Cash (CoC) Return: Calculated as Annual Cash Flow / Total Cash Invested. This is arguably the most important metric for leveraged investors, as it tells you the percentage return on the actual dollars you put into the deal (Down Payment + Closing Costs).
What is a "Good" ROI?
While targets vary by market and strategy, many investors look for a Cash on Cash return of 8-12% or higher. A Cap Rate generally follows the risk level of the area; higher cap rates (8%+) are often found in riskier or lower-cost areas, while lower cap rates (4-6%) are common in high-demand, stable urban centers.
function calculateROI() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('propPrice').value);
var downPayment = parseFloat(document.getElementById('downPayment').value);
var rate = parseFloat(document.getElementById('interestRate').value);
var termYears = parseFloat(document.getElementById('loanTerm').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var annualExpenses = parseFloat(document.getElementById('annualExpenses').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
// 2. Validation
if (isNaN(price) || isNaN(downPayment) || isNaN(rate) || isNaN(termYears) || isNaN(rent) || isNaN(annualExpenses)) {
alert("Please fill in all required fields with valid numbers.");
return;
}
if (isNaN(closingCosts)) closingCosts = 0; // default to 0 if empty
// 3. Calculation Logic
// Loan Details
var loanAmount = price – downPayment;
var monthlyRate = (rate / 100) / 12;
var totalMonths = termYears * 12;
// Mortgage Payment Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyMortgage = 0;
if (loanAmount > 0) {
if (rate === 0) {
monthlyMortgage = loanAmount / totalMonths;
} else {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalMonths)) / (Math.pow(1 + monthlyRate, totalMonths) – 1);
}
}
// Monthly Expenses (Operating + Mortgage)
var monthlyOperatingExpenses = annualExpenses / 12;
var totalMonthlyCost = monthlyMortgage + monthlyOperatingExpenses;
// Cash Flow
var monthlyCashFlow = rent – totalMonthlyCost;
var annualCashFlow = monthlyCashFlow * 12;
// NOI (Net Operating Income) = Annual Rent – Annual Operating Expenses (Excludes Mortgage)
var annualRent = rent * 12;
var noi = annualRent – annualExpenses;
// Cap Rate = (NOI / Purchase Price) * 100
var capRate = 0;
if (price > 0) {
capRate = (noi / price) * 100;
}
// Cash on Cash Return = (Annual Cash Flow / Total Cash Invested) * 100
var totalCashInvested = downPayment + closingCosts;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// 4. Update UI
document.getElementById('results-area').style.display = 'block';
document.getElementById('resMortgage').innerText = "$" + monthlyMortgage.toFixed(2);
var cfElement = document.getElementById('resCashflow');
cfElement.innerText = "$" + monthlyCashFlow.toFixed(2);
if(monthlyCashFlow >= 0) {
cfElement.className = "result-value positive-cf";
} else {
cfElement.className = "result-value negative-cf";
}
document.getElementById('resNOI').innerText = "$" + noi.toFixed(2);
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
var cocElement = document.getElementById('resCoC');
cocElement.innerText = cocReturn.toFixed(2) + "%";
if(cocReturn >= 0) {
cocElement.className = "result-value positive-cf";
} else {
cocElement.className = "result-value negative-cf";
}
}