Analyze cash flow, cap rate, and Cash-on-Cash return for real estate investments.
Purchase Information
Financing Details
Monthly Income & Expenses
Investment Analysis
Total Initial Investment (Cash Needed):$0.00
Monthly Mortgage Payment (P&I):$0.00
Total Monthly Expenses:$0.00
Monthly Cash Flow:$0.00
Cap Rate:0.00%
Cash on Cash ROI:0.00%
Understanding Rental Property ROI
Investing in real estate requires more than just buying a property and collecting rent. To ensure a profitable investment, you must analyze the numbers accurately. This Rental Property Cash Flow & ROI Calculator helps investors determine the viability of a potential purchase by breaking down income, expenses, and financing costs.
Key Metrics Explained
Cash Flow: The net amount of cash moving in or out of the investment each month. Positive cash flow means the property generates income after all expenses (including the mortgage) are paid.
Cash on Cash (CoC) ROI: This metric calculates the annual return on the actual cash you invested (down payment + closing costs), rather than the total purchase price. It is arguably the most important metric for buy-and-hold investors.
Cap Rate (Capitalization Rate): This measures the property's natural rate of return assuming it was bought with cash. It helps compare the profitability of different properties independently of financing terms. Formula: (Net Operating Income / Purchase Price) × 100.
How to Calculate Rental Property Profitability
To use this calculator effectively, gather accurate data regarding the property. Estimate your vacancy rate and maintenance costs conservatively. A common rule of thumb is to set aside 10-15% of monthly rent for repairs and capital expenditures (CapEx) like roof or HVAC replacement. Ensure your interest rate input reflects current market conditions for investment property loans, which are typically higher than primary residence rates.
What is a Good ROI for Rental Property?
While targets vary by investor and market, a Cash on Cash ROI of 8-12% is generally considered solid for long-term rentals. In highly appreciative markets, investors might accept lower cash flow (4-6%) in exchange for equity growth. Conversely, in stable markets with low appreciation, investors often seek 12%+ cash returns to justify the risk.
function calculateRentalROI() {
// 1. Get Inputs by ID
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var loanTermYears = parseFloat(document.getElementById('loanTerm').value);
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value);
var otherIncome = parseFloat(document.getElementById('otherIncome').value);
var tax = parseFloat(document.getElementById('propertyTax').value);
var insurance = parseFloat(document.getElementById('insurance').value);
var hoa = parseFloat(document.getElementById('hoaFees').value);
var maintenance = parseFloat(document.getElementById('maintenance').value);
// 2. Validate Inputs
if (isNaN(purchasePrice) || isNaN(downPercent) || isNaN(interestRate) || isNaN(loanTermYears) || isNaN(monthlyRent)) {
alert("Please fill in all required fields (Price, Down Payment, Rate, Term, Rent) with valid numbers.");
return;
}
// Handle optional fields if empty (treat as 0)
if (isNaN(closingCosts)) closingCosts = 0;
if (isNaN(otherIncome)) otherIncome = 0;
if (isNaN(tax)) tax = 0;
if (isNaN(insurance)) insurance = 0;
if (isNaN(hoa)) hoa = 0;
if (isNaN(maintenance)) maintenance = 0;
// 3. Perform Calculations
// Loan Calculations
var downPaymentAmount = purchasePrice * (downPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanTermYears * 12;
// Mortgage P&I Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyMortgage = 0;
if (interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// Income & Expenses
var totalMonthlyIncome = monthlyRent + otherIncome;
var operatingExpenses = tax + insurance + hoa + maintenance; // Excludes mortgage
var totalMonthlyExpenses = operatingExpenses + monthlyMortgage;
var monthlyCashFlow = totalMonthlyIncome – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// Investment Metrics
var totalInitialInvestment = downPaymentAmount + closingCosts;
// Net Operating Income (NOI) = Income – Operating Expenses (No Mortgage)
var noi = (totalMonthlyIncome – operatingExpenses) * 12;
var capRate = (noi / purchasePrice) * 100;
var cashOnCash = 0;
if (totalInitialInvestment > 0) {
cashOnCash = (annualCashFlow / totalInitialInvestment) * 100;
}
// 4. Update UI
// Helper formatter
var fmtMoney = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('resTotalInvestment').innerText = fmtMoney.format(totalInitialInvestment);
document.getElementById('resMortgage').innerText = fmtMoney.format(monthlyMortgage);
document.getElementById('resTotalExpenses').innerText = fmtMoney.format(totalMonthlyExpenses);
var cashFlowEl = document.getElementById('resCashFlow');
cashFlowEl.innerText = fmtMoney.format(monthlyCashFlow);
if (monthlyCashFlow >= 0) {
cashFlowEl.className = "result-value highlight-positive";
} else {
cashFlowEl.className = "result-value highlight-negative";
}
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
var cocEl = document.getElementById('resCoC');
cocEl.innerText = cashOnCash.toFixed(2) + "%";
if (cashOnCash >= 0) {
cocEl.className = "result-value highlight-positive";
} else {
cocEl.className = "result-value highlight-negative";
}
// Show results container
document.getElementById('results-area').style.display = 'block';
// Scroll to results
document.getElementById('results-area').scrollIntoView({ behavior: 'smooth' });
}