Calculate Cash on Cash Return, Cap Rate, and Monthly Cash Flow
Purchase & Loan Details
Income & Operational Expenses
Please check your inputs. Ensure all fields contain valid numbers.
Total Initial Investment:$0.00
Monthly Mortgage Payment (P&I):$0.00
Total Monthly Expenses:$0.00
Net Operating Income (Annual):$0.00
Monthly Cash Flow:$0.00
Cash on Cash Return:0.00%
Cap Rate:0.00%
How to Analyze a Rental Property Investment
Investing in real estate is a numbers game. Whether you are buying a single-family home or a multi-unit apartment complex, knowing your numbers is the only way to ensure profitability. This Rental Property ROI Calculator helps you evaluate the potential performance of an asset using key industry metrics.
Key Metrics Explained
1. Cash on Cash Return (CoC)
This is arguably the most important metric for investors using leverage (a mortgage). It measures the annual return on the actual cash you invested, not the total purchase price.
Formula:Annual Pre-Tax Cash Flow / Total Cash Invested
For example, if you invest $50,000 (down payment + closing costs) and the property generates $5,000 in positive cash flow per year, your CoC return is 10%.
2. Net Operating Income (NOI)
NOI represents the profitability of a property before adding in any costs from financing or taxes. It is calculated by subtracting all operating expenses (taxes, insurance, maintenance, vacancy, management) from the gross income. Lenders look closely at NOI to determine if a property generates enough income to cover the debt.
3. Cap Rate (Capitalization Rate)
Cap Rate measures the rate of return on a real estate investment property based on the income that the property is expected to generate. It assumes you bought the property in all cash.
Formula:Net Operating Income / Current Market Value
A higher cap rate generally implies higher risk and higher potential return, while a lower cap rate implies a safer asset with lower returns.
Estimating Expenses
When using this calculator, it is crucial to be realistic about expenses:
Vacancy Rate: Always budget for vacancy. 5% is standard (approx. 2.5 weeks per year), but this can be higher in areas with high turnover.
Maintenance: A common rule of thumb is to set aside 1% of the property value per year, or 5-10% of the rental income, for repairs and CapEx (Capital Expenditures like a new roof or HVAC).
Management Fees: If you hire a property manager, expect to pay 8-10% of the monthly rent. Add this to your maintenance percentage input if applicable.
function calculateRentalROI() {
// 1. Get DOM elements
var purchasePriceInput = document.getElementById("purchasePrice");
var downPaymentInput = document.getElementById("downPayment");
var closingCostsInput = document.getElementById("closingCosts");
var interestRateInput = document.getElementById("interestRate");
var loanTermInput = document.getElementById("loanTerm");
var monthlyRentInput = document.getElementById("monthlyRent");
var propertyTaxInput = document.getElementById("propertyTax");
var insuranceInput = document.getElementById("insurance");
var maintenanceInput = document.getElementById("maintenance");
var vacancyInput = document.getElementById("vacancy");
var resultsArea = document.getElementById("results-area");
var errorMsg = document.getElementById("errorMsg");
// 2. Parse Float values
var price = parseFloat(purchasePriceInput.value);
var downPayment = parseFloat(downPaymentInput.value);
var closingCosts = parseFloat(closingCostsInput.value);
var rate = parseFloat(interestRateInput.value);
var termYears = parseFloat(loanTermInput.value);
var rent = parseFloat(monthlyRentInput.value);
var taxes = parseFloat(propertyTaxInput.value);
var insurance = parseFloat(insuranceInput.value);
var maintPercent = parseFloat(maintenanceInput.value);
var vacancyPercent = parseFloat(vacancyInput.value);
// 3. Validation
if (isNaN(price) || isNaN(downPayment) || isNaN(rent) || isNaN(rate) || isNaN(termYears)) {
errorMsg.style.display = "block";
resultsArea.style.display = "none";
return;
} else {
errorMsg.style.display = "none";
}
// Handle optional fields with defaults if empty/NaN (though inputs are number type)
if (isNaN(closingCosts)) closingCosts = 0;
if (isNaN(taxes)) taxes = 0;
if (isNaN(insurance)) insurance = 0;
if (isNaN(maintPercent)) maintPercent = 0;
if (isNaN(vacancyPercent)) vacancyPercent = 0;
// 4. Calculations
// Loan Amount
var loanAmount = price – downPayment;
// Monthly Mortgage Calculation (Principal + Interest)
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyRate = (rate / 100) / 12;
var numberOfPayments = termYears * 12;
var monthlyMortgage = 0;
if (rate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// Income Calculations
var grossAnnualIncome = rent * 12;
var vacancyCost = grossAnnualIncome * (vacancyPercent / 100);
var effectiveGrossIncome = grossAnnualIncome – vacancyCost;
// Expense Calculations
var annualMaintenance = grossAnnualIncome * (maintPercent / 100);
var totalOperatingExpenses = taxes + insurance + annualMaintenance; // Excludes Mortgage
// Net Operating Income (NOI)
var noi = effectiveGrossIncome – totalOperatingExpenses;
// Cash Flow
var annualDebtService = monthlyMortgage * 12;
var annualCashFlow = noi – annualDebtService;
var monthlyCashFlow = annualCashFlow / 12;
// Investment Metrics
var totalInvested = downPayment + closingCosts;
var cocReturn = 0;
if (totalInvested > 0) {
cocReturn = (annualCashFlow / totalInvested) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (noi / price) * 100;
}
// Monthly Expenses Total (for display)
var totalMonthlyExpenses = (totalOperatingExpenses / 12) + monthlyMortgage + (vacancyCost / 12);
// 5. Display Results
// Helper for currency format
var currencyFmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById("resTotalInvested").innerText = currencyFmt.format(totalInvested);
document.getElementById("resMortgage").innerText = currencyFmt.format(monthlyMortgage);
document.getElementById("resExpenses").innerText = currencyFmt.format(totalMonthlyExpenses); // Includes vacancy, maint, tax, ins, mortgage
document.getElementById("resNOI").innerText = currencyFmt.format(noi);
var resMonthlyFlowEl = document.getElementById("resMonthlyCashFlow");
resMonthlyFlowEl.innerText = currencyFmt.format(monthlyCashFlow);
if(monthlyCashFlow < 0) {
resMonthlyFlowEl.style.color = "#c0392b";
} else {
resMonthlyFlowEl.style.color = "#27ae60";
}
var resCoCEl = document.getElementById("resCoC");
resCoCEl.innerText = cocReturn.toFixed(2) + "%";
if(cocReturn < 0) {
resCoCEl.style.color = "#c0392b";
} else {
resCoCEl.style.color = "#27ae60";
}
document.getElementById("resCapRate").innerText = capRate.toFixed(2) + "%";
resultsArea.style.display = "block";
// Scroll to results
resultsArea.scrollIntoView({ behavior: 'smooth' });
}