Investing in rental real estate requires more than just guessing the rent. To determine if a property is a good deal, investors rely on specific metrics like Cash on Cash Return and Cap Rate. This calculator helps you break down the monthly income against all associated expenses, including mortgage payments, taxes, insurance, and vacancy reserves.
Key Investment Metrics Explained
Cash on Cash Return (CoC): This measures the annual return on the actual cash you invested (Down Payment + Closing Costs). It is calculated as (Annual Cash Flow / Total Cash Invested) × 100. A CoC above 8-12% is generally considered good in many markets.
Cap Rate (Capitalization Rate): This metric evaluates the profitability of the property regardless of financing. It is calculated as (Net Operating Income / Purchase Price) × 100. This helps compare properties as if they were bought with all cash.
Net Operating Income (NOI): This is your total revenue minus all operating expenses (taxes, insurance, maintenance, vacancy), excluding mortgage payments.
Cash Flow: The net amount of money left in your pocket every month after all expenses and debt service are paid. Positive cash flow is crucial for long-term sustainability.
Why Factor in Vacancy and Maintenance?
Many new investors make the mistake of assuming a property will be rented 100% of the time and will never need repairs. A prudent analysis includes a vacancy rate (typically 5-8%) and a maintenance budget (often 1% of property value annually) to ensure you have reserves when the unexpected happens.
function calculateROI() {
// Get inputs
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 interestRate = parseFloat(document.getElementById("interestRate").value) || 0;
var loanTerm = parseFloat(document.getElementById("loanTerm").value) || 0;
var monthlyRent = parseFloat(document.getElementById("monthlyRent").value) || 0;
var vacancyRate = parseFloat(document.getElementById("vacancyRate").value) || 0;
var annualTax = parseFloat(document.getElementById("annualTax").value) || 0;
var annualInsurance = parseFloat(document.getElementById("annualInsurance").value) || 0;
var annualMaintenance = parseFloat(document.getElementById("annualMaintenance").value) || 0;
// Calculations
var loanAmount = purchasePrice – downPayment;
var totalCashInvested = downPayment + closingCosts;
// Mortgage Calculation (Monthly P&I)
var monthlyRate = (interestRate / 100) / 12;
var totalPayments = loanTerm * 12;
var monthlyMortgage = 0;
if (loanAmount > 0 && interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else if (loanAmount > 0 && interestRate === 0) {
monthlyMortgage = loanAmount / totalPayments;
}
// Monthly Expenses
var monthlyTax = annualTax / 12;
var monthlyInsurance = annualInsurance / 12;
var monthlyMaintenance = annualMaintenance / 12;
var monthlyVacancyCost = monthlyRent * (vacancyRate / 100);
var totalMonthlyOpEx = monthlyTax + monthlyInsurance + monthlyMaintenance + monthlyVacancyCost;
var totalMonthlyOutflow = monthlyMortgage + totalMonthlyOpEx;
// Income Metrics
var monthlyCashFlow = monthlyRent – totalMonthlyOutflow;
var annualCashFlow = monthlyCashFlow * 12;
// NOI (Net Operating Income) = Income – OpEx (excluding mortgage)
var annualNOI = (monthlyRent * 12) – (totalMonthlyOpEx * 12);
// ROI Metrics
var cashOnCash = 0;
if (totalCashInvested > 0) {
cashOnCash = (annualCashFlow / totalCashInvested) * 100;
}
var capRate = 0;
if (purchasePrice > 0) {
capRate = (annualNOI / purchasePrice) * 100;
}
// Format Currency
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
// Display Results
document.getElementById("resCashOnCash").innerText = cashOnCash.toFixed(2) + "%";
document.getElementById("resCapRate").innerText = capRate.toFixed(2) + "%";
document.getElementById("resMonthlyCashFlow").innerText = formatter.format(monthlyCashFlow);
// Color code cash flow
if(monthlyCashFlow >= 0) {
document.getElementById("resMonthlyCashFlow").style.color = "#28a745";
} else {
document.getElementById("resMonthlyCashFlow").style.color = "#dc3545";
}
document.getElementById("resTotalInvestment").innerText = formatter.format(totalCashInvested);
document.getElementById("resMortgage").innerText = formatter.format(monthlyMortgage);
document.getElementById("resOpEx").innerText = formatter.format(totalMonthlyOpEx);
document.getElementById("resTotalCosts").innerText = formatter.format(totalMonthlyOutflow);
document.getElementById("resAnnualCashFlow").innerText = formatter.format(annualCashFlow);
// Show results div
document.getElementById("resultsSection").style.display = "block";
}