Cash flow is the lifeblood of any rental real estate investment. It represents the net income remaining after all mortgage payments and operating expenses have been paid. Positive cash flow ensures the property pays for itself and generates profit, while negative cash flow means you are losing money every month.
How to Calculate Cash Flow
The formula for rental property cash flow is straightforward but requires accuracy in estimating expenses:
Gross Income: Total rent collected plus any other income (laundry, parking, etc.).
Operating Expenses: Property taxes, insurance, HOA fees, repairs, vacancy reserves, and property management.
Debt Service: The monthly principal and interest payment on your mortgage.
This metric measures the annual return on the actual cash you invested (down payment + closing costs + initial repairs). It is calculated as:
(Annual Cash Flow / Total Cash Invested) × 100
Many investors aim for a CoC return of 8-12% or higher, depending on the market and risk level.
Cap Rate (Capitalization Rate)
Cap Rate measures the natural rate of return of the property assuming it was bought with all cash (no mortgage). It helps compare the profitability of different properties regardless of financing.
(Net Operating Income / Purchase Price) × 100
The 50% Rule
A common "rule of thumb" for quick estimation is the 50% rule, which suggests that operating expenses (excluding the mortgage) will average about 50% of the gross rental income over time. Our calculator allows you to input specific percentages for repairs, vacancy, and CapEx to get a more precise number than this rough estimate.
function calculateCashFlow() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPmt = parseFloat(document.getElementById('downPayment').value) || 0;
var rate = parseFloat(document.getElementById('interestRate').value) || 0;
var years = parseFloat(document.getElementById('loanTerm').value) || 30;
var closing = parseFloat(document.getElementById('closingCosts').value) || 0;
var rent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var taxYear = parseFloat(document.getElementById('propertyTax').value) || 0;
var insYear = parseFloat(document.getElementById('insurance').value) || 0;
var hoa = parseFloat(document.getElementById('hoaFee').value) || 0;
var vacPct = parseFloat(document.getElementById('vacancyRate').value) || 0;
var repPct = parseFloat(document.getElementById('repairRate').value) || 0;
var capexPct = parseFloat(document.getElementById('capexRate').value) || 0;
var mgmtPct = parseFloat(document.getElementById('managementRate').value) || 0;
// 2. Calculate Mortgage (P & I)
var loanAmount = price – downPmt;
var monthlyRate = (rate / 100) / 12;
var numberOfPayments = years * 12;
var mortgagePayment = 0;
if (loanAmount > 0) {
if (rate === 0) {
mortgagePayment = loanAmount / numberOfPayments;
} else {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
}
}
// 3. Calculate Monthly Expenses
var taxMonth = taxYear / 12;
var insMonth = insYear / 12;
// Variable expenses as % of rent
var vacancyCost = rent * (vacPct / 100);
var repairCost = rent * (repPct / 100);
var capexCost = rent * (capexPct / 100);
var mgmtCost = rent * (mgmtPct / 100);
var totalVariable = vacancyCost + repairCost + capexCost + mgmtCost;
var fixedExpenses = taxMonth + insMonth + hoa;
var totalOperatingExpenses = fixedExpenses + totalVariable; // Excluding mortgage
var totalMonthlyExpenses = totalOperatingExpenses + mortgagePayment;
// 4. Calculate Key Metrics
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var totalCashInvested = downPmt + closing;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// Cap Rate = (NOI / Price) * 100
// NOI = Rent – Operating Expenses (Not including mortgage)
var monthlyNOI = rent – totalOperatingExpenses;
var annualNOI = monthlyNOI * 12;
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// 5. Update UI
function fmtMoney(num) {
return '$' + num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
function fmtPct(num) {
return num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + '%';
}
document.getElementById('resCashFlow').innerHTML = fmtMoney(monthlyCashFlow);
document.getElementById('resCoc').innerHTML = fmtPct(cocReturn);
document.getElementById('resCapRate').innerHTML = fmtPct(capRate);
document.getElementById('resIncome').innerHTML = fmtMoney(rent);
document.getElementById('resMortgage').innerHTML = fmtMoney(mortgagePayment);
document.getElementById('resFixedExp').innerHTML = fmtMoney(fixedExpenses);
document.getElementById('resVarExp').innerHTML = fmtMoney(totalVariable);
document.getElementById('resTotalExp').innerHTML = fmtMoney(totalMonthlyExpenses);
document.getElementById('resNetFlow').innerHTML = fmtMoney(monthlyCashFlow);
// Styling for positive/negative flow
var highlight = document.getElementById('highlightRow');
var flowVal = document.getElementById('resCashFlow');
if (monthlyCashFlow >= 0) {
highlight.className = 'rpc-result-row highlight';
flowVal.style.color = '#27ae60';
} else {
highlight.className = 'rpc-result-row highlight negative';
flowVal.style.color = '#c0392b';
}
document.getElementById('resultsArea').style.display = 'block';
}