#cap-rate-calculator-container {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
max-width: 800px;
margin: 0 auto;
color: #333;
line-height: 1.6;
}
.calc-wrapper {
background: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 8px;
padding: 30px;
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
margin-bottom: 40px;
}
.calc-header {
text-align: center;
margin-bottom: 25px;
color: #2c3e50;
}
.input-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 600px) {
.input-grid {
grid-template-columns: 1fr;
}
}
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: 600;
font-size: 0.9rem;
color: #495057;
}
.form-group input {
width: 100%;
padding: 10px;
border: 1px solid #ced4da;
border-radius: 4px;
font-size: 1rem;
box-sizing: border-box;
}
.form-group .suffix {
position: absolute;
right: 10px;
top: 38px;
color: #6c757d;
}
.section-title {
grid-column: 1 / -1;
font-size: 1.1rem;
font-weight: 700;
margin-top: 10px;
margin-bottom: 5px;
color: #0056b3;
border-bottom: 2px solid #e9ecef;
padding-bottom: 5px;
}
.btn-calc {
display: block;
width: 100%;
padding: 15px;
background-color: #0056b3;
color: white;
border: none;
border-radius: 4px;
font-size: 1.1rem;
font-weight: bold;
cursor: pointer;
transition: background-color 0.2s;
margin-top: 20px;
grid-column: 1 / -1;
}
.btn-calc:hover {
background-color: #004494;
}
.results-area {
margin-top: 30px;
background: #ffffff;
border: 1px solid #dee2e6;
border-radius: 6px;
padding: 20px;
display: none;
}
.result-row {
display: flex;
justify-content: space-between;
padding: 10px 0;
border-bottom: 1px solid #f1f3f5;
}
.result-row:last-child {
border-bottom: none;
}
.result-label {
font-weight: 500;
}
.result-value {
font-weight: 700;
font-size: 1.1rem;
}
.highlight-result {
color: #0056b3;
font-size: 1.4rem;
}
.seo-content {
padding: 20px;
background: #fff;
}
.seo-content h2 {
color: #2c3e50;
margin-top: 30px;
}
.seo-content p {
margin-bottom: 15px;
}
.error-msg {
color: #dc3545;
text-align: center;
margin-top: 10px;
font-weight: bold;
display: none;
}
What is Capitalization Rate (Cap Rate)?
The Capitalization Rate, or Cap Rate, is one of the most fundamental metrics used in real estate investing to evaluate the profitability of an income-generating property. Unlike ROI (Return on Investment), Cap Rate measures the rate of return based on the income the property generates relative to its purchase price, assuming the property was bought with cash.
The Cap Rate Formula
The math behind our calculator is derived from this standard formula:
Cap Rate = (Net Operating Income / Current Market Value) × 100
Where Net Operating Income (NOI) is calculated as:
- Gross Annual Rental Income
- MINUS Vacancy Losses
- MINUS All Operating Expenses (Taxes, Insurance, Management, Maintenance)
Note: Mortgage payments (debt service) are NOT included in Cap Rate calculations.
What is a Good Cap Rate?
While "good" is subjective and market-dependent, generally speaking:
- 4% – 5%: Common in high-demand, low-risk areas (e.g., NYC, San Francisco). These are "safe" bets but offer lower cash flow.
- 6% – 8%: Often considered a healthy balance between risk and return for most residential rental properties.
- 8% – 10%+: Found in riskier markets or older properties requiring more maintenance, but offering higher potential cash flow.
Example Calculation
Imagine you buy a property for $200,000. It rents for $2,000/month ($24,000/year). Your annual expenses (taxes, insurance, repairs) total $8,000.
- NOI: $24,000 – $8,000 = $16,000
- Cap Rate: ($16,000 / $200,000) × 100 = 8.0%
Use the calculator above to quickly analyze deals and ensure your investment meets your financial goals.
function calculateCapRate() {
// Get Input Elements
var priceInput = document.getElementById("purchasePrice");
var rentInput = document.getElementById("monthlyRent");
var vacancyInput = document.getElementById("vacancyRate");
var taxInput = document.getElementById("propertyTax");
var insuranceInput = document.getElementById("insurance");
var maintInput = document.getElementById("maintenance");
var mgmtInput = document.getElementById("managementFee");
var errorDiv = document.getElementById("errorDisplay");
var resultsDiv = document.getElementById("resultsDisplay");
// Parse Float Values (Default to 0 if empty)
var price = parseFloat(priceInput.value);
var monthlyRent = parseFloat(rentInput.value);
var vacancyRate = parseFloat(vacancyInput.value) || 0;
var tax = parseFloat(taxInput.value) || 0;
var insurance = parseFloat(insuranceInput.value) || 0;
var maint = parseFloat(maintInput.value) || 0;
var mgmtRate = parseFloat(mgmtInput.value) || 0;
// Reset Error
errorDiv.style.display = "none";
resultsDiv.style.display = "none";
// Validation
if (isNaN(price) || price <= 0) {
errorDiv.innerText = "Please enter a valid Purchase Price.";
errorDiv.style.display = "block";
return;
}
if (isNaN(monthlyRent) || monthlyRent <= 0) {
errorDiv.innerText = "Please enter a valid Monthly Rent.";
errorDiv.style.display = "block";
return;
}
// Calculations
// 1. Gross Potential Income (Annual)
var grossAnnualIncome = monthlyRent * 12;
// 2. Vacancy Loss
var vacancyLoss = grossAnnualIncome * (vacancyRate / 100);
// 3. Effective Gross Income
var effectiveIncome = grossAnnualIncome – vacancyLoss;
// 4. Management Fee (Calculated on Effective Income usually)
var managementFeeAmount = effectiveIncome * (mgmtRate / 100);
// 5. Total Operating Expenses
var totalExpenses = tax + insurance + maint + managementFeeAmount;
// 6. Net Operating Income (NOI)
var noi = effectiveIncome – totalExpenses;
// 7. Cap Rate
var capRate = (noi / price) * 100;
// Formatting Helper
function formatMoney(num) {
return "$" + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}
// Update DOM with Results
document.getElementById("resGrossIncome").innerText = formatMoney(grossAnnualIncome);
document.getElementById("resEffectiveIncome").innerText = formatMoney(effectiveIncome);
document.getElementById("resTotalExpenses").innerText = formatMoney(totalExpenses);
document.getElementById("resNOI").innerText = formatMoney(noi);
// Handle negative Cap Rate display
document.getElementById("resCapRate").innerText = capRate.toFixed(2) + "%";
if(capRate < 0) {
document.getElementById("resCapRate").style.color = "#dc3545";
} else {
document.getElementById("resCapRate").style.color = "#0056b3";
}
// Show Results
resultsDiv.style.display = "block";
}