Understanding the return on investment (ROI) for a rental property is crucial for making informed real estate decisions. This Rental Yield Calculator helps investors determine both the Gross and Net Rental Yield, taking into account purchase price, rental income, and operating expenses.
Please enter valid positive numbers for all fields.
Gross Rental Yield:0.00%
Net Rental Yield (Cap Rate):0.00%
Annual Net Cash Flow:$0.00
Monthly Net Cash Flow:$0.00
Total Annual Expenses:$0.00
How to Calculate Rental Yield
Rental yield is a percentage figure that calculates the return on investment from rental income. It is one of the most important metrics for buy-to-let investors.
1. Gross Rental Yield
This is the simplest calculation and looks at the rental income relative to the property price, ignoring expenses.
Formula: (Annual Rental Income / Property Value) × 100
Example: A property costs $250,000 and rents for $2,000/month ($24,000/year). The Gross Yield is ($24,000 / $250,000) = 9.6%.
2. Net Rental Yield
This gives a more accurate picture of profitability by factoring in costs like taxes, insurance, HOA fees, repairs, and vacancy periods.
Using the example above, if expenses total $8,000 per year, the Net Income is $16,000. The Net Yield is ($16,000 / $250,000) = 6.4%.
What is a Good Rental Yield?
While "good" varies by location and strategy, generally:
3-5%: Typical for high-appreciation areas or very safe markets.
5-8%: Considered a solid return for most residential investments.
8%+: Excellent cash flow, often found in lower-cost areas or multi-unit properties, though potentially with higher risk or management needs.
Why Factor in Vacancy Rate?
No property is occupied 100% of the time. Prudent investors assume a vacancy rate (often 5% to 10%) to account for turnover periods between tenants. This ensures your cash flow projections remain realistic even if the property sits empty for a few weeks a year.
function calculateRentalYield() {
// Get input values
var price = document.getElementById('purchasePrice').value;
var rent = document.getElementById('monthlyRent').value;
var tax = document.getElementById('propertyTax').value;
var insurance = document.getElementById('insurance').value;
var hoa = document.getElementById('monthlyHOA').value;
var vacancy = document.getElementById('vacancyRate').value;
var errorDiv = document.getElementById('errorMessage');
var resultsDiv = document.getElementById('results');
// Validation: Check if inputs are numbers and not empty
if (price === "" || rent === "" || tax === "" || insurance === "" || hoa === "" || vacancy === "") {
errorDiv.style.display = 'block';
resultsDiv.style.display = 'none';
return;
}
// Parse floats
price = parseFloat(price);
rent = parseFloat(rent);
tax = parseFloat(tax);
insurance = parseFloat(insurance);
hoa = parseFloat(hoa);
vacancy = parseFloat(vacancy);
// Check for negative numbers or zero price
if (price <= 0 || rent < 0 || tax < 0 || insurance < 0 || hoa < 0 || vacancy < 0) {
errorDiv.innerText = "Please ensure Purchase Price is greater than 0 and other values are non-negative.";
errorDiv.style.display = 'block';
resultsDiv.style.display = 'none';
return;
}
errorDiv.style.display = 'none';
// Calculation Logic
var annualRentGross = rent * 12;
var annualVacancyLoss = annualRentGross * (vacancy / 100);
var annualRentEffective = annualRentGross – annualVacancyLoss;
var annualHOA = hoa * 12;
var totalAnnualExpenses = tax + insurance + annualHOA + annualVacancyLoss;
var netAnnualIncome = annualRentGross – totalAnnualExpenses;
var netMonthlyIncome = netAnnualIncome / 12;
// Yield Calculations
var grossYield = (annualRentGross / price) * 100;
var netYield = (netAnnualIncome / price) * 100;
// Display Results
document.getElementById('grossYieldResult').innerText = grossYield.toFixed(2) + "%";
document.getElementById('netYieldResult').innerText = netYield.toFixed(2) + "%";
document.getElementById('annualCashFlowResult').innerText = "$" + netAnnualIncome.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('monthlyCashFlowResult').innerText = "$" + netMonthlyIncome.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('totalExpensesResult').innerText = "$" + totalAnnualExpenses.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Show result box
resultsDiv.style.display = 'block';
}