```html
Building Permit Cost Calculator | permitcalculator.com
:root {
--primary: #2563eb;
--secondary: #1e40af;
--success: #059669;
--warning: #d97706;
--gray-900: #111827;
--gray-800: #1f2937;
--gray-700: #374151;
--gray-600: #4b5563;
--gray-500: #6b7280;
--gray-200: #e5e7eb;
--gray-100: #f3f4f6;
--white: #ffffff;
--shadow: 0 10px 15px -3px rgba(0, 0,0,0.1);
--shadow-lg: 0 25px 50px -12px rgba(0,0,0,0.25);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: var(--gray-800); background: linear-gradient(135deg, var(--gray-100) 0%, #f8fafc 100%); padding: 1rem; }
.container { max-width: 800px; margin: 0 auto; background: var(--white); border-radius: 1rem; box-shadow: var(--shadow-lg); overflow: hidden; }
.hero { background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%); color: var(--white); padding: 2rem 2rem 1.5rem; text-align: center; }
.hero h1 { font-size: clamp(1.75rem, 5vw, 2.5rem); font-weight: 700; margin-bottom: 0.5rem; }
.hero p { font-size: 1.125rem; opacity: 0.95; margin-bottom: 0.25rem; }
.hero .trust { font-size: 0.875rem; opacity: 0.8; font-weight: 500; }
.section { padding: 2rem; }
.inputs form { display: grid; gap: 1.5rem; }
label { display: flex; flex-direction: column; font-weight: 500; gap: 0.25rem; font-size: 0.95rem; }
input, select { padding: 0.75rem 1rem; border: 2px solid var(--gray-200); border-radius: 0.5rem; font-size: 1rem; transition: border-color 0.2s; }
input:focus, select:focus { outline: none; border-color: var(--primary); }
.slider-container { display: flex; align-items: center; gap: 1rem; }
input[type=range] { flex: 1; height: 6px; background: var(--gray-200); border-radius: 3px; }
.advanced { border: 2px solid var(--gray-200); border-radius: 0.75rem; padding: 1.5rem; margin-top: 1rem; background: var(--gray-100); }
.advanced h3 { margin-bottom: 1rem; font-size: 1.125rem; color: var(--gray-900); }
button { background: var(--primary); color: var(--white); border: none; padding: 1rem 2rem; border-radius: 0.5rem; font-size: 1.125rem; font-weight: 600; cursor: pointer; transition: background 0.2s; width: 100%; }
button:hover { background: var(--secondary); }
.results { background: linear-gradient(135deg, var(--success) 0%, #047857 100%); color: var(--white); text-align: center; padding: 3rem 2rem; }
.results h2 { font-size: clamp(2.5rem, 8vw, 4rem); font-weight: 800; margin-bottom: 1rem; }
.results .big-num { font-size: clamp(3rem, 10vw, 5rem); font-weight: 900; color: var(--white); }
.context { font-size: 1.125rem; margin: 1rem 0; opacity: 0.95; }
.chart-container { display: flex; justify-content: space-around; margin: 2rem 0; max-width: 500px; margin-inline: auto; }
.bar { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; flex: 1; }
.bar-label { font-weight: 600; font-size: 0.875rem; }
.bar-fill { height: 20px; background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%); border-radius: 10px; transition: width 0.3s; width: 0%; min-width: 20px; }
.scenarios { display: grid; gap: 1rem; margin: 2rem 0; }
.scenario { background: rgba(255,255,255,0.2); padding: 1rem; border-radius: 0.5rem; }
.share { margin-top: 1.5rem; }
.methodology { border-top: 1px solid var(--gray-200); }
details { cursor: pointer; }
summary { font-weight: 600; padding: 1rem; border-bottom: 1px solid var(--gray-200); }
.method-content { padding: 1.5rem; }
.related { display: grid; gap: 1rem; }
.related-item { padding: 1rem; background: var(--gray-100); border-radius: 0.5rem; }
.related-item a { color: var(--primary); text-decoration: none; font-weight: 600; }
@media (max-width: 640px) { .chart-container { flex-direction: column; gap: 1.5rem; } body { padding: 0.5rem; } .section { padding: 1.5rem 1rem; } }
.tooltip { position: relative; }
.tooltip-icon { font-size: 1.2em; color: var(--gray-500); cursor: help; margin-left: 0.5rem; }
.tooltip-text { visibility: hidden; position: absolute; top: 100%; left: 0; background: var(--gray-900); color: var(--white); padding: 0.5rem; border-radius: 0.25rem; font-size: 0.875rem; white-space: nowrap; z-index: 10; }
.tooltip:hover .tooltip-text { visibility: visible; }
.failure-check { background: var(--warning); color: var(--gray-900); padding: 1rem; border-radius: 0.5rem; margin: 1rem 0; }
Building Permit Cost Calculator
Estimate fees for remodels, additions, replacements. Base plus hidden adds totals clear.
Updated March 2026 | Verified municipal schedules, 15 cities
City
National Average ($507)
Atlanta, GA ($510)
Austin, TX ($687)
Boston, MA ($270)
Charlotte, NC ($269)
Chicago, IL ($900)
Columbus, OH ($660)
Dallas, TX ($992)
Denver, CO ($266)
Houston, TX
Kansas City, MO
Las Vegas, NV
Los Angeles, CA
Miami, FL
Minneapolis, MN
Nashville, TN
?
See full 28-city cost index
Project Type
Bathroom Remodel
Kitchen Remodel
Roof Replacement
HVAC Replacement
Water Heater Replacement
Deck Construction
Home Addition (permit cost per sq ft)
Generic Building Permit
?
Matches published fee schedules
Project Value $
Sq Ft
Residential / Commercial
Residential
Commercial
Advanced options
Hidden Costs Factor (%)
45%
?
Plan review, impact fees, inspections add 30 - 60% (ConstructionBids.ai)
Calculate Permit Cost
Your Total Permit Cost
$0
National average: $507. Full 28-city index
Fees first? Contractors budgeting upfront win 23% more bids. That's your edge. - David Martinez, ConstructionBids.ai
Digital app? Cuts processing 40 - 60%. File electronic now.
Home addition? Permit cost per square foot runs $1 - 3 typically. Watch impact fees.
Quote ready? Check if your quote is fair
Copy My Results
How we calculated this
Specific fees from municipal schedules. Atlanta bathroom remodel: $510 (Atlanta Code). Austin: $687 (Austin Fees).
National average $507. Verified Q1 2026 schedules. Commercial 3 - 5x residential, 1 - 2% project value (ConstructionBids.ai).
Hidden adds 30 - 60%: plan review, impacts, inspections. Home addition permit cost scales sq ft, ~$1.20 - 2.50 base before extras.
Residential $1,200 - $15,000 scope-driven. Permits fell 5.8% YoY Jan 2026, 1,376,000 SAAR (Census).
Configure deeper? Budget Configurator. See resale? Resale Value Calculator.
Delays kill. Month lag on $2M: $13,300 interest. - Prevesta Research.
Next Steps
Full city prices: Cities
Compare Financing for project funds.
Methodology details sources.
const permitData = {
'Atlanta, GA': {'Bathroom Remodel':510,'Kitchen Remodel':650,'Roof Replacement':360,'HVAC Replacement':150,'Water Heater Replacement':50,'Deck Construction':510},
'Austin, TX': {'Bathroom Remodel':687,'Kitchen Remodel':741,'Roof Replacement':370,'HVAC Replacement':67,'Water Heater Replacement':67},
'Boston, MA': {'Bathroom Remodel':270,'Kitchen Remodel':395,'Roof Replacement':120,'HVAC Replacement':25,'Water Heater Replacement':25},
'Charlotte, NC': {'Bathroom Remodel':269,'Kitchen Remodel':390,'Roof Replacement':62,'HVAC Replacement':62,'Water Heater Replacement':62},
'Chicago, IL': {'Bathroom Remodel':900,'Kitchen Remodel':900,'Roof Replacement':75,'HVAC Replacement':75,'Water Heater Replacement':75,'Deck Construction':250},
'Columbus, OH': {'Bathroom Remodel':660,'Kitchen Remodel':660,'Roof Replacement':140,'HVAC Replacement':140,'Water Heater Replacement':140},
'Dallas, TX': {'Bathroom Remodel':992,'Kitchen Remodel':992,'Roof Replacement':742,'HVAC Replacement':165,'Water Heater Replacement':165},
'Denver, CO': {'Bathroom Remodel':266,'Kitchen Remodel':414,'Roof Replacement':99,'HVAC Replacement':59,'Water Heater Replacement':35},
'Houston, TX': {'Bathroom Remodel':336,'Kitchen Remodel':447,'Roof Replacement':147,'HVAC Replacement':181,'Water Heater Replacement':131},
'Kansas City, MO': {'Bathroom Remodel':114,'Kitchen Remodel':158,'Roof Replacement':58,'HVAC Replacement':71,'Water Heater Replacement':58,'Deck Construction':84},
'Las Vegas, NV': {'Bathroom Remodel':521,'Kitchen Remodel':868,'Roof Replacement':98,'HVAC Replacement':60,'Water Heater Replacement':60},
'Los Angeles, CA': {'Bathroom Remodel':614,'Kitchen Remodel':849,'Roof Replacement':266,'HVAC Replacement':60,'Water Heater Replacement':60},
'Miami, FL': {'Bathroom Remodel':370,'Kitchen Remodel':440,'Roof Replacement':150,'HVAC Replacement':110,'Water Heater Replacement':110},
'Minneapolis, MN': {'Bathroom Remodel':959,'Kitchen Remodel':1347,'Roof Replacement':232,'HVAC Replacement':133,'Water Heater Replacement':85},
'Nashville, TN': {'Bathroom Remodel':318,'Kitchen Remodel':470,'Roof Replacement':75,'HVAC Replacement':75,'Water Heater Replacement':75,'Deck Construction':115}
};
const cityAvgs = {
'National Average':507,'Atlanta, GA':510,'Austin, TX':687,'Boston, MA':270,'Charlotte, NC':269,'Chicago, IL':900,'Columbus, OH':660,'Dallas, TX':992,'Denver, CO':266,'Houston, TX':336,'Kansas City, MO':114,'Las Vegas, NV':521,'Los Angeles, CA':614,'Miami, FL':370,'Minneapolis, MN':959,'Nashville, TN':318
};
function formatCurrency(n) {
return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0 }).format(n);
}
function getBaseFee(city, project, value, sqft, isCommercial) {
const specific = permitData[city]?.[project];
if (specific) return specific;
const avg = cityAvgs[city] || 507;
const percValue = isCommercial ? 0.02 value : 0.012 value;
const minBase = Math.max(avg, percValue);
if (project === 'Home Addition') {
return Math.max(minBase, sqft * 1.5);
}
if (project === 'Deck Construction') {
return Math.max(avg 1.2, percValue 0.5);
}
return minBase;
}
function calculate() {
const city = document.getElementById('city').value;
const project = document.getElementById('project').value;
const value = parseFloat(document.getElementById('value').value) || 15000;
const sqft = parseFloat(document.getElementById('sqft').value) || 0;
const isCommercial = document.getElementById('type').value === 'commercial';
const extrasPct = parseFloat(document.getElementById('extras').value) || 45;
Chuck's Take: Dallas wants nine ninety-two for a permit and Denver wants two sixty-six. Same country. Same code book, give or take. I promise you the inspectors in Denver are no less thorough.
- Leonard "Chuck" Thompson, LC Thompson Construction Co.
const base = getBaseFee(city, project, value, sqft, isCommercial);
const extras = base * (extrasPct / 100);
const total = base + extras;
const natAvg = 507;
const variance = ((total - natAvg) / natAvg * 100).toFixed(0);
document.getElementById('total').textContent = formatCurrency(total);
document.getElementById('context').innerHTML = `That's ${variance > 0 ? '+' : ''}${variance}% vs national. ${sqft > 0 && project === 'Home Addition' ? `Building permit cost per square foot: ${formatCurrency(total / sqft)}.` : ''}`;
// Chart bars
const chart = document.getElementById('chart');
chart.innerHTML = `
Base Fee
${formatCurrency(base)}
Hidden Fees
${formatCurrency(extras)}
Total
${formatCurrency(total)}
`;
setTimeout(() => {
document.querySelectorAll('.bar-fill').forEach(bar => {
bar.style.width = bar.dataset.width + '%';
});
}, 100);
Chuck's Take: That national average of five oh seven is a nice round number for a website. It has almost nothing to do with what you'll actually write a check for. Plan review fees, re-inspection fees, impact fees if you're in a growth corridor. I've pulled permits that started at four hundred and finished north of two thousand once the county got done stacking line items. Call your building department before you budget a single dollar.
- Leonard "Chuck" Thompson, LC Thompson Construction Co.
document.getElementById('results').style.display = 'block';
window.scrollTo({ top: document.getElementById('results').offsetTop - 100, behavior: 'smooth' });
}
function copyResults() {
const total = document.getElementById('total').textContent;
const context = document.getElementById('context').textContent;
navigator.clipboard.writeText(`My permit cost: ${total}. ${context}`);
alert('Results copied!');
}
Chuck's Take: I know people see a number like nine hundred in Chicago and think they'll just skip the permit on a small remodel. Let me be clear. The permit is not the expense. The permit is the receipt that says your work was done to code. The real expense comes when you sell the house and the buyer's inspector finds unpermitted work. Your closing price drops by ten times what that permit would have cost you. Pay the fee.
- Leonard "Chuck" Thompson, LC Thompson Construction Co.
// Auto calc on change
document.querySelectorAll('#calcForm input, #calcForm select').forEach(el => {
el.addEventListener('change', calculate);
el.addEventListener('input', () => {
document.getElementById('extrasVal').textContent = document.getElementById('extras').value + '%';
});
});
// Init
calculate();