Roof Repair Cost Estimator
ANA›Life Services Authority›National Calculator Authority›Roof Repair Cost Estimator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Roof Repair Cost Estimator
Estimate your roof repair costs based on damage size, roofing material, labor rates, and repair complexity. Includes material and labor cost breakdown.
Damaged Area (sq ft)
Roofing Material
Asphalt Shingles – 3-Tab Asphalt Shingles – Architectural Metal – Corrugated Metal – Standing Seam Wood Shake / Shingles Tile – Clay Tile – Concrete Flat Roof – TPO Flat Roof – EPDM Slate
Repair Complexity
Minor (patch, small leak, a few shingles) Moderate (section replacement, flashing repair) Major (large section, structural damage)
Roof Pitch
Low Pitch (2/12 – 4/12) Medium Pitch (4/12 – 7/12) Steep Pitch (7/12 – 12/12) Very Steep (12/12+)
Local Labor Rate ($/hr)
Number of Stories
1 Story 2 Stories 3+ Stories
Permit Required?
No Yes
Estimate Repair Cost
function rooCalc() { // --- Inputs --- var damageArea = parseFloat(document.getElementById('roo-damage-area').value); var materialType = document.getElementById('roo-material-type').value; var complexity = document.getElementById('roo-complexity').value; var pitch = document.getElementById('roo-pitch').value; var laborRate = parseFloat(document.getElementById('roo-labor-rate').value); var stories = parseInt(document.getElementById('roo-stories').value); var permit = document.getElementById('roo-permit').value; var resultDiv = document.getElementById('roo-result');
// --- Validation --- if (isNaN(damageArea) || damageArea ⚠ Please enter a valid damaged area (sq ft).'; return; } if (damageArea > 10000) { resultDiv.style.display = 'block'; resultDiv.innerHTML = '⚠ Damaged area seems too large. For full replacements, consider a full roof replacement estimator.'; return; } if (isNaN(laborRate) || laborRate 300) { resultDiv.style.display = 'block'; resultDiv.innerHTML = '⚠ Please enter a valid labor rate between $20 and $300 per hour.'; return; }
// --- Material Cost per sq ft (USD) --- // Source: HomeAdvisor, Angi, RSMeans 2023 averages var materialCostPerSqFt = { asphalt_3tab: 1.50, asphalt_architectural: 2.25, metal_corrugated: 3.50, metal_standing_seam: 7.00, wood_shake: 4.50, tile_clay: 8.00, tile_concrete: 5.50, flat_tpo: 4.00, flat_epdm: 3.75, slate: 12.00 };
var materialNames = { asphalt_3tab: 'Asphalt Shingles – 3-Tab', asphalt_architectural: 'Asphalt Shingles – Architectural', metal_corrugated: 'Metal – Corrugated', metal_standing_seam: 'Metal – Standing Seam', wood_shake: 'Wood Shake / Shingles', tile_clay: 'Tile – Clay', tile_concrete: 'Tile – Concrete', flat_tpo: 'Flat Roof – TPO', flat_epdm: 'Flat Roof – EPDM', slate: 'Slate' };
// --- Labor Hours per sq ft by complexity --- // Minor: ~0.05 hr/sqft | Moderate: ~0.12 hr/sqft | Major: ~0.22 hr/sqft var laborHoursPerSqFt = { minor: 0.05, moderate: 0.12, major: 0.22 };
// Minimum labor hours (mobilization / setup) var minLaborHours = { minor: 2, moderate: 4, major: 8 };
// --- Pitch Multiplier (increases labor difficulty) --- var pitchMultiplier = { low: 1.00, medium: 1.10, steep: 1.25, very_steep: 1.45 };
// --- Story Multiplier (height access difficulty) --- var storyMultiplier = { 1: 1.00, 2: 1.15, 3: 1.30 };
// --- Complexity Material Waste Factor --- // More complex repairs waste more material var wasteFactor = { minor: 1.05, moderate: 1.12, major: 1.20 };
// --- Core Calculations --- var matCostPerSqFt = materialCostPerSqFt[materialType]; var laborHrPerSqFt = laborHoursPerSqFt[complexity]; var pitchMult = pitchMultiplier[pitch]; var storyMult = storyMultiplier[stories]; var waste = wasteFactor[complexity];
// Material Cost = damageArea × materialCostPerSqFt × wasteFactor var materialCost = damageArea * matCostPerSqFt * waste;
// Labor Hours = max(damageArea × laborHoursPerSqFt, minLaborHours) × pitchMultiplier × storyMultiplier var rawLaborHours = damageArea * laborHrPerSqFt; var adjLaborHours = Math.max(rawLaborHours, minLaborHours[complexity]) * pitchMult * storyMult;
// Labor Cost = adjLaborHours × laborRate var laborCost = adjLaborHours * laborRate;
// Disposal / Cleanup = 8% of (material + labor) var disposalCost = 0.08 * (materialCost + laborCost);
// Permit Cost (flat estimate if required) var permitCost = (permit === 'yes') ? 250 : 0;
// Subtotal var subtotal = materialCost + laborCost + disposalCost + permitCost;
// Contingency = 10% (unexpected damage, underlayment, flashing) var contingency = 0.10 * subtotal;
// Total var totalCost = subtotal + contingency;
// Low / High range (±15%) var lowEstimate = totalCost * 0.85; var highEstimate = totalCost * 1.15;
// Cost per sq ft var costPerSqFt = totalCost / damageArea;
// --- Format --- function fmt(n) { return '$' + n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } function fmtN(n) { return n.toFixed(1); }
resultDiv.style.display = 'block'; resultDiv.innerHTML = '### Estimated Roof Repair Cost ' +
'' + 'Total Estimated Cost' + '' + fmt(totalCost) + '' + 'Range: ' + fmt(lowEstimate) + ' – ' + fmt(highEstimate) + '' + '' +
'' + 'Cost ComponentAmount' + 'Material Cost' + damageArea + ' sq ft × ' + fmt(matCostPerSqFt) + '/sq ft × ' + waste.toFixed(2) + ' waste factor' + fmt(materialCost) + '' + 'Labor Cost' + fmtN(adjLaborHours) + ' hrs × $' + laborRate + '/hr (pitch & story adjusted)' + fmt(laborCost) + '' + 'Disposal & Cleanup8% of material + labor' + fmt(disposalCost) + '' + (permit === 'yes' ? 'Permit Fee' + fmt(permitCost) + '' : '') + 'Contingency (10%)Underlayment, flashing, hidden damage' + fmt(contingency) + '' + 'Total Estimate' + fmt(totalCost) + '' + '' +
'' + 'Key Metrics' + '• Material: ' + materialNames[materialType] + '' + '• Estimated labor hours: ' + fmtN(adjLaborHours) + ' hrs' + '• Cost per sq ft (total): ' + fmt(costPerSqFt) + '/sq ft' + '• Pitch multiplier applied: ' + pitchMult.toFixed(2) + 'x' + '• Story access multiplier: ' + storyMult.toFixed(2) + 'x' + ''; }
#### Formulas Used
Material Cost = Damaged Area (sq ft) × Material Cost/sq ft × Waste Factor
Labor Hours = max(Damaged Area × Labor hrs/sq ft, Minimum Hours) × Pitch Multiplier × Story Multiplier
Labor Cost = Adjusted Labor Hours × Hourly Labor Rate
Disposal Cost = 8% × (Material Cost + Labor Cost)
Subtotal = Material + Labor + Disposal + Permit (if applicable)
Total Cost = Subtotal × 1.10 (10% contingency for hidden damage)
Estimate Range = Total Cost ± 15%
Material costs per sq ft (USD): Asphalt 3-Tab $1.50 | Architectural $2.25 | Metal Corrugated $3.50 | Standing Seam $7.00 | Wood Shake $4.50 | Clay Tile $8.00 | Concrete Tile $5.50 | TPO $4.00 | EPDM $3.75 | Slate $12.00
Labor hrs/sq ft: Minor 0.05 | Moderate 0.12 | Major 0.22 — Pitch multipliers: Low 1.00× | Medium 1.10× | Steep 1.25× | Very Steep 1.45× — Story multipliers: 1-story 1.00× | 2-story 1.15× | 3+ story 1.30×
#### Assumptions & References
More Calculators
- Immersion Hours to Proficiency Level Calculator
- Sidereal Time Calculator
- Team Salary Cap Calculator
- Season Win Percentage Calculator
- Sports League Standings Points Calculator
- Irrigation Zone Coverage Calculator
- Pennsylvania Construction Permit Cost Estimator
- Pennsylvania Prevailing Wage Rate Calculator
- Pool Deck Square Footage Calculator
- Pool Filtration System Sizing Calculator
- Pool Excavation Volume Calculator