Analyze the potential ROI, Cap Rate, and Monthly Cash Flow of your real estate investment.
Purchase & Loan Details
Income & Expenses
Please check your inputs. Values must be valid numbers.
Financial Analysis
Net Operating Income (NOI) / Mo:
Monthly Mortgage Payment:
Monthly Cash Flow:
Annual Cash Flow:
Cash on Cash ROI:
Cap Rate:
Total Cash Needed to Buy:
How to Analyze a Rental Property Investment
Successful real estate investing relies heavily on the numbers. Unlike stocks, where speculation often drives value, rental properties are businesses that produce defined income and incur specific expenses. Using a Rental Property Cash Flow Calculator helps investors distinguish between a speculative gamble and a sound investment.
Key Metrics Explained
1. Cash Flow
Cash flow is the profit you bring in each month after all expenses, including the mortgage, are paid. It is calculated as:
Cash Flow = Income - (Operating Expenses + Debt Service)
Positive cash flow ensures the property pays for itself and provides you with passive income. Most seasoned investors look for at least $100-$200 per door in pure cash flow per month.
2. Net Operating Income (NOI)
NOI is the total income generated by the property minus all operating expenses, but excluding the mortgage payment. This metric is crucial because it assesses the profitability of the property itself, regardless of how it is financed.
3. Cash on Cash Return (CoC ROI)
This is arguably the most important metric for leveraged investors. It measures the annual return on the actual cash you invested (down payment + closing costs + repairs), not the total price of the home. A CoC return of 8-12% is generally considered a solid benchmark in the stock market comparison.
CoC ROI = (Annual Cash Flow / Total Cash Invested) * 100
4. Cap Rate (Capitalization Rate)
Cap Rate measures the natural rate of return of the property if it were bought with all cash. It allows you to compare properties in different markets without financing variables skewing the data.
Common Expenses to Watch For
When using this calculator, ensure you don't underestimate expenses. Novice investors often forget:
Vacancy: Properties won't be rented 365 days a year. A 5-8% vacancy allowance is standard.
CapEx (Capital Expenditures): Roofs and HVAC systems eventually need replacing. Budgeting for these monthly saves you from future shock.
Management Fees: Even if you self-manage now, calculating a 10% management fee ensures the deal still works if you decide to hire a professional later.
function calculateRentalROI() {
// 1. Get Inputs using var
var price = parseFloat(document.getElementById('rp_price').value);
var downPercent = parseFloat(document.getElementById('rp_down_percent').value);
var interestRate = parseFloat(document.getElementById('rp_interest').value);
var termYears = parseFloat(document.getElementById('rp_term').value);
var closingCosts = parseFloat(document.getElementById('rp_closing_costs').value);
var rehabCosts = parseFloat(document.getElementById('rp_rehab').value);
var rent = parseFloat(document.getElementById('rp_rent').value);
var vacancyRate = parseFloat(document.getElementById('rp_vacancy').value);
var annualTax = parseFloat(document.getElementById('rp_tax').value);
var annualInsurance = parseFloat(document.getElementById('rp_insurance').value);
var mgmtPercent = parseFloat(document.getElementById('rp_mgmt').value);
var monthlyMaint = parseFloat(document.getElementById('rp_maintenance').value);
var monthlyHOA = parseFloat(document.getElementById('rp_hoa').value);
// 2. Validation
if (isNaN(price) || isNaN(downPercent) || isNaN(interestRate) || isNaN(termYears) || isNaN(rent)) {
document.getElementById('rp_error_msg').style.display = 'block';
document.getElementById('rp_results_area').style.display = 'none';
return;
} else {
document.getElementById('rp_error_msg').style.display = 'none';
}
// 3. Loan Calculations
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = termYears * 12;
// Mortgage P&I Formula
var monthlyMortgage = 0;
if (interestRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
}
// 4. Income Calculations
var vacancyLoss = rent * (vacancyRate / 100);
var effectiveGrossIncome = rent – vacancyLoss;
// 5. Expense Calculations
var monthlyTax = annualTax / 12;
var monthlyInsurance = annualInsurance / 12;
var monthlyMgmt = rent * (mgmtPercent / 100);
var totalMonthlyExpenses = monthlyTax + monthlyInsurance + monthlyMgmt + monthlyMaint + monthlyHOA;
// 6. Metrics Calculations
var monthlyNOI = effectiveGrossIncome – totalMonthlyExpenses;
var monthlyCashFlow = monthlyNOI – monthlyMortgage;
var annualCashFlow = monthlyCashFlow * 12;
var annualNOI = monthlyNOI * 12;
var totalInvestment = downPaymentAmount + closingCosts + rehabCosts;
var cocROI = 0;
if (totalInvestment > 0) {
cocROI = (annualCashFlow / totalInvestment) * 100;
}
var capRate = (annualNOI / price) * 100;
// 7. Display Results
document.getElementById('res_noi').innerHTML = "$" + monthlyNOI.toFixed(2);
document.getElementById('res_mortgage').innerHTML = "$" + monthlyMortgage.toFixed(2);
var cfElem = document.getElementById('res_cashflow');
cfElem.innerHTML = "$" + monthlyCashFlow.toFixed(2);
cfElem.style.color = monthlyCashFlow >= 0 ? "#27ae60" : "#c0392b";
var annCfElem = document.getElementById('res_annual_cashflow');
annCfElem.innerHTML = "$" + annualCashFlow.toFixed(2);
annCfElem.style.color = annualCashFlow >= 0 ? "#2c3e50" : "#c0392b";
var cocElem = document.getElementById('res_coc');
cocElem.innerHTML = cocROI.toFixed(2) + "%";
cocElem.style.color = cocROI >= 0 ? "#27ae60" : "#c0392b";
document.getElementById('res_cap').innerHTML = capRate.toFixed(2) + "%";
document.getElementById('res_investment').innerHTML = "$" + totalInvestment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('rp_results_area').style.display = 'block';
}