Analyze potential real estate investments accurately. Determine your monthly cash flow, Cap Rate, and Cash on Cash Return to make smarter buying decisions.
Investment Analyzer
Purchase & Loan Details
Income & Expenses
Please enter valid positive numbers for all fields.
Analysis Results
Est. Monthly Cash Flow$0.00
Net Operating Income (NOI – Annual)$0.00
Cap Rate0.00%
Cash on Cash Return0.00%
Monthly Mortgage Payment (P&I)$0.00
Total Monthly Expenses$0.00
Why Use a Rental Property Cash Flow Calculator?
Successful real estate investing relies on numbers, not emotions. A Rental Property Cash Flow Calculator helps investors determine the profitability of a potential purchase before signing any contracts. By inputting specific data points like purchase price, expected rent, and operating expenses, you can predict whether a property will be an asset that puts money in your pocket or a liability that drains it.
Key Metrics Explained
Understanding the output of your analysis is crucial for evaluating deals:
Cash Flow: This is your profit after all bills are paid. It is calculated as Total Income – Total Expenses. Positive cash flow ensures the property pays for itself and generates passive income.
Net Operating Income (NOI): This represents the annual profitability of the property irrespective of financing. It is calculated as Gross Income – Operating Expenses (excluding mortgage payments).
Cap Rate (Capitalization Rate): Calculated as (NOI / Purchase Price) × 100. It measures the natural rate of return on the property. A higher Cap Rate generally indicates a better return, though often with higher risk.
Cash on Cash Return (CoC): This measures the return on the actual cash you invested (Down Payment + Closing Costs). It is the most important metric for investors using leverage (mortgages).
How to Improve Cash Flow
If the calculator shows a negative or low cash flow, consider these strategies:
Negotiate Price: Lowering the purchase price reduces your loan amount and monthly mortgage payment.
Increase Rent: Research local market rates or consider value-add renovations to justify higher rent.
Shop for Financing: A lower interest rate or a longer loan term (e.g., 30 years vs. 15 years) can significantly lower monthly obligations.
Reduce Vacancy: High vacancy rates kill returns. Ensure you factor in a realistic vacancy buffer (typically 5-8%).
Frequently Asked Questions
What is a "good" cash flow per door?
While it varies by market, many investors aim for at least $100-$200 in pure positive cash flow per unit per month after all expenses and reserves.
Should I include maintenance in my calculations?
Yes! Even if the house is new, things break. It is prudent to budget 5-10% of the rent for maintenance and capital expenditures (CapEx) like roof or HVAC replacement.
function calculateRental() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('rpc-price').value);
var downPercent = parseFloat(document.getElementById('rpc-down').value);
var rate = parseFloat(document.getElementById('rpc-rate').value);
var term = parseFloat(document.getElementById('rpc-term').value);
var rent = parseFloat(document.getElementById('rpc-rent').value);
var vacancyRate = parseFloat(document.getElementById('rpc-vacancy').value);
var annualTax = parseFloat(document.getElementById('rpc-tax').value);
var annualIns = parseFloat(document.getElementById('rpc-insurance').value);
var monthlyMaint = parseFloat(document.getElementById('rpc-maintenance').value);
var closingCosts = parseFloat(document.getElementById('rpc-closing').value);
// 2. Validation
var errorMsg = document.getElementById('rpc-error-msg');
if (isNaN(price) || isNaN(downPercent) || isNaN(rate) || isNaN(term) || isNaN(rent) ||
isNaN(vacancyRate) || isNaN(annualTax) || isNaN(annualIns) || isNaN(monthlyMaint) || isNaN(closingCosts)) {
errorMsg.style.display = 'block';
document.getElementById('rpc-results-area').style.display = 'none';
return;
} else {
errorMsg.style.display = 'none';
}
// 3. Calculation Logic
// Loan Calculation
var downPayment = price * (downPercent / 100);
var loanAmount = price – downPayment;
var monthlyRate = rate / 100 / 12;
var numPayments = term * 12;
// Mortgage Payment (Principal + Interest)
var mortgagePayment = 0;
if (rate === 0) {
mortgagePayment = loanAmount / numPayments;
} else {
mortgagePayment = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numPayments)) / (Math.pow(1 + monthlyRate, numPayments) – 1);
}
// Monthly Expenses
var monthlyTax = annualTax / 12;
var monthlyIns = annualIns / 12;
var vacancyCost = rent * (vacancyRate / 100);
var totalMonthlyExpenses = mortgagePayment + monthlyTax + monthlyIns + monthlyMaint + vacancyCost;
var operatingExpenses = monthlyTax + monthlyIns + monthlyMaint + vacancyCost; // Excluding mortgage
// Cash Flow
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
// NOI (Net Operating Income) -> Annual Income – Annual Operating Expenses (No Mortgage)
var annualNOI = (rent * 12) – (operatingExpenses * 12);
// Cap Rate -> (Annual NOI / Purchase Price) * 100
var capRate = (annualNOI / price) * 100;
// Cash on Cash Return -> (Annual Cash Flow / Total Cash Invested) * 100
var totalCashInvested = downPayment + closingCosts;
var cocReturn = (annualCashFlow / totalCashInvested) * 100;
// 4. Update UI
document.getElementById('res-cashflow').innerText = formatCurrency(monthlyCashFlow);
document.getElementById('res-noi').innerText = formatCurrency(annualNOI);
document.getElementById('res-cap').innerText = capRate.toFixed(2) + '%';
document.getElementById('res-coc').innerText = cocReturn.toFixed(2) + '%';
document.getElementById('res-mortgage').innerText = formatCurrency(mortgagePayment);
document.getElementById('res-expenses').innerText = formatCurrency(totalMonthlyExpenses);
// Styling for negative/positive cash flow
var cashFlowRow = document.getElementById('cashflow-row');
if(monthlyCashFlow < 0) {
cashFlowRow.classList.add('rpc-negative');
cashFlowRow.classList.remove('rpc-highlight');
} else {
cashFlowRow.classList.remove('rpc-negative');
cashFlowRow.classList.add('rpc-highlight');
}
// Show Results
var resultsArea = document.getElementById('rpc-results-area');
resultsArea.classList.remove('visible'); // reset animation
void resultsArea.offsetWidth; // trigger reflow
resultsArea.classList.add('visible');
resultsArea.style.display = 'block';
}
function formatCurrency(num) {
return '$' + num.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
}