Analyze cash flow, cap rate, and cash-on-cash return for your real estate investments.
Purchase Info
Loan Details
Rental Income & Vacancy
Recurring Expenses
Financial Summary (Monthly)
Gross Rent:$0.00
Vacancy Loss:-$0.00
Operating Expenses:-$0.00
Net Operating Income (NOI):$0.00
Mortgage Payment (P&I):-$0.00
Monthly Cash Flow:$0.00
Investment Metrics (Annual)
Annual Cash Flow:$0.00
Cap Rate:0.00%
Cash on Cash Return:0.00%
Understanding Rental Property ROI
Investing in real estate is a powerful wealth-building strategy, but success depends heavily on the numbers. Unlike stocks, where the price is the only variable, rental properties involve a complex interplay of income, expenses, financing, and taxation. This Rental Property ROI Calculator is designed to help investors cut through the noise and determine the viability of a potential deal.
Key Metrics Explained
When evaluating a rental property, there are three primary metrics you should focus on:
Cash Flow: This is the profit you take home each month after paying all operating expenses and debt service (mortgage). Positive cash flow is essential for long-term sustainability. It acts as a safety net against vacancies and unexpected repairs.
Cap Rate (Capitalization Rate): This metric measures the natural rate of return on the property assuming it was bought with cash. It is calculated by dividing the Net Operating Income (NOI) by the property's purchase price. A higher Cap Rate generally indicates a better return, though it may also signify higher risk.
Cash-on-Cash Return (CoC): This is arguably the most important metric for leveraged investors. It measures the annual cash return on the actual cash invested (down payment + closing costs + rehab costs). For example, if you invest $50,000 to buy a property and it generates $5,000 in annual cash flow, your CoC return is 10%.
How to Calculate Cash Flow
Calculating cash flow requires a granular look at both income and expenses. Many new investors make the mistake of only subtracting the mortgage from the rent, ignoring the "hidden" costs of ownership.
The formula is: Cash Flow = Gross Income – Vacancy – Operating Expenses – Debt Service.
Estimating Expenses Accurately
Underestimating expenses is the #1 killer of real estate deals. Ensure you account for:
Vacancy Rate: Properties will not be occupied 365 days a year. A standard conservative estimate is 5% to 8% (roughly 2-4 weeks of vacancy per year).
Repairs & Maintenance: Even if a house is new, things break. Budgeting 1% of the property value annually or 10% of the rent is a prudent safeguard.
Property Management: Even if you plan to self-manage, you should account for your time or the potential future cost of a manager (typically 8-10% of collected rent).
Capital Expenditures (CapEx): These are big-ticket items like roofs, HVAC systems, and water heaters. While they don't happen monthly, you should set aside reserves every month to pay for them when they inevitably fail.
Interpreting Your Results
After running the numbers above, what constitutes a "good" deal? This depends on your strategy and local market.
In high-appreciation markets (like coastal cities), investors might accept a lower Cash-on-Cash return (e.g., 2-4%) banking on the property value increasing over time. In cash-flow markets (often in the Midwest or South), investors typically look for 8-12% CoC returns or roughly $100-$200 per door in net monthly profit.
Use this calculator to stress-test your deals. What happens if the vacancy rate jumps to 10%? What if insurance premiums rise? If the property still cash flows under conservative estimates, you likely have a solid investment opportunity.
function calculateROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById("purchasePrice").value) || 0;
var closingCosts = parseFloat(document.getElementById("closingCosts").value) || 0;
var downPercent = parseFloat(document.getElementById("downPaymentPercent").value) || 0;
var rate = parseFloat(document.getElementById("interestRate").value) || 0;
var years = parseFloat(document.getElementById("loanTerm").value) || 0;
var monthlyRent = parseFloat(document.getElementById("monthlyRent").value) || 0;
var vacancyRate = parseFloat(document.getElementById("vacancyRate").value) || 0;
var taxYearly = parseFloat(document.getElementById("propertyTax").value) || 0;
var insuranceYearly = parseFloat(document.getElementById("insurance").value) || 0;
var hoaMonthly = parseFloat(document.getElementById("hoa").value) || 0;
var maintMonthly = parseFloat(document.getElementById("maintenance").value) || 0;
var mgmtPercent = parseFloat(document.getElementById("managementFee").value) || 0;
// 2. Calculate Loan Details
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var totalCashInvested = downPaymentAmount + closingCosts;
// Mortgage Calculation (P&I)
var monthlyRate = (rate / 100) / 12;
var numPayments = years * 12;
var monthlyMortgage = 0;
if (rate === 0) {
monthlyMortgage = loanAmount / numPayments;
} else if (loanAmount > 0) {
monthlyMortgage = (loanAmount * monthlyRate) / (1 – Math.pow(1 + monthlyRate, -numPayments));
}
// 3. Calculate Income & Expenses (Monthly)
var vacancyLoss = monthlyRent * (vacancyRate / 100);
var effectiveGrossIncome = monthlyRent – vacancyLoss;
var mgmtFeeAmount = effectiveGrossIncome * (mgmtPercent / 100);
var taxMonthly = taxYearly / 12;
var insuranceMonthly = insuranceYearly / 12;
var totalMonthlyExpenses = taxMonthly + insuranceMonthly + hoaMonthly + maintMonthly + mgmtFeeAmount;
var netOperatingIncomeMonthly = effectiveGrossIncome – totalMonthlyExpenses;
var monthlyCashFlow = netOperatingIncomeMonthly – monthlyMortgage;
// 4. Annual Metrics
var annualNOI = netOperatingIncomeMonthly * 12;
var annualCashFlow = monthlyCashFlow * 12;
// Cap Rate = (Annual NOI / Purchase Price) * 100
var capRate = (price > 0) ? (annualNOI / price) * 100 : 0;
// Cash on Cash = (Annual Cash Flow / Total Cash Invested) * 100
var cashOnCash = (totalCashInvested > 0) ? (annualCashFlow / totalCashInvested) * 100 : 0;
// 5. Update UI
function formatCurrency(num) {
return "$" + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}
function setHTML(id, val, isCurrency, isPercentage) {
var el = document.getElementById(id);
if (isCurrency) {
el.innerHTML = formatCurrency(val);
// Simple color logic for cash flow
if ((id === 'resCashFlow' || id === 'resAnnualCashFlow') && val = 0) {
el.className = "positive";
}
} else if (isPercentage) {
el.innerHTML = val.toFixed(2) + "%";
if ((id === 'resCoC') && val = 0) {
el.className = "positive";
}
} else {
el.innerHTML = val;
}
}
setHTML("resGrossRent", monthlyRent, true, false);
setHTML("resVacancy", vacancyLoss, true, false);
setHTML("resExpenses", totalMonthlyExpenses, true, false);
setHTML("resNOI", netOperatingIncomeMonthly, true, false);
setHTML("resMortgage", monthlyMortgage, true, false);
setHTML("resCashFlow", monthlyCashFlow, true, false);
setHTML("resAnnualCashFlow", annualCashFlow, true, false);
setHTML("resCapRate", capRate, false, true);
setHTML("resCoC", cashOnCash, false, true);
// Show results
document.getElementById("results").style.display = "block";
}