Determine the profitability of your real estate investment instantly.
Purchase Information
$
$
$
%
Years
Rental Income
$
%
Monthly Expenses
$
$
$
$
Monthly Financial Summary
Monthly Cash Flow
$0.00
Cash on Cash Return
0.00%
NOI (Monthly)
$0.00
Income Breakdown
Gross Rent
$2,200.00
Vacancy Loss
-$110.00
Effective Gross Income
$2,090.00
Expense Breakdown
Mortgage Payment (P&I)
$1,264.00
Property Tax
$250.00
Insurance
$100.00
HOA & Maintenance
$150.00
Total Monthly Outflow
$1,764.00
Understanding Rental Property Cash Flow
Cash flow is the lifeblood of any rental property investment. It represents the net amount of money moving into or out of your business every month. Positive cash flow means your property is generating profit after all expenses are paid, while negative cash flow indicates that the property is costing you money to hold.
This Rental Property Cash Flow Calculator helps investors analyze deals by breaking down income, operating expenses, and debt service to provide a clear picture of financial performance.
How the Numbers are Calculated
To accurately assess a property, it's crucial to understand the formulas used:
Net Operating Income (NOI): This is your total income minus operating expenses (excluding mortgage payments). It measures the property's potential profitability as a standalone asset.
Cash Flow: Calculated as NOI minus Debt Service (Mortgage Payment). This is what actually hits your bank account.
Cash on Cash Return: This metric compares your annual cash flow to the total cash invested (Down Payment + Closing Costs). It is a percentage that shows the efficiency of your invested capital.
Key Inputs Explained
Vacancy Rate: No property is occupied 100% of the time. A standard conservative estimate is 5-8%, which accounts for turnover periods between tenants.
Operating Expenses: These include taxes, insurance, HOA fees, and maintenance. Many beginners underestimate maintenance costs; setting aside 5-10% of rent for repairs is a prudent strategy.
What is a Good Cash on Cash Return?
While "good" is subjective, many investors target a Cash on Cash (CoC) return of 8-12%. However, in high-appreciation markets, investors might accept a lower CoC (4-6%) in exchange for long-term equity growth. Conversely, in stable markets with lower appreciation, investors often seek higher yields of 12% or more.
Strategies to Improve Cash Flow
If your calculation shows negative or low cash flow, consider these adjustments:
Increase Rent: Are you charging market rates? Small increases can significantly impact the bottom line.
Reduce Expenses: Shop around for cheaper insurance or challenge property tax assessments.
Larger Down Payment: Putting more money down reduces the loan amount and monthly mortgage payment, instantly boosting cash flow (though it may lower CoC return).
function calculateCashFlow() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPayment = parseFloat(document.getElementById('downPayment').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTermYears = parseFloat(document.getElementById('loanTerm').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var propertyTax = parseFloat(document.getElementById('propertyTax').value) || 0;
var insurance = parseFloat(document.getElementById('insurance').value) || 0;
var hoaFees = parseFloat(document.getElementById('hoaFees').value) || 0;
var maintenance = parseFloat(document.getElementById('maintenance').value) || 0;
// 2. Calculate Mortgage (Principal & Interest)
var loanAmount = price – downPayment;
var monthlyRate = (interestRate / 100) / 12;
var totalPayments = loanTermYears * 12;
var monthlyMortgage = 0;
if (loanAmount > 0 && monthlyRate > 0 && totalPayments > 0) {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else if (loanAmount > 0 && monthlyRate === 0) {
monthlyMortgage = loanAmount / totalPayments;
}
// 3. Calculate Income
var vacancyLoss = monthlyRent * (vacancyRate / 100);
var effectiveIncome = monthlyRent – vacancyLoss;
// 4. Calculate Expenses
var operatingExpenses = propertyTax + insurance + hoaFees + maintenance;
var totalMonthlyExpenses = operatingExpenses + monthlyMortgage;
// 5. Calculate Metrics
var noi = effectiveIncome – operatingExpenses; // Net Operating Income
var monthlyCashFlow = effectiveIncome – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var totalCashInvested = downPayment + closingCosts;
var cashOnCash = 0;
if (totalCashInvested > 0) {
cashOnCash = (annualCashFlow / totalCashInvested) * 100;
}
// 6. Format Money Helper
function formatMoney(num) {
return '$' + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}
// 7. Update UI
document.getElementById('resultsArea').style.display = 'block';
// Main Cards
var elCashFlow = document.getElementById('resCashFlow');
elCashFlow.innerText = formatMoney(monthlyCashFlow);
elCashFlow.className = 'result-value ' + (monthlyCashFlow >= 0 ? 'positive' : 'negative');
var elCoc = document.getElementById('resCoc');
elCoc.innerText = cashOnCash.toFixed(2) + '%';
elCoc.className = 'result-value ' + (cashOnCash >= 0 ? 'positive' : 'negative');
document.getElementById('resNoi').innerText = formatMoney(noi);
// Tables – Income
document.getElementById('tableGrossRent').innerText = formatMoney(monthlyRent);
document.getElementById('tableVacancy').innerText = '-' + formatMoney(vacancyLoss);
document.getElementById('tableEffectiveIncome').innerText = formatMoney(effectiveIncome);
// Tables – Expenses
document.getElementById('tableMortgage').innerText = formatMoney(monthlyMortgage);
document.getElementById('tableTax').innerText = formatMoney(propertyTax);
document.getElementById('tableInsurance').innerText = formatMoney(insurance);
document.getElementById('tableOps').innerText = formatMoney(hoaFees + maintenance);
document.getElementById('tableTotalExpenses').innerText = formatMoney(totalMonthlyExpenses);
}