How to Calculate Rental Property ROI
Return on Investment (ROI) is a critical metric for real estate investors. It measures the efficiency of an investment by comparing the net profit to the total cost. For rental properties, we primarily look at Gross Yield and Net Yield (Cap Rate).
The Key Formulas
- Gross Yield: (Annual Rental Income / Purchase Price) × 100
- Net Annual Income: Gross Annual Rent – (Taxes + Insurance + Maintenance + Vacancy Loss)
- Cap Rate (Net Yield): (Net Annual Income / Purchase Price) × 100
Real-World Example
Imagine you buy a condo for $250,000. You rent it for $2,000 per month.
Your annual gross income is $24,000. After paying $3,000 in taxes, $1,200 in insurance, $2,400 in HOA fees, and accounting for a 5% vacancy rate ($1,200), your net annual income is $16,200.
In this case:
• Gross Yield: 9.6%
• Cap Rate: 6.48%
• Monthly Cash Flow: $1,350
Why Vacancy Rates Matter
New investors often forget to account for vacancy. No property is occupied 100% of the time over a decade. A standard 5% vacancy rate (roughly 2-3 weeks per year) ensures your ROI calculation remains realistic and protects your cash flow from unexpected turnovers.
function calculateRentalROI() {
var purchasePrice = parseFloat(document.getElementById('purchasePrice').value);
var monthlyRent = parseFloat(document.getElementById('monthlyRent').value);
var annualTaxes = parseFloat(document.getElementById('annualTaxes').value);
var monthlyInsurance = parseFloat(document.getElementById('monthlyInsurance').value);
var monthlyMaintenance = parseFloat(document.getElementById('monthlyMaintenance').value);
var vacancyRatePercent = parseFloat(document.getElementById('vacancyRate').value);
if (isNaN(purchasePrice) || isNaN(monthlyRent) || purchasePrice <= 0) {
alert("Please enter valid numbers for Purchase Price and Monthly Rent.");
return;
}
// Calculation Logic
var annualGrossRent = monthlyRent * 12;
var vacancyLoss = annualGrossRent * (vacancyRatePercent / 100);
var effectiveGrossIncome = annualGrossRent – vacancyLoss;
var annualExpenses = annualTaxes + (monthlyInsurance * 12) + (monthlyMaintenance * 12);
var annualNetIncome = effectiveGrossIncome – annualExpenses;
var monthlyNetCashFlow = annualNetIncome / 12;
var grossYield = (annualGrossRent / purchasePrice) * 100;
var netYield = (annualNetIncome / purchasePrice) * 100;
// Display Results
document.getElementById('resGrossYield').innerText = grossYield.toFixed(2) + "%";
document.getElementById('resNetYield').innerText = netYield.toFixed(2) + "%";
document.getElementById('resMonthlyCash').innerText = "$" + monthlyNetCashFlow.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resAnnualNet').innerText = "$" + annualNetIncome.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('roi-results').style.display = 'block';
}