Analyze potential real estate investments by calculating monthly cash flow, cap rate, and cash-on-cash return.
Purchase Information
Loan Details
30 Years
15 Years
10 Years
Income & Expenses
Investment Analysis
Monthly Cash Flow
$0.00
Cash on Cash Return
0.00%
Cap Rate
0.00%
Total Monthly Expenses
$0.00
NOI (Monthly)
$0.00
Monthly Mortgage
$0.00
Understanding Rental Property Cash Flow
Calculating the cash flow of a rental property is the single most important step in real estate investing. Positive cash flow ensures that the property pays for itself while putting money in your pocket every month. This calculator helps you evaluate the profitability of a potential deal by factoring in income, operating expenses, and financing costs.
How is Rental Cash Flow Calculated?
The basic formula for rental property cash flow is simple:
Cash Flow = Gross Rental Income – Total Expenses
However, "Total Expenses" involves several variable and fixed costs that beginners often overlook:
Mortgage Payment (P&I): The principal and interest paid to the lender.
Taxes & Insurance: Annual property taxes and hazard insurance, usually prorated monthly.
Vacancy Rate: A percentage of rent set aside to cover periods when the property is empty. A standard conservative estimate is 5-8%.
Maintenance & CapEx: Money reserved for repairs (leaky faucets) and capital expenditures (new roof, HVAC).
Property Management: If you hire a manager, they typically charge 8-10% of the collected rent.
Key Metrics Explained
1. Cash on Cash Return (CoC)
This metric measures the annual return on the actual cash you invested (down payment + closing costs). It is calculated as:
A good CoC return depends on your market, but many investors look for 8-12% or higher.
2. Capitalization Rate (Cap Rate)
The Cap Rate indicates the rate of return on the property assuming it was bought with all cash (no loan). It allows you to compare the profitability of different properties regardless of financing.
Cap Rate = (Net Operating Income / Purchase Price) × 100
3. Net Operating Income (NOI)
NOI is the total income minus operating expenses, excluding the mortgage payment. It represents the raw profitability of the asset itself.
Tips for Improving Cash Flow
If your calculation shows negative or low cash flow, consider these strategies:
Increase Rent: Are you charging market rates? Small increases can significantly impact the bottom line.
Lower Expenses: Shop around for cheaper insurance or appeal your property tax assessment.
Value-Add: Renovate the property to command higher rent.
Refinance: If interest rates drop, refinancing can lower your monthly mortgage payment.
Use this tool to analyze multiple scenarios before making an offer. Adjust the purchase price or down payment to see how it affects your ROI and ensure you buy a profitable rental property.
function calculateCashFlow() {
// Get Inputs
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value) || 0;
var downPaymentPercent = parseFloat(document.getElementById('downPayment').value) || 0;
var closingCosts = parseFloat(document.getElementById('closingCosts').value) || 0;
var interestRate = parseFloat(document.getElementById('interestRate').value) || 0;
var loanTermYears = parseFloat(document.getElementById('loanTerm').value) || 30;
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value) || 0;
var propertyTaxYearly = parseFloat(document.getElementById('propertyTax').value) || 0;
var insuranceYearly = parseFloat(document.getElementById('insurance').value) || 0;
var hoaMonthly = parseFloat(document.getElementById('hoa').value) || 0;
var vacancyPercent = parseFloat(document.getElementById('vacancy').value) || 0;
var maintenancePercent = parseFloat(document.getElementById('maintenance').value) || 0;
var managementPercent = parseFloat(document.getElementById('management').value) || 0;
// Calculations – Loan
var downPaymentAmount = purchasePrice * (downPaymentPercent / 100);
var loanAmount = purchasePrice – downPaymentAmount;
var totalCashInvested = downPaymentAmount + closingCosts;
// Mortgage Calculation (P&I)
var monthlyInterestRate = (interestRate / 100) / 12;
var numberOfPayments = loanTermYears * 12;
var monthlyMortgage = 0;
if (interestRate > 0) {
monthlyMortgage = loanAmount * (monthlyInterestRate * Math.pow(1 + monthlyInterestRate, numberOfPayments)) / (Math.pow(1 + monthlyInterestRate, numberOfPayments) – 1);
} else {
monthlyMortgage = loanAmount / numberOfPayments;
}
// Calculations – Monthly Expenses
var taxMonthly = propertyTaxYearly / 12;
var insuranceMonthly = insuranceYearly / 12;
var vacancyMonthly = monthlyRent * (vacancyPercent / 100);
var maintenanceMonthly = monthlyRent * (maintenancePercent / 100);
var managementMonthly = monthlyRent * (managementPercent / 100);
var operatingExpensesMonthly = taxMonthly + insuranceMonthly + hoaMonthly + vacancyMonthly + maintenanceMonthly + managementMonthly;
var totalExpensesMonthly = operatingExpensesMonthly + monthlyMortgage;
// Calculations – Metrics
var monthlyCashFlow = monthlyRent – totalExpensesMonthly;
var annualCashFlow = monthlyCashFlow * 12;
var cocReturn = 0;
if (totalCashInvested > 0) {
cocReturn = (annualCashFlow / totalCashInvested) * 100;
}
var noiMonthly = monthlyRent – operatingExpensesMonthly;
var noiAnnual = noiMonthly * 12;
var capRate = 0;
if (purchasePrice > 0) {
capRate = (noiAnnual / purchasePrice) * 100;
}
// Display Results
document.getElementById('result').style.display = 'block';
// Helper to format money
var formatMoney = function(num) {
return '$' + num.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
};
document.getElementById('monthlyCashFlow').innerText = formatMoney(monthlyCashFlow);
document.getElementById('monthlyCashFlow').className = 'result-value ' + (monthlyCashFlow >= 0 ? 'positive' : 'negative');
document.getElementById('cocReturn').innerText = cocReturn.toFixed(2) + '%';
document.getElementById('cocReturn').className = 'result-value ' + (cocReturn >= 0 ? 'positive' : 'negative');
document.getElementById('capRate').innerText = capRate.toFixed(2) + '%';
document.getElementById('totalExpenses').innerText = formatMoney(totalExpensesMonthly);
document.getElementById('noiMonth').innerText = formatMoney(noiMonthly);
document.getElementById('monthlyMortgage').innerText = formatMoney(monthlyMortgage);
}