Breakdown:
Monthly Mortgage Payment: $0.00
Total Monthly Expenses: $0.00
Total Cash Needed to Close: $0.00
Understanding Rental Property Cash Flow Analysis
Investing in real estate is one of the most reliable ways to build wealth, but the difference between a profitable asset and a money pit often comes down to the numbers. This Rental Property Cash Flow Calculator helps investors analyze deals quickly and accurately.
What is Cash Flow in Real Estate?
Cash flow is the net amount of money moving into and out of a business at a specific point in time. For rental properties, it is calculated as:
Cash Flow = Total Income – Total Expenses
Positive cash flow means the property generates more revenue than it costs to operate, putting money in your pocket every month. Negative cash flow implies you are losing money to hold the property.
Key Metrics Analyzed by This Calculator
Net Operating Income (NOI): The annual income generated by an income-producing property after deducting all expenses that are incurred from operations (excluding mortgage payments).
Cap Rate (Capitalization Rate): A metric used to evaluate the profitability of an investment independent of financing. It is calculated as NOI / Purchase Price. A higher cap rate generally indicates higher risk and higher potential return.
Cash on Cash Return (CoC): This measures the annual return the investor made on the property in relation to the amount of mortgage paid during the same year. It is effectively the cash yield on the actual cash invested.
How to Estimate Expenses Properly
One of the biggest mistakes new investors make is underestimating expenses. Always account for:
Vacancy: Properties won't be occupied 365 days a year. A standard 5-8% vacancy rate buffer is recommended.
Maintenance: Setting aside 5-10% of monthly rent for future repairs (HVAC, roof, plumbing) is crucial for long-term sustainability.
Property Management: Even if you plan to self-manage, accounting for an 8-10% management fee ensures the deal still works if you later decide to hire a professional manager.
Pro Tip: Focus on "Cash on Cash Return" if you are leveraging debt (using a mortgage). This metric gives you the truest picture of how hard your actual invested dollars are working for you.
function calculateROI() {
// 1. Get Inputs
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value);
var downPaymentPercent = parseFloat(document.getElementById('downPayment').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var rehabCosts = parseFloat(document.getElementById('rehabCosts').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var loanTermYears = parseInt(document.getElementById('loanTerm').value);
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value);
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value);
var annualPropTax = parseFloat(document.getElementById('propertyTax').value);
var annualInsurance = parseFloat(document.getElementById('insurance').value);
var monthlyHOA = parseFloat(document.getElementById('hoa').value);
var maintPercent = parseFloat(document.getElementById('maintenance').value);
var mgmtPercent = parseFloat(document.getElementById('management').value);
// Validation to prevent NaN errors
if (isNaN(purchasePrice) || isNaN(monthlyRent)) {
alert("Please enter valid numbers for Price and Rent.");
return;
}
// 2. Calculate Initial Investment
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var totalCashInvested = downPaymentAmount + closingCosts + rehabCosts;
// 3. Calculate Mortgage (Principal + Interest)
var monthlyInterestRate = (interestRate / 100) / 12;
var numberOfPayments = loanTermYears * 12;
var monthlyMortgage = 0;
if (interestRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
monthlyMortgage = loanAmount * (monthlyInterestRate * Math.pow(1 + monthlyInterestRate, numberOfPayments)) / (Math.pow(1 + monthlyInterestRate, numberOfPayments) – 1);
}
// 4. Calculate Income
var vacancyLoss = monthlyRent * (vacancyRate / 100);
var effectiveGrossIncome = monthlyRent – vacancyLoss;
// 5. Calculate Operating Expenses
var monthlyTax = annualPropTax / 12;
var monthlyInsurance = annualInsurance / 12;
var maintenanceCost = monthlyRent * (maintPercent / 100);
var mgmtCost = monthlyRent * (mgmtPercent / 100);
var totalMonthlyExpenses = monthlyTax + monthlyInsurance + monthlyHOA + maintenanceCost + mgmtCost;
// 6. Calculate Metrics
var monthlyNOI = effectiveGrossIncome – totalMonthlyExpenses;
var monthlyCashFlow = monthlyNOI – monthlyMortgage;
var annualNOI = monthlyNOI * 12;
var annualCashFlow = monthlyCashFlow * 12;
var capRate = (annualNOI / purchasePrice) * 100;
var cashOnCash = (annualCashFlow / totalCashInvested) * 100;
// 7. Display Results
document.getElementById('resultsSection').style.display = "block";
// Helper to format currency
var fmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('resCashFlow').innerHTML = fmt.format(monthlyCashFlow);
document.getElementById('resCashFlow').className = monthlyCashFlow >= 0 ? "value positive" : "value negative";
document.getElementById('resCoC').innerHTML = cashOnCash.toFixed(2) + "%";
document.getElementById('resCoC').className = cashOnCash >= 0 ? "value positive" : "value negative";
document.getElementById('resCapRate').innerHTML = capRate.toFixed(2) + "%";
document.getElementById('resNOI').innerHTML = fmt.format(monthlyNOI); // Monthly NOI shown usually in simple breakdown, or annual. Label implies value. Let's show Monthly to match context or Annual? Usually NOI is discussed annually, but the card says "Net Operating Income". I will show Monthly to align with Cash Flow, or Annual? Let's show Annual for standard definition.
// Actually, let's stick to Annual NOI for the main card as it feeds Cap Rate.
document.getElementById('resNOI').innerHTML = fmt.format(annualNOI) + " / yr";
// Breakdown text
document.getElementById('resMortgage').innerHTML = fmt.format(monthlyMortgage);
document.getElementById('resExpenses').innerHTML = fmt.format(totalMonthlyExpenses);
document.getElementById('resTotalCash').innerHTML = fmt.format(totalCashInvested);
}