Calculate the ROI, Cap Rate, and monthly cash flow for your potential real estate investment.
Please fill in all fields with valid numbers.
Purchase Info
30 Years
15 Years
10 Years
Income & Expenses
Investment Analysis
Total Initial Cash Needed:$0.00
Monthly Mortgage (P&I):$0.00
Total Monthly Expenses:$0.00
Net Operating Income (Monthly):$0.00
Monthly Cash Flow:$0.00
Cap Rate:0.00%
Cash on Cash Return:0.00%
How to Analyze a Rental Property Investment
Investing in real estate is one of the most reliable ways to build wealth, but simply buying a property and renting it out doesn't guarantee a profit. Successful investors rely on accurate math to determine if a property will generate positive cash flow or become a financial burden.
What is Cash Flow?
Cash flow is the profit you take home each month after all operating expenses and mortgage payments have been paid. A positive cash flow means the property pays for itself and provides you with income. A negative cash flow means you are paying out of pocket to hold the asset.
Formula:Cash Flow = Total Monthly Income – Total Monthly Expenses
Key Metrics Explained
NOI (Net Operating Income): This is your profitability before the mortgage is paid. It is calculated by subtracting operating expenses (taxes, insurance, maintenance, vacancy) from the rental income.
Cap Rate (Capitalization Rate): This metric helps you compare the profitability of different properties regardless of how they are financed. A higher cap rate generally indicates a better return, though often with higher risk. It is calculated as (Annual NOI / Purchase Price) * 100.
Cash on Cash Return: This measures the return on the actual cash you invested (down payment + closing costs). It is the most practical metric for investors using leverage. Ideally, you want a Cash on Cash return that beats the stock market average (8-10%).
Estimating Expenses
One common mistake new investors make is underestimating expenses. Always account for:
Vacancy: Properties won't be rented 100% of the time. Use 5-8% as a buffer.
Maintenance: Things break. Setting aside 5-10% of the rent for repairs ensures you have funds when the water heater fails.
Property Management: Even if you self-manage now, calculating this cost (usually 10% of rent) ensures the deal still works if you hire a manager later.
Use the calculator above to adjust your purchase price, down payment, or rental rates to see how these variables impact your bottom line.
function calculateRentalROI() {
// 1. Get Input Values
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPercent = parseFloat(document.getElementById('downPaymentPercent').value);
var interestRate = parseFloat(document.getElementById('interestRate').value);
var years = parseFloat(document.getElementById('loanTerm').value);
var closingCosts = parseFloat(document.getElementById('closingCosts').value);
var rent = parseFloat(document.getElementById('monthlyRent').value);
var annualTax = parseFloat(document.getElementById('propertyTax').value);
var annualInsurance = parseFloat(document.getElementById('insurance').value);
var monthlyHoa = parseFloat(document.getElementById('hoa').value);
var maintPercent = parseFloat(document.getElementById('maintenance').value);
var vacancyPercent = parseFloat(document.getElementById('vacancy').value);
var errorDiv = document.getElementById('rp-error');
var resultsDiv = document.getElementById('rp-results');
// 2. Validation
if (isNaN(price) || isNaN(downPercent) || isNaN(interestRate) || isNaN(rent)) {
errorDiv.style.display = 'block';
resultsDiv.style.display = 'none';
return;
} else {
errorDiv.style.display = 'none';
resultsDiv.style.display = 'block';
}
// 3. Loan Calculations
var downPaymentAmount = price * (downPercent / 100);
var loanAmount = price – downPaymentAmount;
var totalCashInvested = downPaymentAmount + closingCosts;
// Mortgage Payment (Principal & Interest)
var monthlyRate = (interestRate / 100) / 12;
var numberOfPayments = years * 12;
var monthlyMortgage = 0;
if (interestRate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
// Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
}
// 4. Expense Calculations
var monthlyTax = annualTax / 12;
var monthlyInsurance = annualInsurance / 12;
var monthlyMaintenance = rent * (maintPercent / 100);
var monthlyVacancy = rent * (vacancyPercent / 100);
var totalOperatingExpenses = monthlyTax + monthlyInsurance + monthlyHoa + monthlyMaintenance + monthlyVacancy;
var totalMonthlyExpenses = totalOperatingExpenses + monthlyMortgage;
// 5. Income Analysis
var monthlyNOI = rent – totalOperatingExpenses;
var monthlyCashFlow = rent – totalMonthlyExpenses;
var annualCashFlow = monthlyCashFlow * 12;
var annualNOI = monthlyNOI * 12;
// 6. Return Metrics
var capRate = (annualNOI / price) * 100;
var cashOnCash = (annualCashFlow / totalCashInvested) * 100;
// 7. Update DOM
document.getElementById('res-cash-needed').innerText = '$' + totalCashInvested.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('res-mortgage').innerText = '$' + monthlyMortgage.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('res-expenses').innerText = '$' + totalMonthlyExpenses.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('res-noi').innerText = '$' + monthlyNOI.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
var cfElement = document.getElementById('res-cash-flow');
cfElement.innerText = '$' + monthlyCashFlow.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
cfElement.style.color = monthlyCashFlow >= 0 ? '#27ae60' : '#c0392b';
document.getElementById('res-cap-rate').innerText = capRate.toFixed(2) + '%';
var cocElement = document.getElementById('res-coc');
cocElement.innerText = cashOnCash.toFixed(2) + '%';
cocElement.style.color = cashOnCash >= 0 ? '#333' : '#c0392b';
}