:root {
–primary-color: #2c3e50;
–accent-color: #27ae60;
–bg-color: #f4f7f6;
–text-color: #333;
–border-radius: 8px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
line-height: 1.6;
color: var(–text-color);
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #fff;
}
.calculator-container {
background-color: var(–bg-color);
padding: 30px;
border-radius: var(–border-radius);
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
margin-bottom: 40px;
border: 1px solid #e0e0e0;
}
.calculator-header {
text-align: center;
margin-bottom: 25px;
}
.calculator-header h2 {
color: var(–primary-color);
margin: 0;
font-size: 24px;
}
.input-group {
margin-bottom: 20px;
}
.input-group label {
display: block;
margin-bottom: 8px;
font-weight: 600;
font-size: 14px;
color: var(–primary-color);
}
.input-wrapper {
position: relative;
}
.input-wrapper input {
width: 100%;
padding: 12px;
padding-left: 25px; /* Space for currency symbol */
border: 1px solid #ccc;
border-radius: 4px;
font-size: 16px;
box-sizing: border-box;
}
.input-wrapper.percent input {
padding-left: 12px;
padding-right: 25px;
}
.currency-symbol {
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
color: #777;
font-weight: bold;
}
.percent-symbol {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
color: #777;
font-weight: bold;
}
button.calc-btn {
width: 100%;
padding: 15px;
background-color: var(–accent-color);
color: white;
border: none;
border-radius: 4px;
font-size: 18px;
font-weight: bold;
cursor: pointer;
transition: background-color 0.3s;
margin-top: 10px;
}
button.calc-btn:hover {
background-color: #219150;
}
#results {
margin-top: 30px;
padding: 20px;
background-color: #fff;
border-radius: 4px;
display: none;
border-left: 5px solid var(–accent-color);
}
.result-row {
display: flex;
justify-content: space-between;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
}
.result-row:last-child {
border-bottom: none;
margin-bottom: 0;
padding-bottom: 0;
}
.result-label {
font-weight: 500;
color: #555;
}
.result-value {
font-weight: bold;
font-size: 18px;
color: var(–primary-color);
}
.final-cap-rate {
font-size: 28px;
color: var(–accent-color);
}
.article-content h2, .article-content h3 {
color: var(–primary-color);
margin-top: 30px;
}
.article-content p, .article-content li {
margin-bottom: 15px;
font-size: 16px;
}
.article-content ul {
margin-left: 20px;
}
.callout {
background-color: #e8f6f3;
padding: 15px;
border-left: 4px solid var(–accent-color);
margin: 20px 0;
}
.formula-box {
background-color: #2c3e50;
color: #fff;
padding: 15px;
text-align: center;
font-family: monospace;
font-size: 1.1em;
border-radius: 4px;
margin: 20px 0;
}
@media (max-width: 600px) {
.calculator-container {
padding: 20px;
}
}
How to Calculate a Cap Rate on a Rental Property
The Capitalization Rate, or "Cap Rate," is one of the most fundamental metrics in real estate investing. It allows investors to assess the profitability and return potential of a rental property regardless of how it is financed. Unlike Cash-on-Cash return, Cap Rate ignores mortgage debt, providing a pure measure of the property's natural yield.
The Cap Rate Formula
Calculating the Cap Rate requires two primary figures: the Net Operating Income (NOI) and the current market value (or purchase price) of the property.
Cap Rate = (Net Operating Income / Property Value) × 100
To use this formula effectively, you must understand the components:
- Property Value: The current market price or the price you intend to pay for the asset.
- Net Operating Income (NOI): This is the annual income the property generates after all operating expenses are deducted, but before debt service (mortgage payments) and income taxes.
Step-by-Step Calculation Guide
1. Determine Gross Annual Income
Start by calculating the total income the property could generate if it were fully rented for the entire year. This includes rent, parking fees, laundry coin-op income, and any other revenue streams.
2. Account for Vacancy
No property is occupied 100% of the time forever. It is prudent to subtract a vacancy rate (typically 5% to 10%) to determine your Effective Gross Income.
3. Deduct Operating Expenses
Subtract all costs required to run the property. Common operating expenses include:
- Property Taxes
- Property Insurance
- Maintenance and Repairs (estimate 1% of property value annually)
- Property Management Fees (typically 8-10% of rent)
- Utilities (if paid by landlord)
- Landscaping and Snow Removal
Important: Do NOT include mortgage principal, interest, or capital expenditures (like a new roof) in Operating Expenses when calculating Cap Rate.
4. Divide NOI by Property Value
Once you have the NOI (Effective Income minus Expenses), divide that number by the Property Value. Multiply the result by 100 to get the percentage.
Example Calculation
Let's say you are looking at a single-family rental with a purchase price of $250,000.
- Gross Rent: $24,000 per year ($2,000/month).
- Vacancy (5%): $1,200.
- Effective Income: $22,800.
- Operating Expenses: $7,000 (Taxes, Insurance, Repairs).
- Net Operating Income (NOI): $15,800 ($22,800 – $7,000).
Calculation: ($15,800 / $250,000) = 0.0632
Cap Rate: 6.32%
What is a "Good" Cap Rate?
There is no single "good" Cap Rate, as it depends on the location, asset class, and economic environment. Generally:
- 4% – 5%: Common in high-demand, low-risk areas (Class A properties in major cities).
- 6% – 8%: Often considered a healthy balance of risk and return for residential rentals.
- 8% – 12%+: Common in older properties or riskier neighborhoods where the potential for cash flow is high, but so is the risk of vacancy or repair issues.
Investors use the Cap Rate to compare different properties. If Property A has a Cap Rate of 5% and Property B has a Cap Rate of 8%, Property B offers a higher return relative to its price, though it likely comes with higher risk.
function calculateCapRate() {
// 1. Get Input Values
var propValueStr = document.getElementById('propertyValue').value;
var grossIncomeStr = document.getElementById('grossAnnualIncome').value;
var vacancyRateStr = document.getElementById('vacancyRate').value;
var expensesStr = document.getElementById('operatingExpenses').value;
// 2. Validate and Parse Inputs
var propValue = parseFloat(propValueStr);
var grossIncome = parseFloat(grossIncomeStr);
var vacancyRate = parseFloat(vacancyRateStr);
var expenses = parseFloat(expensesStr);
// Simple validation checks
if (isNaN(propValue) || propValue <= 0) {
alert("Please enter a valid Property Market Value greater than 0.");
return;
}
if (isNaN(grossIncome) || grossIncome < 0) {
alert("Please enter a valid Gross Annual Income.");
return;
}
if (isNaN(expenses) || expenses < 0) {
alert("Please enter valid Operating Expenses.");
return;
}
// If vacancy is empty, treat as 0
if (isNaN(vacancyRate)) {
vacancyRate = 0;
}
// 3. Perform Calculations
// Calculate Vacancy Loss
var vacancyLoss = grossIncome * (vacancyRate / 100);
// Calculate Effective Gross Income
var effectiveIncome = grossIncome – vacancyLoss;
// Calculate Net Operating Income (NOI)
var noi = effectiveIncome – expenses;
// Calculate Cap Rate
// Formula: (NOI / Property Value) * 100
var capRate = (noi / propValue) * 100;
// 4. Update the DOM with Results
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
document.getElementById('resGrossIncome').innerText = formatter.format(grossIncome);
document.getElementById('resVacancyLoss').innerText = formatter.format(vacancyLoss);
document.getElementById('resEffectiveIncome').innerText = formatter.format(effectiveIncome);
document.getElementById('resExpenses').innerText = formatter.format(expenses);
// Color NOI based on positive/negative
var noiElement = document.getElementById('resNOI');
noiElement.innerText = formatter.format(noi);
if (noi < 0) {
noiElement.style.color = '#e74c3c'; // Red for negative
} else {
noiElement.style.color = '#2c3e50'; // Standard color
}
// Display Cap Rate
document.getElementById('resCapRate').innerText = capRate.toFixed(2) + "%";
// Show the results container
document.getElementById('results').style.display = 'block';
}