Window Repair vs Replacement Cost Calculator

ANALife Services AuthorityNational Calculator Authority›Window Repair vs Replacement Cost Calculator

.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; } }

Window Repair vs Replacement Cost Calculator

Compare the total cost of repairing your existing windows versus replacing them, factoring in energy savings, lifespan, and maintenance over time.

Number of Windows

Window Type

Single-Pane Double-Pane Triple-Pane Bay / Picture Window

Current Window Age (years)

Damage / Condition Level

Minor (cracked seal, small crack) Moderate (broken hardware, fogging) Severe (rotted frame, multiple panes broken)

Estimated Repair Cost per Window ($)

Estimated Replacement Cost per Window ($)

Current Annual Energy Bill ($)

Expected Energy Savings from Replacement (%)

Analysis Period (years)

Discount Rate / Inflation (% per year)

Calculate

function winCalc() { var resultDiv = document.getElementById('win-result');

var numWindows = parseFloat(document.getElementById('win-num-windows').value); var windowType = document.getElementById('win-window-type').value; var windowAge = parseFloat(document.getElementById('win-window-age').value); var damageLevel = document.getElementById('win-damage-level').value; var repairCostEach = parseFloat(document.getElementById('win-repair-cost').value); var replaceCostEach = parseFloat(document.getElementById('win-replace-cost').value); var annualEnergy = parseFloat(document.getElementById('win-annual-energy').value); var energySavPct = parseFloat(document.getElementById('win-energy-savings-pct').value); var years = parseFloat(document.getElementById('win-analysis-years').value); var discountRate = parseFloat(document.getElementById('win-discount-rate').value);

// --- Validation --- var errors = []; if (isNaN(numWindows) || numWindows 100) errors.push("Number of windows must be between 1 and 100."); if (isNaN(windowAge) || windowAge 100) errors.push("Window age must be between 0 and 100 years."); if (isNaN(repairCostEach) || repairCostEach 50) errors.push("Energy savings must be between 0% and 50%."); if (isNaN(years) || years 40) errors.push("Analysis period must be between 1 and 40 years."); if (isNaN(discountRate) || discountRate 20) errors.push("Discount rate must be between 0% and 20%.");

if (errors.length > 0) { resultDiv.innerHTML = 'Please fix the following:' + errors.map(function(e){ return ''; }).join('') + ''; return; }

// --- Window type lifespan & base replacement cost multipliers --- var typeData = { single: { lifespan: 15, costMult: 0.75, label: "Single-Pane" }, double: { lifespan: 20, costMult: 1.00, label: "Double-Pane" }, triple: { lifespan: 25, costMult: 1.35, label: "Triple-Pane" }, bay: { lifespan: 20, costMult: 2.20, label: "Bay/Picture" } }; var td = typeData[windowType];

// --- Damage multiplier on repair cost --- var damageMult = { minor: 1.0, moderate: 1.6, severe: 2.8 }; var damageLabel = { minor: "Minor", moderate: "Moderate", severe: "Severe" }; var adjRepairCostEach = repairCostEach * damageMult[damageLevel];

// --- Remaining useful life after repair (years) --- // Repaired window gets a fraction of remaining lifespan based on damage var remainingLifeRaw = Math.max(0, td.lifespan - windowAge); var repairLifeExtension = { minor: 0.80, moderate: 0.50, severe: 0.25 }; var remainingLifeAfterRepair = remainingLifeRaw * repairLifeExtension[damageLevel];

// New replacement window gets full lifespan var replacementLifespan = td.lifespan;

// --- Recurring maintenance cost per window per year --- // Repaired windows need more upkeep; replacement windows need less var annualMaintRepair = adjRepairCostEach * 0.05; // 5% of repair cost/yr var annualMaintReplace = replaceCostEach * 0.01; // 1% of replacement cost/yr

// --- Energy savings per year from replacement --- var annualEnergySavings = annualEnergy * (energySavPct / 100);

// --- Discount rate --- var r = discountRate / 100;

// --- Present Value helper --- function pvAnnuity(annualAmt, n, rate) { if (rate === 0) return annualAmt * n; return annualAmt * (1 - Math.pow(1 + rate, -n)) / rate; }

// ============================================================ // REPAIR SCENARIO // ============================================================ // Upfront repair cost (all windows) var repairUpfront = adjRepairCostEach * numWindows;

// PV of annual maintenance over analysis period var pvMaintRepair = pvAnnuity(annualMaintRepair * numWindows, years, r);

// If repaired windows won't last the full analysis period, we need
// a mid-period replacement for the remaining years
var pvMidReplacement = 0;
var midReplacementNote = "";
if (remainingLifeAfterRepair 0
? (replaceUpfront - repairUpfront) / annualBenefitReplace
Infinity;

if (damageLevel === "severe" || savings > 0) { recommendation = "✓ Replacement is recommended. Over " + years + " years, replacement saves approximately $" + Math.abs(savings).toLocaleString('en-US', {maximumFractionDigits:0}) + " compared to repair."; recClass = "calc-good"; } else { recommendation = "⚠ Repair is recommended. Over " + years + " years, repair costs approximately $" + Math.abs(savings).toLocaleString('en-US', {maximumFractionDigits:0}) + " less than replacement."; recClass = "calc-warn"; }

var paybackStr = isFinite(paybackYears) && paybackYears > 0
? paybackYears.toFixed(1) + " years"
"N/A (replacement not cost-effective on energy alone)";

resultDiv.innerHTML = '### Results Summary ' + '' + 'ItemRepairReplacement' + 'Upfront Cost (all windows)$' + repairUpfront.toLocaleString('en-US',{maximumFractionDigits:0}) + '$' + replaceUpfront.toLocaleString('en-US',{maximumFractionDigits:0}) + '' + 'PV of Maintenance (' + years + ' yrs)$' + pvMaintRepair.toLocaleString('en-US',{maximumFractionDigits:0}) + '$' + pvMaintReplace.toLocaleString('en-US',{maximumFractionDigits:0}) + '' + 'PV of Mid-Period Replacement$' + pvMidReplacement.toLocaleString('en-US',{maximumFractionDigits:0}) + '—' + 'PV of Energy Savings (' + years + ' yrs)—-$' + pvEnergySavings.toLocaleString('en-US',{maximumFractionDigits:0}) + '' + 'Total Net Present Cost$' + totalRepairCost.toLocaleString('en-US',{maximumFractionDigits:0}) + '$' + totalReplaceCost.toLocaleString('en-US',{maximumFractionDigits:0}) + '' + '' + 'Window Type: ' + td.label + ' | Damage Level: ' + damageLabel[damageLevel] + ' | Adj. Repair Cost/Window: $' + adjRepairCostEach.toLocaleString('en-US',{maximumFractionDigits:0}) + '

' + 'Annual Energy Savings (replacement): $' + annualEnergySavings.toLocaleString('en-US',{maximumFractionDigits:0}) + '/yr

' + 'Simple Payback Period (replacement): ' + paybackStr + '

' + (midReplacementNote ? 'ⓘ ' + midReplacementNote + '

' : '') + '' + recommendation + '

'; }

#### Formulas Used

Adjusted Repair Cost per Window: Adj. Repair Cost = Repair Cost × Damage Multiplier (Minor = 1.0×, Moderate = 1.6×, Severe = 2.8×)

Present Value of Annuity (maintenance / energy savings): PV = A × [1 − (1 + r)^(−n)] / r where A = annual amount, r = discount rate, n = years

Total Net Present Cost — Repair: Totalrepair = (Adj. Repair Cost × N) + PV(Maintenancerepair) + PV(Mid-Period Replacement, if needed)

Total Net Present Cost — Replacement: Totalreplace = (Replace Cost × Type Multiplier × N) + PV(Maintenancereplace) − PV(Energy Savings)

Annual Energy Savings: Savings = Annual Energy Bill × (Energy Savings % / 100)

Simple Payback Period: Payback = (Replace Upfront − Repair Upfront) / (Annual Energy Savings − Annual Maintenance Difference)

Remaining Life After Repair: Remaining Life = (Window Lifespan − Current Age) × Repair Life Extension Factor (Minor = 80%, Moderate = 50%, Severe = 25%)

#### Assumptions & References

More Calculators

Read Next

Study Time Planner ANA › Life Services Authority › National Calculator Authority › Study Time Planner .calc-container { max-width: 640px; margin:...

References