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 is ensuring positive cash flow—the money left over after all expenses are paid. Our Rental Property Cash Flow Calculator helps you evaluate whether a potential deal will be an asset or a liability.
How We Calculate Cash Flow
This calculator breaks down the finances of a rental property into three core components:
Gross Income: The total rent collected, adjusted for vacancy (periods where the property sits empty).
Operating Expenses: Costs required to run the property, including property taxes, insurance, maintenance, property management fees, and HOA dues.
Debt Service: The monthly mortgage principal and interest payments based on your loan terms.
The formula used is: Cash Flow = (Rental Income – Vacancy Loss) – (Operating Expenses + Mortgage Payment).
Key Metrics Defined
Beyond simple cash flow, this tool calculates two critical metrics for investors:
1. Cap Rate (Capitalization Rate)
The Cap Rate measures the natural rate of return of the property assuming you bought it in cash. It is calculated by dividing the Net Operating Income (NOI) by the Purchase Price. A higher Cap Rate generally indicates a better return, though often comes with higher risk.
2. Cash-on-Cash Return (CoC ROI)
This is arguably the most important metric for leveraged investors. It measures the annual cash flow relative to the actual cash you invested (Down Payment + Closing Costs). For example, if you invest $50,000 cash to buy a property and it generates $5,000 in positive cash flow per year, your CoC ROI is 10%.
Interpreting Your Results
If your Monthly Cash Flow is negative, the property is a liability that will drain your bank account every month. Investors usually aim for at least $100-$200 per door in positive cash flow. Similarly, a Cash-on-Cash ROI between 8% and 12% is typically considered a solid return in the current real estate market, outpacing average stock market dividends.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var rate = parseFloat(document.getElementById('interestRate').value);
var years = parseFloat(document.getElementById('loanTerm').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var vacancyPercent = parseFloat(document.getElementById('vacancyRate').value);
var expenses = parseFloat(document.getElementById('monthlyExpenses').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
// Validation
if (isNaN(price) || isNaN(downPercent) || isNaN(rate) || isNaN(years) || isNaN(rent) || isNaN(expenses)) {
alert("Please enter valid numbers for all fields.");
return;
}
// 2. Calculate Loan Details
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
// Monthly Interest Rate
var monthlyRate = (rate / 100) / 12;
var numberOfPayments = years * 12;
// Mortgage Payment Formula (Principal + Interest)
// M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var mortgagePayment = 0;
if (rate === 0) {
mortgagePayment = loanAmount / numberOfPayments;
} else {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
}
// 3. Calculate Income & Expenses
var vacancyLoss = rent * (vacancyPercent / 100);
var effectiveGrossIncome = rent – vacancyLoss;
var totalMonthlyExpenses = expenses + mortgagePayment; // OpEx + Debt Service
// 4. Calculate Metrics
var monthlyCashFlow = effectiveGrossIncome – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var totalCashInvested = downPaymentAmount + closingCosts;
// Net Operating Income (NOI) = Income – Operating Expenses (NOT including mortgage)
var monthlyNOI = effectiveGrossIncome – expenses;
var annualNOI = monthlyNOI * 12;
// ROI Calculations
var capRate = (annualNOI / price) * 100;
var cocROI = (annualCashFlow / totalCashInvested) * 100;
// 5. Update UI
document.getElementById('results').style.display = 'block';
// Helper to format currency
var fmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById('displayMortgage').innerHTML = fmt.format(mortgagePayment);
document.getElementById('displayNOI').innerHTML = fmt.format(monthlyNOI);
document.getElementById('displayCashToClose').innerHTML = fmt.format(totalCashInvested);
// Handle Cash Flow Color
var cfEl = document.getElementById('displayCashFlow');
cfEl.innerHTML = fmt.format(monthlyCashFlow);
cfEl.className = monthlyCashFlow >= 0 ? "result-value positive" : "result-value negative";
document.getElementById('displayCapRate').innerHTML = capRate.toFixed(2) + "%";
var cocEl = document.getElementById('displayCOC');
cocEl.innerHTML = cocROI.toFixed(2) + "%";
cocEl.className = cocROI >= 0 ? "result-value positive" : "result-value negative";
}