Investing in real estate is one of the most reliable ways to build wealth, but simply buying a property doesn't guarantee profit. The most critical metric for buy-and-hold investors is Cash Flow. This calculator helps you determine whether a prospective rental property will put money in your pocket every month or drain your resources.
How This Calculator Works
We analyze four main components to determine your investment viability:
Mortgage Costs: The principal and interest payments based on your loan amount, interest rate, and term.
Operating Expenses: These include taxes, insurance, HOA fees, and property management costs.
Reserves: Smart investors account for "hidden" costs like vacancy (when the unit is empty) and maintenance/CapEx (saving for future repairs like a new roof).
Investment Metrics: We calculate ROI specifically using Cash-on-Cash Return and Cap Rate to help you compare this investment against others.
Key Definitions for Investors
Net Operating Income (NOI)
NOI is the total income the property generates minus all necessary operating expenses. Importantly, NOI excludes mortgage payments. It is a pure measure of the property's efficiency as an income generator, regardless of how it is financed.
Cash on Cash Return (CoC)
This is arguably the most important metric for investors using leverage. It measures the annual pre-tax cash flow relative to the total cash invested (down payment + closing costs + rehab costs). A good Cash on Cash return varies by market, but many investors target 8-12%.
The 50% Rule
A common "rule of thumb" in real estate is that operating expenses (excluding the mortgage) will typically average about 50% of the gross rent over time. While this calculator uses your specific inputs, keep the 50% rule in mind to ensure you aren't underestimating expenses like repairs and vacancy.
function calculateRentalCashFlow() {
// 1. Get Inputs
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPct = parseFloat(document.getElementById('downPaymentPercent').value) || 0;
var intRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTerm = parseFloat(document.getElementById('loanTerm').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var annualTax = parseFloat(document.getElementById('annualTax').value) || 0;
var annualInsurance = parseFloat(document.getElementById('annualInsurance').value) || 0;
var hoaFee = parseFloat(document.getElementById('hoaFee').value) || 0;
var vacancyRate = parseFloat(document.getElementById('vacancyRate').value) || 0;
var repairRate = parseFloat(document.getElementById('repairRate').value) || 0;
var managementFee = parseFloat(document.getElementById('managementFee').value) || 0;
// 2. Calculate Mortgage (P&I)
var downPaymentAmt = purchasePrice * (downPct / 100);
var loanAmount = purchasePrice – downPaymentAmt;
var monthlyRate = (intRate / 100) / 12;
var totalPayments = loanTerm * 12;
var monthlyPI = 0;
if (monthlyRate > 0) {
monthlyPI = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, totalPayments)) / (Math.pow(1 + monthlyRate, totalPayments) – 1);
} else {
monthlyPI = loanAmount / totalPayments;
}
// 3. Calculate Monthly Expenses
var monthlyTax = annualTax / 12;
var monthlyIns = annualInsurance / 12;
var monthlyVacancyCost = monthlyRent * (vacancyRate / 100);
var monthlyRepairCost = monthlyRent * (repairRate / 100);
var monthlyMgmtCost = monthlyRent * (managementFee / 100);
var monthlyOperatingExpenses = monthlyTax + monthlyIns + hoaFee + monthlyVacancyCost + monthlyRepairCost + monthlyMgmtCost;
var totalMonthlyExpenses = monthlyOperatingExpenses + monthlyPI;
// 4. Calculate Income & Cash Flow
var monthlyCashFlow = monthlyRent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var annualNOI = (monthlyRent – monthlyOperatingExpenses) * 12;
// 5. Calculate Returns
var totalInitialCash = downPaymentAmt + closingCosts;
var cashOnCash = 0;
if (totalInitialCash > 0) {
cashOnCash = (annualCashFlow / totalInitialCash) * 100;
}
var capRate = 0;
if (purchasePrice > 0) {
capRate = (annualNOI / purchasePrice) * 100;
}
// 6. Formatting Helper
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
// 7. Display Results
document.getElementById('rpcResults').style.display = 'block';
document.getElementById('resIncome').innerText = formatter.format(monthlyRent);
document.getElementById('resMortgage').innerText = formatter.format(monthlyPI);
document.getElementById('resExpenses').innerText = formatter.format(monthlyOperatingExpenses);
document.getElementById('resTotalExpenses').innerText = formatter.format(totalMonthlyExpenses);
document.getElementById('resCashFlow').innerText = formatter.format(monthlyCashFlow);
document.getElementById('resInitialCash').innerText = formatter.format(totalInitialCash);
document.getElementById('resNOI').innerText = formatter.format(annualNOI);
document.getElementById('resCoC').innerText = cashOnCash.toFixed(2) + '%';
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + '%';
// Styling logic for positive/negative cash flow
var cfBox = document.getElementById('cashFlowBox');
if (monthlyCashFlow >= 0) {
cfBox.className = 'rpc-highlight';
} else {
cfBox.className = 'rpc-highlight negative';
}
}