Analyze your investment property's ROI, Cap Rate, and monthly cash flow instantly.
Purchase & Loan Details
Rental Income
Operating Expenses
Investment Analysis
Net Operating Income (NOI) / Mo:
Total Monthly Expenses:
Monthly Mortgage Payment:
Monthly Cash Flow:
Annual Cash Flow:
Cash on Cash Return (ROI):
Cap Rate:
Understanding Rental Property Cash Flow
Calculating cash flow is the most critical step in evaluating a rental property investment. Positive cash flow ensures that the property pays for itself while generating income for you. This calculator helps real estate investors breakdown income, operating expenses, and debt service to find the true profitability of a deal.
Key Metrics Explained
Net Operating Income (NOI): This is your total rental income minus all operating expenses (taxes, insurance, repairs, vacancy) before paying the mortgage. It represents the inherent profitability of the property itself.
Cash Flow: The money left in your pocket after paying all expenses and the mortgage. Formula: NOI – Mortgage Payment = Cash Flow
Cash on Cash Return (CoC ROI): This measures the return on the actual cash you invested (down payment + closing costs). It is a better metric than standard ROI for leveraged real estate. Formula: Annual Cash Flow / Total Cash Invested
Cap Rate: The rate of return on the property if you bought it with all cash. It helps compare properties regardless of financing.
How to Use This Calculator
Enter your purchase details, estimated rental income, and all anticipated expenses. Be sure to account for vacancy (usually 5-8% of rent) and maintenance reserves (5-10%), as these are often overlooked by beginners. A property that looks profitable with 100% occupancy may lose money once real-world vacancies occur.
function calculateRental() {
// 1. Get Input Values
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 loanTermYears = parseFloat(document.getElementById('rp_term').value);
var monthlyRent = parseFloat(document.getElementById('rp_rent').value);
var vacancyRate = parseFloat(document.getElementById('rp_vacancy').value);
var taxYearly = parseFloat(document.getElementById('rp_tax').value);
var insuranceYearly = parseFloat(document.getElementById('rp_insurance').value);
var mgmtFeePercent = parseFloat(document.getElementById('rp_mgmt').value);
var repairsMonthly = parseFloat(document.getElementById('rp_repairs').value);
var hoaMonthly = parseFloat(document.getElementById('rp_hoa').value);
// Validate inputs
if (isNaN(price) || isNaN(monthlyRent)) {
alert("Please enter valid numbers for Price and Rental Income.");
return;
}
// 2. Calculate Mortgage (P&I)
var downPayment = price * (downPercent / 100);
var loanAmount = price – downPayment;
var monthlyInterest = (interestRate / 100) / 12;
var numPayments = loanTermYears * 12;
var monthlyMortgage = 0;
if (interestRate === 0) {
monthlyMortgage = loanAmount / numPayments;
} else {
monthlyMortgage = loanAmount * (monthlyInterest * Math.pow(1 + monthlyInterest, numPayments)) / (Math.pow(1 + monthlyInterest, numPayments) – 1);
}
// 3. Calculate Income Adjusted for Vacancy
var vacancyLoss = monthlyRent * (vacancyRate / 100);
var effectiveGrossIncome = monthlyRent – vacancyLoss;
// 4. Calculate Operating Expenses
var mgmtFeeAmount = effectiveGrossIncome * (mgmtFeePercent / 100);
var taxMonthly = taxYearly / 12;
var insuranceMonthly = insuranceYearly / 12;
var totalMonthlyExpenses = taxMonthly + insuranceMonthly + mgmtFeeAmount + repairsMonthly + hoaMonthly;
// 5. Calculate Metrics
var noiMonthly = effectiveGrossIncome – totalMonthlyExpenses;
var noiAnnual = noiMonthly * 12;
var cashFlowMonthly = noiMonthly – monthlyMortgage;
var cashFlowAnnual = cashFlowMonthly * 12;
// Cash Invested (Assuming simplified Closing Costs of 0 for this basic calc, or just Down Payment)
var totalCashInvested = downPayment;
var cocRoi = 0;
if (totalCashInvested > 0) {
cocRoi = (cashFlowAnnual / totalCashInvested) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (noiAnnual / price) * 100;
}
// 6. Display Results
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
var percentFormatter = new Intl.NumberFormat('en-US', {
style: 'percent',
minimumFractionDigits: 2
});
document.getElementById('res_noi').innerHTML = formatter.format(noiMonthly);
document.getElementById('res_expenses').innerHTML = formatter.format(totalMonthlyExpenses + vacancyLoss); // Showing expenses + vacancy loss usually helps
document.getElementById('res_mortgage').innerHTML = formatter.format(monthlyMortgage);
var cfMonthEl = document.getElementById('res_monthly_cf');
cfMonthEl.innerHTML = formatter.format(cashFlowMonthly);
cfMonthEl.style.color = cashFlowMonthly >= 0 ? '#27ae60' : '#c0392b';
var cfYearEl = document.getElementById('res_annual_cf');
cfYearEl.innerHTML = formatter.format(cashFlowAnnual);
cfYearEl.style.color = cashFlowAnnual >= 0 ? '#27ae60' : '#c0392b';
document.getElementById('res_coc').innerHTML = cocRoi.toFixed(2) + "%";
document.getElementById('res_cap').innerHTML = capRate.toFixed(2) + "%";
// Show the results box
document.getElementById('rp_results_box').style.display = 'block';
}