Investing in real estate is one of the most reliable ways to build wealth, but it requires precise calculation. This Rental Property Cash Flow Calculator helps investors determine if a property will generate a profit (positive cash flow) or cost money to hold (negative cash flow). It accounts for not just the mortgage, but the "hidden" costs that often turn a good deal into a bad one.
Key Metrics Explained
Cash Flow: This is your profit after all expenses are paid. It is calculated as Rental Income – (Mortgage + Operating Expenses). A positive cash flow means the property pays for itself and puts money in your pocket.
Net Operating Income (NOI): This measures the profitability of the property excluding financing costs. It is calculated as Income – Operating Expenses (excluding mortgage payments). This metric is crucial for calculating the Cap Rate.
Cap Rate (Capitalization Rate): This represents the natural rate of return on the property if it were bought in cash. It is calculated as (Annual NOI / Purchase Price) × 100. It helps compare different properties regardless of how they are financed.
Cash on Cash Return (CoC): This measures the return on the actual cash you invested (down payment + closing costs). It is calculated as (Annual Cash Flow / Total Cash Invested) × 100. This is often considered the most important metric for leverage investors.
Understanding Variable Expenses
Many new investors make the mistake of only calculating the mortgage, tax, and insurance. To get a realistic picture of your cash flow, you must account for:
Vacancy: Properties won't be rented 365 days a year. Budgeting 5-8% helps cover turnover periods.
Maintenance & Repairs: Things break. Budgeting 5-10% of rent ensures you have funds for leaky faucets or broken appliances.
CapEx (Capital Expenditures): These are big-ticket items like roofs, HVAC systems, or flooring replacements. Setting aside 5-10% ensures you aren't bankrupted by a major failure.
Example Scenario
If you purchase a property for $250,000 with 20% down ($50,000) and rent it for $2,500/month, your expenses (mortgage, taxes, insurance, repairs) might total $2,100/month. This leaves you with $400/month in positive cash flow. While $400 might seem small, that equals $4,800/year, which is a 9.6% return on your $50,000 down payment—often higher than the stock market, plus you gain equity appreciation.
function calculateRentalCashFlow() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('rpcPurchasePrice').value) || 0;
var downPercent = parseFloat(document.getElementById('rpcDownPayment').value) || 0;
var interestRate = parseFloat(document.getElementById('rpcInterestRate').value) || 0;
var termYears = parseFloat(document.getElementById('rpcLoanTerm').value) || 0;
var rentalIncome = parseFloat(document.getElementById('rpcRentalIncome').value) || 0;
var yearlyTax = parseFloat(document.getElementById('rpcPropertyTax').value) || 0;
var yearlyIns = parseFloat(document.getElementById('rpcInsurance').value) || 0;
var monthlyHoa = parseFloat(document.getElementById('rpcHoa').value) || 0;
var vacancyRate = parseFloat(document.getElementById('rpcVacancy').value) || 0;
var repairRate = parseFloat(document.getElementById('rpcRepairs').value) || 0;
var capexRate = parseFloat(document.getElementById('rpcCapex').value) || 0;
var mgtRate = parseFloat(document.getElementById('rpcManagement').value) || 0;
// 2. Calculate Mortgage (P&I)
var downPaymentAmt = price * (downPercent / 100);
var loanAmount = price – downPaymentAmt;
var monthlyRate = interestRate / 100 / 12;
var numberOfPayments = termYears * 12;
var monthlyPI = 0;
if (loanAmount > 0 && interestRate > 0) {
monthlyPI = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
} else if (loanAmount > 0 && interestRate === 0) {
monthlyPI = loanAmount / numberOfPayments;
}
// 3. Calculate Monthly Operating Expenses
var monthlyTax = yearlyTax / 12;
var monthlyIns = yearlyIns / 12;
// Variable costs based on rent
var vacancyCost = rentalIncome * (vacancyRate / 100);
var repairCost = rentalIncome * (repairRate / 100);
var capexCost = rentalIncome * (capexRate / 100);
var mgtCost = rentalIncome * (mgtRate / 100);
var totalFixedExpenses = monthlyTax + monthlyIns + monthlyHoa;
var totalVariableExpenses = vacancyCost + repairCost + capexCost + mgtCost;
var totalOperatingExpenses = totalFixedExpenses + totalVariableExpenses; // Without mortgage
var totalExpensesIncludingMortgage = totalOperatingExpenses + monthlyPI;
// 4. Calculate Key Metrics
var monthlyCashFlow = rentalIncome – totalExpensesIncludingMortgage;
var annualCashFlow = monthlyCashFlow * 12;
// NOI = Annual Income – Annual Operating Expenses (Excluding Mortgage)
var annualNOI = (rentalIncome * 12) – (totalOperatingExpenses * 12);
// Cap Rate = Annual NOI / Price
var capRate = 0;
if (price > 0) {
capRate = (annualNOI / price) * 100;
}
// Cash on Cash Return = Annual Cash Flow / Total Cash Invested
// Assuming Cash Invested = Down Payment (simplification for this calculator)
var cocReturn = 0;
if (downPaymentAmt > 0) {
cocReturn = (annualCashFlow / downPaymentAmt) * 100;
}
// 5. Update UI
document.getElementById('rpc-results').style.display = 'block';
// Formatter
var currencyFmt = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
var percentFmt = new Intl.NumberFormat('en-US', { style: 'percent', minimumFractionDigits: 2 });
document.getElementById('displayGrossRent').innerHTML = currencyFmt.format(rentalIncome);
document.getElementById('displayMortgage').innerHTML = "-" + currencyFmt.format(monthlyPI);
document.getElementById('displayFixedExp').innerHTML = "-" + currencyFmt.format(totalFixedExpenses);
document.getElementById('displayVarExp').innerHTML = "-" + currencyFmt.format(totalVariableExpenses);
var cfElement = document.getElementById('displayCashFlow');
cfElement.innerHTML = currencyFmt.format(monthlyCashFlow);
if(monthlyCashFlow >= 0) {
cfElement.style.color = "#27ae60";
} else {
cfElement.style.color = "#c0392b";
}
document.getElementById('displayCoC').innerHTML = cocReturn.toFixed(2) + "%";
document.getElementById('displayCapRate').innerHTML = capRate.toFixed(2) + "%";
document.getElementById('displayNOI').innerHTML = currencyFmt.format(annualNOI);
}