Investing in real estate is a powerful way to build wealth, but the success of any rental property hinges on its numbers. This Rental Property Cash Flow Calculator is designed to help investors determine if a potential property is an asset or a liability. Cash flow is the net amount of money moving into or out of a business or investment at a specific time.
Why Cash Flow Matters
In real estate, cash flow is the profit remaining after all expenses, mortgage payments, and operating costs have been paid.
Positive cash flow means the property generates income every month, providing you with passive income and a buffer for unexpected repairs.
Negative cash flow means you are losing money every month just to hold the property, which is generally risky for long-term investors.
Key Inputs Explained
Purchase Price & Down Payment: Determines your loan amount and initial equity. A larger down payment reduces monthly mortgage costs, increasing cash flow.
Vacancy Rate: Properties aren't rented 365 days a year. It is prudent to budget 5-10% of monthly rent for vacancies between tenants.
Maintenance Reserves: Roofs leak and toilets break. Allocating 5-10% of gross rent for repairs ensures you aren't caught off guard by capital expenditures.
Cash on Cash Return: This metric compares your annual pre-tax cash flow to the total cash invested (down payment + closing costs + rehab). It shows the efficiency of your invested dollars.
How to Interpret Your Results
If your Cash on Cash Return is between 8-12%, the property is generally considered a solid investment in many markets. A return above 15% is excellent. However, always verify that your expense estimates (Taxes, Insurance, HOA) are accurate for the specific location, as underestimating these is the most common mistake new investors make.
function calculateRentalCashFlow() {
// 1. Get Inputs
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 closing = parseFloat(document.getElementById("closingCosts").value);
var rent = parseFloat(document.getElementById("monthlyRent").value);
var taxYearly = parseFloat(document.getElementById("annualTaxes").value);
var insuranceYearly = parseFloat(document.getElementById("annualInsurance").value);
var maintPercent = parseFloat(document.getElementById("maintenancePercent").value);
var vacancyPercent = parseFloat(document.getElementById("vacancyPercent").value);
var hoa = parseFloat(document.getElementById("hoaFees").value);
// 2. Validation
if (isNaN(price) || isNaN(rent) || isNaN(rate) || isNaN(years)) {
alert("Please enter valid numbers for Price, Rent, Interest Rate, and Loan Term.");
return;
}
// Handle optional empty fields as 0
if (isNaN(downPercent)) downPercent = 0;
if (isNaN(closing)) closing = 0;
if (isNaN(taxYearly)) taxYearly = 0;
if (isNaN(insuranceYearly)) insuranceYearly = 0;
if (isNaN(maintPercent)) maintPercent = 0;
if (isNaN(vacancyPercent)) vacancyPercent = 0;
if (isNaN(hoa)) hoa = 0;
// 3. Calculation Logic
// Loan Calculation
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
// Mortgage Payment (Principal & Interest)
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
// i = monthly interest rate, n = total months
var monthlyRate = (rate / 100) / 12;
var totalMonths = years * 12;
var mortgagePayment = 0;
if (rate > 0) {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalMonths)) / (Math.pow(1 + monthlyRate, totalMonths) – 1);
} else {
mortgagePayment = loanAmount / totalMonths;
}
// Monthly Expenses
var taxMonthly = taxYearly / 12;
var insuranceMonthly = insuranceYearly / 12;
var maintMonthly = rent * (maintPercent / 100);
var vacancyMonthly = rent * (vacancyPercent / 100);
var totalMonthlyExpenses = mortgagePayment + taxMonthly + insuranceMonthly + maintMonthly + vacancyMonthly + hoa;
var operatingExpensesOnly = totalMonthlyExpenses – mortgagePayment;
// Cash Flow
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// Cash on Cash Return
var totalCashInvested = downPaymentAmount + closing;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
// 4. Output Display
// Format helper
var fmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
document.getElementById("resMortgage").innerText = fmt.format(mortgagePayment);
// Display total operating expenses + mortgage or just operating? Usually "Expenses" implies outgoing money.
// Let's show total outgoing (Expenses + Mortgage) to match the subtraction for cash flow.
document.getElementById("resExpenses").innerText = fmt.format(totalMonthlyExpenses);
var cfEl = document.getElementById("resMonthlyCashFlow");
cfEl.innerText = fmt.format(monthlyCashFlow);
if (monthlyCashFlow < 0) {
cfEl.classList.add("negative");
} else {
cfEl.classList.remove("negative");
}
var acfEl = document.getElementById("resAnnualCashFlow");
acfEl.innerText = fmt.format(annualCashFlow);
if (annualCashFlow < 0) {
acfEl.classList.add("negative");
} else {
acfEl.classList.remove("negative");
}
document.getElementById("resCashToClose").innerText = fmt.format(totalCashInvested);
var cocEl = document.getElementById("resCoC");
cocEl.innerText = cocReturn.toFixed(2) + "%";
if (cocReturn < 0) {
cocEl.classList.add("negative");
} else {
cocEl.classList.remove("negative");
}
// Show results
document.getElementById("results").style.display = "block";
}