Calculating the potential return on a real estate investment is crucial before signing any contracts. This Rental Property Cash Flow Calculator helps investors determine two critical metrics: Net Monthly Cash Flow and Cash on Cash Return.
What is Net Monthly Cash Flow?
Net Monthly Cash Flow is the money left over after all operating expenses and debt service (mortgage payments) have been paid. Positive cash flow means the property is generating income for you, while negative cash flow means you are paying out of pocket to hold the asset.
The formula used is: Cash Flow = Rental Income – (Mortgage Payment + Taxes + Insurance + HOA + Maintenance + Vacancy Reserves)
What is Cash on Cash Return?
Cash on Cash Return is a metric that measures the annual return on the actual cash invested in the property. Unlike a standard ROI which might look at the total loan value, Cash on Cash focuses strictly on the liquidity you used (Down Payment + Closing Costs).
8-12% is generally considered a solid return for long-term rentals.
15%+ is often found in higher-risk areas or short-term rental strategies.
How to Use This Calculator
Purchase Price: Enter the total cost of the property.
Down Payment (%): The percentage of the price you are paying upfront (typically 20-25% for investment loans).
Interest Rate & Term: Your mortgage details. Current investment rates are often 0.5% – 1% higher than residential rates.
Rental Income: Conservative estimate of monthly rent.
Other Expenses: Sum of property taxes, insurance, HOA fees, and maintenance buffers (usually 10-15% of rent).
function calculateRental() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPct = parseFloat(document.getElementById('downPayment').value);
var rate = parseFloat(document.getElementById('interestRate').value);
var term = parseFloat(document.getElementById('loanTerm').value);
var rent = parseFloat(document.getElementById('rentalIncome').value);
var otherExp = parseFloat(document.getElementById('monthlyExpenses').value);
// 2. Validate Inputs
if (isNaN(price) || isNaN(downPct) || isNaN(rate) || isNaN(term) || isNaN(rent) || isNaN(otherExp)) {
alert("Please enter valid numbers in all fields.");
return;
}
// 3. Calculation Logic
// Loan Calculation
var downPaymentAmount = price * (downPct / 100);
var loanAmount = price – downPaymentAmount;
// Mortgage Payment (P&I) Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyRate = (rate / 100) / 12;
var totalPayments = term * 12;
var mortgagePayment = 0;
if (rate === 0) {
mortgagePayment = loanAmount / totalPayments;
} else {
mortgagePayment = (loanAmount * monthlyRate) / (1 – Math.pow(1 + monthlyRate, -totalPayments));
}
// Total Monthly Expenses (Mortgage + Operating Expenses)
var totalMonthlyExpenses = mortgagePayment + otherExp;
// Net Monthly Cash Flow
var cashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = cashFlow * 12;
// Cash on Cash ROI Formula: (Annual Cash Flow / Total Cash Invested) * 100
// Note: Simplification assumes Cash Invested = Down Payment.
// In reality, closing costs should be added, but for this specific calc we use Down Payment.
var cashInvested = downPaymentAmount;
var roi = 0;
if (cashInvested > 0) {
roi = (annualCashFlow / cashInvested) * 100;
}
// 4. Update UI
var resMortgage = document.getElementById('resMortgage');
var resTotalExp = document.getElementById('resTotalExp');
var resCashFlow = document.getElementById('resCashFlow');
var resROI = document.getElementById('resROI');
var resultsArea = document.getElementById('resultsArea');
// Formatting numbers to Currency
resMortgage.innerHTML = "$" + mortgagePayment.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
resTotalExp.innerHTML = "$" + totalMonthlyExpenses.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
resCashFlow.innerHTML = "$" + cashFlow.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
resROI.innerHTML = roi.toFixed(2) + "%";
// Styling for Positive/Negative Cash Flow
if (cashFlow >= 0) {
resCashFlow.className = "rp-result-value rp-highlight";
} else {
resCashFlow.className = "rp-result-value rp-highlight-neg";
}
// Show Results
resultsArea.style.display = "block";
}