Investing in real estate is one of the most reliable ways to build wealth, but simply buying a property doesn't guarantee profit. The key to successful real estate investing lies in accurate analysis of the numbers. Our Rental Property Cash Flow Calculator helps investors determine the viability of a potential investment by breaking down income, expenses, and returns.
What is Cash Flow?
Cash flow represents the net amount of cash moving in and out of your rental business. In positive cash flow scenarios, the incoming rent covers all expenses—including the mortgage, taxes, insurance, and maintenance—leaving you with profit every month. Negative cash flow means you are losing money on the property just to keep it operating.
Key Metrics Explained
Net Operating Income (NOI): This is your total income minus operating expenses, excluding mortgage payments. It measures the profitability of the property itself, regardless of financing.
Cash on Cash ROI: This metric calculates the annual return you are making on the actual cash you invested (down payment + closing costs + rehab). It is one of the most important metrics for investors because it compares your profit to your out-of-pocket costs.
Cap Rate: The Capitalization Rate is the ratio of Net Operating Income to the property's asset value. It helps compare properties quickly without factoring in the specific loan terms.
Estimating Expenses Accurately
Novice investors often underestimate expenses. Beyond the obvious mortgage and taxes, you must account for:
Vacancy: Properties aren't rented 365 days a year. A 5-8% vacancy allowance is standard.
Maintenance & CapEx: Roofs leak and water heaters break. Setting aside 5-10% of rent ensures you have funds when repairs are needed.
Property Management: Even if you self-manage now, factoring in 8-10% for management ensures the deal still works if you decide to hire a professional later.
What is a Good ROI?
While targets vary by investor and market, a Cash on Cash ROI of 8-12% is generally considered solid for long-term buy-and-hold rentals. However, in high-appreciation markets, investors might accept lower cash flow returns (4-6%) in exchange for future equity growth.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('rc-price').value) || 0;
var downPercent = parseFloat(document.getElementById('rc-down').value) || 0;
var closingCosts = parseFloat(document.getElementById('rc-closing').value) || 0;
var rehabCosts = parseFloat(document.getElementById('rc-rehab').value) || 0;
var interestRate = parseFloat(document.getElementById('rc-rate').value) || 0;
var loanYears = parseFloat(document.getElementById('rc-term').value) || 30;
var monthlyRent = parseFloat(document.getElementById('rc-rent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('rc-vacancy').value) || 0;
var tax = parseFloat(document.getElementById('rc-tax').value) || 0;
var insurance = parseFloat(document.getElementById('rc-insurance').value) || 0;
var hoa = parseFloat(document.getElementById('rc-hoa').value) || 0;
var maintPercent = parseFloat(document.getElementById('rc-maintenance').value) || 0;
var mgmtPercent = parseFloat(document.getElementById('rc-management').value) || 0;
// 2. Calculate Initial Investment
var downPaymentAmt = price * (downPercent / 100);
var loanAmount = price – downPaymentAmt;
var totalInitialCash = downPaymentAmt + closingCosts + rehabCosts;
// 3. Calculate Mortgage Payment (Principal & Interest)
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = loanYears * 12;
var mortgagePayment = 0;
if (interestRate === 0) {
mortgagePayment = loanAmount / numberOfPayments;
} else {
// M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var mathPow = Math.pow(1 + monthlyRate, numberOfPayments);
mortgagePayment = loanAmount * (monthlyRate * mathPow) / (mathPow – 1);
}
if (isNaN(mortgagePayment) || !isFinite(mortgagePayment)) {
mortgagePayment = 0;
}
// 4. Calculate Operating Expenses
var vacancyCost = monthlyRent * (vacancyRate / 100);
var maintCost = monthlyRent * (maintPercent / 100);
var mgmtCost = monthlyRent * (mgmtPercent / 100);
var totalOperatingExpenses = tax + insurance + hoa + vacancyCost + maintCost + mgmtCost;
var totalExpensesWithMortgage = totalOperatingExpenses + mortgagePayment;
// 5. Calculate Metrics
var noi = (monthlyRent – totalOperatingExpenses) * 12; // Annual NOI
var monthlyCashFlow = monthlyRent – totalExpensesWithMortgage;
var annualCashFlow = monthlyCashFlow * 12;
var cashOnCash = 0;
if (totalInitialCash > 0) {
cashOnCash = (annualCashFlow / totalInitialCash) * 100;
}
var capRate = 0;
if (price > 0) {
capRate = (noi / price) * 100;
}
// 6. Display Results
document.getElementById('res-mortgage').textContent = '$' + mortgagePayment.toFixed(2);
document.getElementById('res-expenses').textContent = '$' + totalExpensesWithMortgage.toFixed(2);
document.getElementById('res-noi').textContent = '$' + (noi / 12).toFixed(2) + ' / mo';
var cfElement = document.getElementById('res-monthly-cf');
cfElement.textContent = '$' + monthlyCashFlow.toFixed(2);
if (monthlyCashFlow >= 0) {
cfElement.style.color = '#2f855a'; // Green
} else {
cfElement.style.color = '#c53030'; // Red
}
var annualCfElement = document.getElementById('res-annual-cf');
annualCfElement.textContent = '$' + annualCashFlow.toFixed(2);
if (annualCashFlow < 0) annualCfElement.classList.add('negative');
else annualCfElement.classList.remove('negative');
var cocElement = document.getElementById('res-roi');
cocElement.textContent = cashOnCash.toFixed(2) + '%';
if (cashOnCash < 0) cocElement.classList.add('negative');
else cocElement.classList.remove('negative');
document.getElementById('res-cap').textContent = capRate.toFixed(2) + '%';
document.getElementById('calc-results').style.display = 'block';
}