Investing in real estate is a powerful way to build wealth, but not every property is a good deal. This Rental Property Cash Flow Calculator helps investors analyze the profitability of a potential purchase by breaking down income, operating expenses, and financing costs.
Key Metrics Explained
When analyzing a rental property, three metrics are critical for making an informed decision:
Cash Flow: This is the profit you take home each month after paying all expenses (mortgage, taxes, insurance, and reserves). Positive cash flow ensures the property pays for itself.
Cash on Cash Return (CoC): This measures the annual return on the actual cash you invested (down payment + closing costs). A CoC of 8-12% is generally considered a solid return in many markets.
Cap Rate (Capitalization Rate): This metric evaluates the property's natural profitability, independent of financing. It is calculated by dividing the Net Operating Income (NOI) by the purchase price. It allows you to compare properties regardless of how they are purchased (cash vs. loan).
Why Factor in Vacancy and Maintenance?
Many novice investors make the mistake of calculating returns based on full occupancy and zero repairs. Realistically, tenants move out, and things break. Our calculator includes inputs for Vacancy Rate (typically 5-8%) and Maintenance/CapEx (typically 10-15%) to give you a conservative and realistic financial picture.
How to Use This Calculator
Start by entering the Purchase Price and loan details. Be sure to estimate your Closing Costs accurately, as this affects your total cash invested. Under the expenses section, input the expected Monthly Rent and all associated costs. If you plan to manage the property yourself, you can set the Management Fee to 0%, but including it helps you see if the deal still works should you hire a professional later.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('rp_price').value) || 0;
var downPercent = parseFloat(document.getElementById('rp_down_percent').value) || 0;
var interestRate = parseFloat(document.getElementById('rp_interest').value) || 0;
var termYears = parseFloat(document.getElementById('rp_term').value) || 0;
var closingCosts = parseFloat(document.getElementById('rp_closing').value) || 0;
var monthlyRent = parseFloat(document.getElementById('rp_rent').value) || 0;
var annualTax = parseFloat(document.getElementById('rp_tax').value) || 0;
var annualInsurance = parseFloat(document.getElementById('rp_insurance').value) || 0;
var monthlyHOA = parseFloat(document.getElementById('rp_hoa').value) || 0;
var maintenancePercent = parseFloat(document.getElementById('rp_maintenance').value) || 0;
var vacancyPercent = parseFloat(document.getElementById('rp_vacancy').value) || 0;
var managementPercent = parseFloat(document.getElementById('rp_management').value) || 0;
// 2. Calculate Loan Details
var downPayment = price * (downPercent / 100);
var loanAmount = price – downPayment;
var monthlyInterest = interestRate / 100 / 12;
var numPayments = termYears * 12;
var monthlyMortgage = 0;
if (loanAmount > 0) {
if (interestRate === 0) {
monthlyMortgage = loanAmount / numPayments;
} else {
monthlyMortgage = (loanAmount * monthlyInterest) / (1 – Math.pow(1 + monthlyInterest, -numPayments));
}
}
// 3. Calculate Operating Expenses
var monthlyTax = annualTax / 12;
var monthlyInsurance = annualInsurance / 12;
// Variable expenses based on Rent
var vacancyCost = monthlyRent * (vacancyPercent / 100);
var maintenanceCost = monthlyRent * (maintenancePercent / 100);
var managementCost = monthlyRent * (managementPercent / 100);
var operatingExpenses = monthlyTax + monthlyInsurance + monthlyHOA + vacancyCost + maintenanceCost + managementCost;
var totalMonthlyExpenses = operatingExpenses + monthlyMortgage;
// 4. Calculate Returns
var monthlyCashFlow = monthlyRent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var totalCashInvested = downPayment + closingCosts;
// Net Operating Income (NOI) = Income – Operating Expenses (Excluding Mortgage)
// Note: Usually NOI excludes debt service.
var annualNOI = (monthlyRent * 12) – (operatingExpenses * 12);
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// 5. Display Results
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
document.getElementById('res_mortgage').innerText = formatter.format(monthlyMortgage);
document.getElementById('res_total_expenses').innerText = formatter.format(totalMonthlyExpenses);
var cfElement = document.getElementById('res_cashflow');
cfElement.innerText = formatter.format(monthlyCashFlow);
if (monthlyCashFlow >= 0) {
cfElement.className = "rp-result-value rp-highlight";
} else {
cfElement.className = "rp-result-value rp-highlight-neg";
}
document.getElementById('res_noi').innerText = formatter.format(annualNOI);
document.getElementById('res_cap_rate').innerText = capRate.toFixed(2) + "%";
var cocElement = document.getElementById('res_coc');
cocElement.innerText = cocReturn.toFixed(2) + "%";
if (cocReturn >= 0) {
cocElement.className = "rp-result-value rp-highlight";
} else {
cocElement.className = "rp-result-value rp-highlight-neg";
}
// Show result container
document.getElementById('rp_results').style.display = 'block';
}