Investing in real estate is one of the most reliable ways to build wealth, but simply buying a property doesn't guarantee profit. To ensure a rental property is a sound investment, you must analyze the numbers objectively. This Rental Property Cash Flow & ROI Calculator helps investors determine the viability of a deal by breaking down the key financial metrics.
Key Metrics Explained
Understanding these three critical metrics will help you make smarter investment decisions:
Monthly Cash Flow: This is the net profit you pocket every month after all expenses (mortgage, taxes, insurance, repairs) are paid. Positive cash flow is essential for long-term sustainability.
Cash on Cash ROI: This metric calculates the annual return on the actual cash you invested (Down Payment + Closing Costs). It tells you how hard your money is working for you compared to other investments like stocks or bonds.
Cap Rate (Capitalization Rate): The Cap Rate measures the natural rate of return of the property assuming you bought it with all cash. It helps compare the profitability of different properties regardless of financing.
How to Use This Calculator
To get the most accurate results, ensure you are accounting for all expenses. Under "Monthly Expenses," be sure to estimate:
Property Taxes: Generally 1-2% of the property value annually, divided by 12.
Insurance: Landlord insurance policies.
Maintenance & Repairs: Budget 5-10% of monthly rent for future repairs.
Vacancy Rate: Budget 5-8% of rent to cover times when the unit is empty.
What is a Good ROI?
While every investor has different goals, a "good" Cash on Cash return is often considered to be between 8% and 12%. However, in high-appreciation markets, investors might accept a lower cash flow (4-6%) in exchange for long-term equity growth. Always balance immediate cash flow with your long-term investment strategy.
function calculateRentalROI() {
// 1. Get Inputs
var price = parseFloat(document.getElementById('purchasePrice').value);
var downPayment = parseFloat(document.getElementById('downPayment').value);
var rate = parseFloat(document.getElementById('interestRate').value);
var years = parseFloat(document.getElementById('loanTerm').value);
var income = parseFloat(document.getElementById('rentalIncome').value);
var expenses = parseFloat(document.getElementById('monthlyExpenses').value);
// 2. Validation
if (isNaN(price) || isNaN(downPayment) || isNaN(rate) || isNaN(years) || isNaN(income) || isNaN(expenses)) {
alert("Please fill in all fields with valid numbers.");
return;
}
if (downPayment > price) {
alert("Down payment cannot be greater than purchase price.");
return;
}
// 3. Calculation Logic
var loanAmount = price – downPayment;
var monthlyRate = (rate / 100) / 12;
var numberOfPayments = years * 12;
// Mortgage Calculation Formula: M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
var monthlyMortgage = 0;
if (loanAmount > 0) {
if (rate === 0) {
monthlyMortgage = loanAmount / numberOfPayments;
} else {
monthlyMortgage = loanAmount * (monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments)) / (Math.pow(1 + monthlyRate, numberOfPayments) – 1);
}
}
var totalMonthlyCost = monthlyMortgage + expenses;
var monthlyCashFlow = income – totalMonthlyCost;
var annualCashFlow = monthlyCashFlow * 12;
// Cash on Cash ROI = (Annual Cash Flow / Total Cash Invested)
// Assuming Cash Invested is just Down Payment for this simple calculator (could add closing costs in v2)
var cashInvested = downPayment;
var cocRoi = 0;
if (cashInvested > 0) {
cocRoi = (annualCashFlow / cashInvested) * 100;
}
// Cap Rate = (Net Operating Income / Current Market Value)
// NOI = Annual Income – Annual Operating Expenses (Excluding Mortgage)
var annualIncome = income * 12;
var annualOperatingExpenses = expenses * 12;
var noi = annualIncome – annualOperatingExpenses;
var capRate = (noi / price) * 100;
// 4. Update UI
document.getElementById('resMortgage').innerText = formatCurrency(monthlyMortgage);
document.getElementById('resTotalCost').innerText = formatCurrency(totalMonthlyCost);
var cashFlowEl = document.getElementById('resCashFlow');
cashFlowEl.innerText = formatCurrency(monthlyCashFlow);
if(monthlyCashFlow >= 0) {
cashFlowEl.className = "rental-result-value result-highlight";
} else {
cashFlowEl.className = "rental-result-value result-negative";
}
document.getElementById('resAnnualCashFlow').innerText = formatCurrency(annualCashFlow);
document.getElementById('resCocROI').innerText = cocRoi.toFixed(2) + "%";
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
// Show results
document.getElementById('resultsArea').style.display = "block";
}
function formatCurrency(num) {
return "$" + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}