Analyze the profitability of your real estate investment instantly.
Monthly Income
Laundry, storage, parking fees, etc.
Fixed Expenses
Variable Expenses (Estimates)
Standard is 5-8%
Reserve for minor fixes
Roof, HVAC, Water Heater
Usually 8-10% if hired
Total Monthly Income:$0.00
Total Monthly Expenses:$0.00
Net Operating Income (NOI):$0.00
50% Rule Estimate (Ref):$0.00
Net Monthly Cash Flow:$0.00
Annual Cash Flow:$0.00
Understanding Rental Property Cash Flow
Cash flow is the lifeblood of any rental property investment. It represents the net amount of money moving in and out of your business after all expenses have been paid. A positive cash flow indicates that your property is generating profit, while a negative cash flow means the property is costing you money to hold.
How to Calculate Rental Cash Flow
The basic formula for calculating rental property cash flow is straightforward:
Cash Flow = Total Income – Total Expenses
However, the accuracy of your calculation depends entirely on how well you account for expenses. Many new investors make the mistake of only subtracting the mortgage payment from the rent, ignoring critical costs like vacancy reserves, repairs, and capital expenditures (CapEx).
Key Inputs Explained
Gross Monthly Rent: The market rent you expect to collect from tenants.
Vacancy Rate: Properties won't be occupied 365 days a year. A safe estimate is usually 5% to 8% of the gross rent to account for turnover periods.
Repairs & Maintenance: Ongoing costs for fixing leaks, painting, or minor wear and tear. Budgeting 5-10% ensures you aren't caught off guard.
Capital Expenditures (CapEx): Big-ticket items like replacing a roof, HVAC system, or water heater. These don't happen every month, but you must save a percentage of rent (typically 5-10%) to pay for them when they inevitably fail.
Property Management: If you hire a professional company, they typically charge 8-10% of the collected rent. Even if you self-manage, it is wise to factor this cost in to see if the deal still works if you decide to outsource later.
What is a Good Cash Flow?
There is no "one size fits all" answer, as it depends on your investment goals and the market. However, many investors follow the $100/door rule, aiming for at least $100 in clear profit per unit per month. More aggressive investors may look for $200-$300 per month per property to ensure a buffer against unexpected costs.
The 50% Rule
As a quick "back of the napkin" check, investors often use the 50% rule. This rule states that approximately 50% of your gross rental income will go toward operating expenses (excluding the mortgage). If your mortgage payment is more than 50% of the rent, the property likely won't cash flow effectively.
function calculateCashFlow() {
// 1. Get Income Values
var grossRent = parseFloat(document.getElementById('grossRent').value);
var otherIncome = parseFloat(document.getElementById('otherIncome').value);
// Validate main input
if (isNaN(grossRent) || grossRent < 0) {
alert("Please enter a valid Gross Monthly Rent.");
return;
}
if (isNaN(otherIncome)) otherIncome = 0;
var totalIncome = grossRent + otherIncome;
// 2. Get Fixed Expenses
var mortgage = parseFloat(document.getElementById('mortgagePayment').value);
var taxes = parseFloat(document.getElementById('propertyTax').value);
var insurance = parseFloat(document.getElementById('insurance').value);
var hoa = parseFloat(document.getElementById('hoaFees').value);
if (isNaN(mortgage)) mortgage = 0;
if (isNaN(taxes)) taxes = 0;
if (isNaN(insurance)) insurance = 0;
if (isNaN(hoa)) hoa = 0;
var fixedExpenses = mortgage + taxes + insurance + hoa;
// 3. Calculate Variable Expenses based on Percentages of Gross Rent
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value);
var repairsRate = parseFloat(document.getElementById('repairsRate').value);
var capexRate = parseFloat(document.getElementById('capexRate').value);
var mgmtRate = parseFloat(document.getElementById('managementRate').value);
if (isNaN(vacancyRate)) vacancyRate = 0;
if (isNaN(repairsRate)) repairsRate = 0;
if (isNaN(capexRate)) capexRate = 0;
if (isNaN(mgmtRate)) mgmtRate = 0;
var vacancyCost = grossRent * (vacancyRate / 100);
var repairsCost = grossRent * (repairsRate / 100);
var capexCost = grossRent * (capexRate / 100);
var mgmtCost = grossRent * (mgmtRate / 100);
var variableExpenses = vacancyCost + repairsCost + capexCost + mgmtCost;
// 4. Totals
var totalExpenses = fixedExpenses + variableExpenses;
var cashFlow = totalIncome – totalExpenses;
var annualCashFlow = cashFlow * 12;
// NOI calculation (Total Income – Operating Expenses excluding financing)
// Mortgage includes principal and interest. NOI excludes P&I.
// Operating Expenses = Total Expenses – Mortgage
var operatingExpenses = totalExpenses – mortgage;
var noi = totalIncome – operatingExpenses;
// 50% Rule Calculation (Operating expenses usually ~50% of rent)
// Estimated Cashflow = (Rent * 0.5) – Mortgage
var rule50Est = (grossRent * 0.5) – mortgage;
// 5. Display Results
var resultsDiv = document.getElementById('results-area');
resultsDiv.style.display = 'block';
document.getElementById('displayTotalIncome').innerText = '$' + totalIncome.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
document.getElementById('displayTotalExpenses').innerText = '$' + totalExpenses.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
document.getElementById('displayNOI').innerText = '$' + noi.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
document.getElementById('display50Rule').innerText = '$' + rule50Est.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
var cfDisplay = document.getElementById('displayCashFlow');
cfDisplay.innerText = '$' + cashFlow.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
var annualCfDisplay = document.getElementById('displayAnnualCashFlow');
annualCfDisplay.innerText = '$' + annualCashFlow.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
// Visual styling for negative/positive
if (cashFlow < 0) {
cfDisplay.classList.add('negative-cashflow');
annualCfDisplay.classList.add('negative-cashflow');
} else {
cfDisplay.classList.remove('negative-cashflow');
annualCfDisplay.classList.remove('negative-cashflow');
}
}