{"slug":"sewer-line-replacement-cost-calculator","lang":"en","category":"Plumbing","subcategory":"sewer costs","ui":{"inputs":[{"name":"task__camera_inspection","label":"Sewer camera inspection","type":"select","required":true,"default_value":"pro","options":[{"value":"skip","label":"Skip this task"},{"value":"pro","label":"Hire a pro"}]},{"name":"task__line_replacement","label":"Sewer line replacement (per linear ft)","type":"select","required":true,"default_value":"pro","options":[{"value":"skip","label":"Skip this task"},{"value":"pro","label":"Hire a pro"}]},{"name":"quantity__line_replacement","label":"Length of sewer line to replace","type":"number","required":true,"default_value":40,"min":0.1,"max":10000,"unit":"ft","help":"Enter the size in linear feet.","show_if":{"task__line_replacement":["pro"]}},{"name":"method","label":"Replacement method","type":"select","required":true,"default_value":"excavation","options":[{"value":"excavation","label":"Traditional excavation (trench)"},{"value":"pipe_bursting","label":"Trenchless: pipe bursting"},{"value":"lining","label":"Trenchless: cured-in-place lining (CIPP)"},{"value":"under_slab","label":"Under a concrete slab (break and patch)"}],"show_if":{"task__line_replacement":["pro"]}},{"name":"depth","label":"Pipe depth","type":"select","required":true,"default_value":"medium","options":[{"value":"shallow","label":"Shallow (under 4 ft)"},{"value":"medium","label":"Typical (4 to 8 ft)"},{"value":"deep","label":"Deep (over 8 ft)"}],"show_if":{"task__line_replacement":["pro"]}},{"name":"task__permit","label":"Sewer permit","type":"select","required":true,"default_value":"pro","options":[{"value":"skip","label":"Skip this task"},{"value":"pro","label":"Hire a pro"}]},{"name":"state","label":"Location (state or metro area)","type":"select","required":true,"default_value":"US","options":[{"value":"US","label":"National average"},{"value":"AL","label":"Alabama (AL)"},{"value":"AK","label":"Alaska (AK)"},{"value":"AZ","label":"Arizona (AZ)"},{"value":"AR","label":"Arkansas (AR)"},{"value":"CA","label":"California (CA)"},{"value":"CO","label":"Colorado (CO)"},{"value":"CT","label":"Connecticut (CT)"},{"value":"DE","label":"Delaware (DE)"},{"value":"FL","label":"Florida (FL)"},{"value":"GA","label":"Georgia (GA)"},{"value":"HI","label":"Hawaii (HI)"},{"value":"ID","label":"Idaho (ID)"},{"value":"IL","label":"Illinois (IL)"},{"value":"IN","label":"Indiana (IN)"},{"value":"IA","label":"Iowa (IA)"},{"value":"KS","label":"Kansas (KS)"},{"value":"KY","label":"Kentucky (KY)"},{"value":"LA","label":"Louisiana (LA)"},{"value":"ME","label":"Maine (ME)"},{"value":"MD","label":"Maryland (MD)"},{"value":"MA","label":"Massachusetts (MA)"},{"value":"MI","label":"Michigan (MI)"},{"value":"MN","label":"Minnesota (MN)"},{"value":"MS","label":"Mississippi (MS)"},{"value":"MO","label":"Missouri (MO)"},{"value":"MT","label":"Montana (MT)"},{"value":"NE","label":"Nebraska (NE)"},{"value":"NV","label":"Nevada (NV)"},{"value":"NH","label":"New Hampshire (NH)"},{"value":"NJ","label":"New Jersey (NJ)"},{"value":"NM","label":"New Mexico (NM)"},{"value":"NY","label":"New York (NY)"},{"value":"NC","label":"North Carolina (NC)"},{"value":"ND","label":"North Dakota (ND)"},{"value":"OH","label":"Ohio (OH)"},{"value":"OK","label":"Oklahoma (OK)"},{"value":"OR","label":"Oregon (OR)"},{"value":"PA","label":"Pennsylvania (PA)"},{"value":"RI","label":"Rhode Island (RI)"},{"value":"SC","label":"South Carolina (SC)"},{"value":"SD","label":"South Dakota (SD)"},{"value":"TN","label":"Tennessee (TN)"},{"value":"TX","label":"Texas (TX)"},{"value":"UT","label":"Utah (UT)"},{"value":"VT","label":"Vermont (VT)"},{"value":"VA","label":"Virginia (VA)"},{"value":"WA","label":"Washington (WA)"},{"value":"WV","label":"West Virginia (WV)"},{"value":"WI","label":"Wisconsin (WI)"},{"value":"WY","label":"Wyoming (WY)"},{"value":"DC","label":"District of Columbia (DC)"},{"value":"M10420","label":"Akron, OH (metro)"},{"value":"M10580","label":"Albany-Schenectady-Troy, NY (metro)"},{"value":"M10740","label":"Albuquerque, NM (metro)"},{"value":"M10900","label":"Allentown-Bethlehem-Easton, PA-NJ (metro)"},{"value":"M11260","label":"Anchorage, AK (metro)"},{"value":"M12060","label":"Atlanta-Sandy Springs-Alpharetta, GA (metro)"},{"value":"M12260","label":"Augusta-Richmond County, GA-SC (metro)"},{"value":"M12420","label":"Austin-Round Rock-San Marcos, TX (metro)"},{"value":"M12540","label":"Bakersfield-Delano, CA (metro)"},{"value":"M12580","label":"Baltimore-Columbia-Towson, MD (metro)"},{"value":"M12940","label":"Baton Rouge, LA (metro)"},{"value":"M13820","label":"Birmingham-Hoover, AL (metro)"},{"value":"M14260","label":"Boise City, ID (metro)"},{"value":"M14460","label":"Boston-Cambridge-Newton, MA-NH (metro)"},{"value":"M14860","label":"Bridgeport-Stamford-Norwalk, CT (metro)"},{"value":"M15380","label":"Buffalo-Cheektowaga, NY (metro)"},{"value":"M15980","label":"Cape Coral-Fort Myers, FL (metro)"},{"value":"M16700","label":"Charleston-North Charleston, SC (metro)"},{"value":"M16740","label":"Charlotte-Concord-Gastonia, NC-SC (metro)"},{"value":"M16860","label":"Chattanooga, TN-GA (metro)"},{"value":"M16980","label":"Chicago-Naperville-Elgin, IL-IN-WI (metro)"},{"value":"M17140","label":"Cincinnati, OH-KY-IN (metro)"},{"value":"M17410","label":"Cleveland, OH (metro)"},{"value":"M17820","label":"Colorado Springs, CO (metro)"},{"value":"M17900","label":"Columbia, SC (metro)"},{"value":"M18140","label":"Columbus, OH (metro)"},{"value":"M18580","label":"Corpus Christi, TX (metro)"},{"value":"M19100","label":"Dallas-Fort Worth-Arlington, TX (metro)"},{"value":"M19660","label":"Deltona-Daytona Beach-Ormond Beach, FL (metro)"},{"value":"M19740","label":"Denver-Aurora-Lakewood, CO (metro)"},{"value":"M19780","label":"Des Moines-West Des Moines, IA (metro)"},{"value":"M19820","label":"Detroit-Warren-Dearborn, MI (metro)"},{"value":"M20500","label":"Durham-Chapel Hill, NC (metro)"},{"value":"M21340","label":"El Paso, TX (metro)"},{"value":"M22020","label":"Fargo, ND-MN (metro)"},{"value":"M22180","label":"Fayetteville, NC (metro)"},{"value":"M23060","label":"Fort Wayne, IN (metro)"},{"value":"M23420","label":"Fresno, CA (metro)"},{"value":"M24340","label":"Grand Rapids-Wyoming-Kentwood, MI (metro)"},{"value":"M24660","label":"Greensboro-High Point, NC (metro)"},{"value":"M24860","label":"Greenville-Anderson-Greer, SC (metro)"},{"value":"M25060","label":"Gulfport-Biloxi, MS (metro)"},{"value":"M25420","label":"Harrisburg-Carlisle, PA (metro)"},{"value":"M25540","label":"Hartford-West Hartford-East Hartford, CT (metro)"},{"value":"M26420","label":"Houston-The Woodlands-Sugar Land, TX (metro)"},{"value":"M26620","label":"Huntsville, AL (metro)"},{"value":"M26900","label":"Indianapolis-Carmel-Anderson, IN (metro)"},{"value":"M27140","label":"Jackson, MS (metro)"},{"value":"M27260","label":"Jacksonville, FL (metro)"},{"value":"M28140","label":"Kansas City, MO-KS (metro)"},{"value":"M28940","label":"Knoxville, TN (metro)"},{"value":"M29460","label":"Lakeland-Winter Haven, FL (metro)"},{"value":"M29540","label":"Lancaster, PA (metro)"},{"value":"M29620","label":"Lansing-East Lansing, MI (metro)"},{"value":"M29740","label":"Las Cruces, NM (metro)"},{"value":"M29820","label":"Las Vegas-Henderson-Paradise, NV (metro)"},{"value":"M30460","label":"Lexington-Fayette, KY (metro)"},{"value":"M30780","label":"Little Rock-North Little Rock-Conway, AR (metro)"},{"value":"M31080","label":"Los Angeles-Long Beach-Anaheim, CA (metro)"},{"value":"M31140","label":"Louisville/Jefferson County, KY-IN (metro)"},{"value":"M31540","label":"Madison, WI (metro)"},{"value":"M31700","label":"Manchester-Nashua, NH (metro)"},{"value":"M32580","label":"McAllen-Edinburg-Mission, TX (metro)"},{"value":"M32820","label":"Memphis, TN-MS-AR (metro)"},{"value":"M33100","label":"Miami-Fort Lauderdale-West Palm Beach, FL (metro)"},{"value":"M33340","label":"Milwaukee-Waukesha, WI (metro)"},{"value":"M33460","label":"Minneapolis-St. Paul-Bloomington, MN-WI (metro)"},{"value":"M33660","label":"Mobile, AL (metro)"},{"value":"M33700","label":"Modesto, CA (metro)"},{"value":"M34980","label":"Nashville-Davidson-Murfreesboro-Franklin, TN (metro)"},{"value":"M35300","label":"New Haven, CT (metro)"},{"value":"M35380","label":"New Orleans-Metairie, LA (metro)"},{"value":"M35620","label":"New York-Newark-Jersey City, NY-NJ-PA (metro)"},{"value":"M35840","label":"North Port-Bradenton-Sarasota, FL (metro)"},{"value":"M36100","label":"Ocala, FL (metro)"},{"value":"M36420","label":"Oklahoma City, OK (metro)"},{"value":"M36540","label":"Omaha, NE-IA (metro)"},{"value":"M36740","label":"Orlando-Kissimmee-Sanford, FL (metro)"},{"value":"M37100","label":"Oxnard-Thousand Oaks-Ventura, CA (metro)"},{"value":"M37340","label":"Palm Bay-Melbourne-Titusville, FL (metro)"},{"value":"M37860","label":"Pensacola-Ferry Pass-Brent, FL (metro)"},{"value":"M37980","label":"Philadelphia-Camden-Wilmington, PA-NJ-DE-MD (metro)"},{"value":"M38060","label":"Phoenix-Mesa-Chandler, AZ (metro)"},{"value":"M38300","label":"Pittsburgh, PA (metro)"},{"value":"M38940","label":"Port St. Lucie, FL (metro)"},{"value":"M38860","label":"Portland-South Portland, ME (metro)"},{"value":"M38900","label":"Portland-Vancouver-Hillsboro, OR-WA (metro)"},{"value":"M39300","label":"Providence-Warwick, RI-MA (metro)"},{"value":"M39340","label":"Provo-Orem-Lehi, UT (metro)"},{"value":"M39580","label":"Raleigh-Cary, NC (metro)"},{"value":"M39900","label":"Reno, NV (metro)"},{"value":"M40060","label":"Richmond, VA (metro)"},{"value":"M40140","label":"Riverside-San Bernardino-Ontario, CA (metro)"},{"value":"M40380","label":"Rochester, NY (metro)"},{"value":"M40900","label":"Sacramento-Roseville-Folsom, CA (metro)"},{"value":"M41420","label":"Salem, OR (metro)"},{"value":"M41620","label":"Salt Lake City-Murray, UT (metro)"},{"value":"M41700","label":"San Antonio-New Braunfels, TX (metro)"},{"value":"M41740","label":"San Diego-Chula Vista-Carlsbad, CA (metro)"},{"value":"M41860","label":"San Francisco-Oakland-Berkeley, CA (metro)"},{"value":"M41940","label":"San Jose-Sunnyvale-Santa Clara, CA (metro)"},{"value":"M42220","label":"Santa Rosa-Petaluma, CA (metro)"},{"value":"M42340","label":"Savannah, GA (metro)"},{"value":"M42540","label":"Scranton--Wilkes-Barre, PA (metro)"},{"value":"M42660","label":"Seattle-Tacoma-Bellevue, WA (metro)"},{"value":"M43340","label":"Shreveport-Bossier City, LA (metro)"},{"value":"M43620","label":"Sioux Falls, SD (metro)"},{"value":"M44060","label":"Spokane-Spokane Valley, WA (metro)"},{"value":"M41180","label":"St. Louis, MO-IL (metro)"},{"value":"M44700","label":"Stockton, CA (metro)"},{"value":"M45060","label":"Syracuse, NY (metro)"},{"value":"M45300","label":"Tampa-St. Petersburg-Clearwater, FL (metro)"},{"value":"M45780","label":"Toledo, OH (metro)"},{"value":"M45940","label":"Trenton-Princeton, NJ (metro)"},{"value":"M46060","label":"Tucson, AZ (metro)"},{"value":"M46140","label":"Tulsa, OK (metro)"},{"value":"M46520","label":"Urban Honolulu, HI (metro)"},{"value":"M47260","label":"Virginia Beach-Norfolk-Newport News, VA-NC (metro)"},{"value":"M47900","label":"Washington-Arlington-Alexandria, DC-VA-MD-WV (metro)"},{"value":"M48620","label":"Wichita, KS (metro)"},{"value":"M49180","label":"Winston-Salem, NC (metro)"},{"value":"M49340","label":"Worcester, MA-CT (metro)"},{"value":"M49660","label":"Youngstown-Warren, OH (metro)"}],"help":"Labor costs vary by state and metro area (a metro area replaces the state figure); material costs are assumed nationwide."}]},"logic_script":"var QTY_MAX = {\"sq_ft\":100000,\"square\":1000,\"each\":1000,\"linear_ft\":10000,\"hour\":2000};\nvar QTY_MAX_LABEL = {\"sq_ft\":\"100,000\",\"square\":\"1,000\",\"each\":\"1,000\",\"linear_ft\":\"10,000\",\"hour\":\"2,000\"};\nvar UNIT_ONE = {\"sq_ft\":\"sq ft\",\"square\":\"roofing square (100 sq ft)\",\"each\":\"unit\",\"linear_ft\":\"linear ft\",\"hour\":\"hour\",\"project\":\"project\"};\nvar UNIT_MANY = {\"sq_ft\":\"sq ft\",\"square\":\"roofing squares\",\"each\":\"units\",\"linear_ft\":\"linear ft\",\"hour\":\"hours\",\"project\":\"projects\"};\nfunction selOpt(mod, value) {\n  for (var i = 0; i < mod.options.length; i++) { if (mod.options[i].value === value) return mod.options[i]; }\n  for (var i = 0; i < mod.options.length; i++) { if (mod.options[i].value === mod.default) return mod.options[i]; }\n  return null;\n}\nfunction applyMods(itemId, qty, steps) {\n  var matProd = 1, laborProd = 1, addM = [0, 0, 0], addL = [0, 0, 0];\n  var mods = data.modifiers || [];\n  for (var i = 0; i < mods.length; i++) {\n    var m = mods[i];\n    if (m.kind === 'qty_tier' && m.applies_to.indexOf(itemId) !== -1) {\n      var tier = null;\n      for (var ti = 0; ti < m.tiers.length; ti++) { if (qty >= m.tiers[ti].min_qty && (!tier || m.tiers[ti].min_qty > tier.min_qty)) tier = m.tiers[ti]; }\n      if (tier) {\n        var tl = tier.labor_mult !== undefined ? tier.labor_mult : 1;\n        var tm = tier.material_mult !== undefined ? tier.material_mult : 1;\n        laborProd *= tl; matProd *= tm;\n        var tparts = [];\n        if (tl !== 1) tparts.push('labor x' + tl);\n        if (tm !== 1) tparts.push('materials x' + tm);\n        steps.push(m.label + ': ' + tier.min_qty + ' or more qualifies (' + tparts.join(', ') + ')' + (tier.basis === 'reasoned' ? ' (estimate adjustment' + (tier.rationale ? ': ' + tier.rationale : '') + ')' : '') + '.');\n      }\n      continue;\n    }\n    if (m.kind !== 'select' || m.applies_to.indexOf(itemId) === -1) continue;\n    var val = inputs[m.id]; if (val === undefined || val === null || val === '') val = m.default;\n    var opt = selOpt(m, val);\n    if (!opt) continue;\n    var lm = opt.labor_mult !== undefined ? opt.labor_mult : 1;\n    var mm = opt.material_mult !== undefined ? opt.material_mult : 1;\n    laborProd *= lm; matProd *= mm;\n    if (opt.add) {\n      var per = opt.add.per === 'qty' ? qty : 1;\n      var lsA = opt.add.labor_share;\n      addM[0] += opt.add.low * (1 - lsA) * per; addM[1] += opt.add.mid * (1 - lsA) * per; addM[2] += opt.add.high * (1 - lsA) * per;\n      addL[0] += opt.add.low * lsA * per; addL[1] += opt.add.mid * lsA * per; addL[2] += opt.add.high * lsA * per;\n    }\n    if (opt.value !== m.default) {\n      steps.push(m.label + ': ' + opt.label + (opt.basis === 'reasoned' ? ' (estimate adjustment' + (opt.rationale ? ': ' + opt.rationale : '') + ')' : '') + '.');\n    }\n  }\n  return { matProd: matProd, laborProd: laborProd, addM: addM, addL: addL };\n}\n// Un paso de cantidad/info: acc <op> (by x scale). \"by\" numerico o id de un valor de \"vals\".\nfunction stepApply(acc, st, vals) {\n  var by = typeof st.by === 'number' ? st.by : vals[st.by];\n  if (st.scale !== undefined) by = by * st.scale;\n  if (st.op === 'mul') return acc * by;\n  if (st.op === 'div') return acc / by;\n  if (st.op === 'add') return acc + by;\n  return acc - by;\n}\n// Entrada compartida (data.shared_inputs) por id.\nfunction sharedById(id) {\n  var list = data.shared_inputs || [];\n  for (var i = 0; i < list.length; i++) { if (list[i].id === id) return list[i]; }\n  return null;\n}\n// Devuelve { found, qty, invalidField }: found=false = itemId no tiene DerivedQty (usar la\n// cantidad manual de siempre); found=true, qty=null = SI tiene, pero el resultado no es un numero\n// utilizable (entradas extremas -> overflow a Infinity, o <= 0): antes se dejaba pasar y\n// aparecia 'Infinity'/el guion largo en steps/footprint (el fuzzing de validateToolLogic lo\n// detecta como salida invalida sin marcar el campo culpable, CA bloqueante).\nfunction derivedFor(itemId, steps) {\n  var mods = data.modifiers || [];\n  for (var i = 0; i < mods.length; i++) {\n    var m = mods[i];\n    if (m.kind !== 'derived' || m.item !== itemId) continue;\n    var vals = {};\n    // Entradas: primero las compartidas (campo shared__<id>, una sola vez en la UI), luego las propias.\n    var specs = [];\n    var sh = m.shared || [];\n    for (var q = 0; q < sh.length; q++) { var si = sharedById(sh[q]); specs.push({ id: sh[q], field: 'shared__' + sh[q], def: si ? si.default : 1 }); }\n    for (var j = 0; j < m.inputs.length; j++) { specs.push({ id: m.inputs[j].id, field: m.id + '__' + m.inputs[j].id, def: m.inputs[j].default }); }\n    for (var j = 0; j < specs.length; j++) {\n      var raw = inputs[specs[j].field];\n      // Campo ausente (p. ej. un test_case que no lo nombra): valor por defecto. Presente pero no\n      // numérico o ≤ 0 (\"abc\", vacío): se señala en su campo; antes se sustituía en silencio por el\n      // valor por defecto y el usuario no veía el error (smoke-test de painting, 29/09).\n      if (raw === undefined || raw === null) { vals[specs[j].id] = specs[j].def; continue; }\n      var v = lib.numEn(raw);\n      if (!isFinite(v) || v <= 0) return { found: true, qty: null, invalidField: specs[j].field };\n      vals[specs[j].id] = v;\n    }\n    var acc = vals[specs[0].id];\n    for (var k = 0; k < m.steps.length; k++) acc = stepApply(acc, m.steps[k], vals);\n    if (m.round === 'ceil') acc = Math.ceil(acc);\n    if (!isFinite(acc) || acc <= 0) return { found: true, qty: null, invalidField: specs[0].field };\n    steps.push(m.label + ': ' + lib.round(acc, 2) + ' ' + m.unit + '.');\n    return { found: true, qty: acc, invalidField: null };\n  }\n  return { found: false, qty: null, invalidField: null };\n}\n// Salidas informativas (modifiers kind 'info') de la partida: parten de su cantidad final y no\n// cambian el coste. \"by\" numerico, id de un select con valores numericos o input (propio o\n// compartido) de su DerivedQty. Devuelve una lista { label, unit, value }.\nfunction infoValuesFor(itemId, qty) {\n  var out = [];\n  var mods = data.modifiers || [];\n  for (var i = 0; i < mods.length; i++) {\n    var m = mods[i];\n    if (m.kind !== 'info' || m.item !== itemId) continue;\n    var vals = {};\n    for (var j = 0; j < mods.length; j++) {\n      var d = mods[j];\n      if (d.kind === 'select') { var sv = inputs[d.id]; vals[d.id] = Number((sv === undefined || sv === null || sv === '') ? d.default : sv); }\n      else if (d.kind === 'derived' && d.item === itemId) {\n        var dsh = d.shared || [];\n        for (var k = 0; k < dsh.length; k++) {\n          var sv2 = inputs['shared__' + dsh[k]]; var sdef = sharedById(dsh[k]);\n          vals[dsh[k]] = (sv2 === undefined || sv2 === null) ? (sdef ? sdef.default : 1) : lib.numEn(sv2);\n        }\n        for (var k = 0; k < d.inputs.length; k++) {\n          var iv = inputs[d.id + '__' + d.inputs[k].id];\n          vals[d.inputs[k].id] = (iv === undefined || iv === null) ? d.inputs[k].default : lib.numEn(iv);\n        }\n      }\n    }\n    var acc = qty;\n    for (var s = 0; s < m.steps.length; s++) acc = stepApply(acc, m.steps[s], vals);\n    if (m.round === 'ceil') acc = Math.ceil(acc);\n    if (!isFinite(acc)) continue;\n    out.push({ label: m.label, unit: m.unit, value: acc });\n  }\n  return out;\n}\nfunction infoRowsFor(itemId, qty, result, steps) {\n  var rows = infoValuesFor(itemId, qty);\n  for (var r = 0; r < rows.length; r++) {\n    result[rows[r].label] = lib.round(rows[r].value, 2) + ' ' + rows[r].unit;\n    steps.push(rows[r].label + ': ' + lib.round(rows[r].value, 2) + ' ' + rows[r].unit + '.');\n  }\n}\n// Cobro minimo (data.minimum_charge): low/mid/high nunca bajan de esas cifras (no aplica si todo es\n// DIY). Lo que se sube se cuenta como mano de obra para que Materials + Labor cuadre con el total.\nfunction applyMin(t, allDiy, steps) {\n  var mc = data.minimum_charge;\n  if (!mc || allDiy) return t;\n  var low = Math.max(t.low, mc.low), mid = Math.max(t.mid, mc.mid), high = Math.max(t.high, mc.high);\n  if (mid !== t.mid) {\n    steps.push('Minimum charge: most contractors bill at least ' + lib.usd(mc.mid) + ' for a job like this, so the typical cost is raised from ' + lib.usd(t.mid) + ' to ' + lib.usd(mid) + '.');\n  } else if (low !== t.low || high !== t.high) {\n    steps.push('Minimum charge: the low and high estimates are raised to ' + lib.usd(low) + ' and ' + lib.usd(high) + '.');\n  }\n  return { low: low, mid: mid, high: high, matMid: t.matMid, labMid: t.labMid + (mid - t.mid), savedLabor: t.savedLabor };\n}\nfunction ratioFor(state) {\n  var ratio = 1, place = 'the U.S. (national average)';\n  if (table && table.rows) { for (var r = 0; r < table.rows.length; r++) { if (table.rows[r][0] === state) { ratio = Number(table.rows[r][2]); if (state !== 'US') place = String(table.rows[r][1]); break; } } }\n  if (!isFinite(ratio) || ratio <= 0) ratio = 1;\n  return { ratio: ratio, place: place };\n}\nfunction computeItem(item, qty, qMult, ratio, diyAllowed, diy, steps) {\n  var mods = applyMods(item.id, qty, steps);\n  var ls = item.labor_share;\n  var baseLow = qty * item.low * qMult, baseMid = qty * item.mid * qMult, baseHigh = qty * item.high * qMult;\n  var matLow = baseLow * (1 - ls) * mods.matProd + mods.addM[0];\n  var matMid = baseMid * (1 - ls) * mods.matProd + mods.addM[1];\n  var matHigh = baseHigh * (1 - ls) * mods.matProd + mods.addM[2];\n  var labLow = baseLow * ls * mods.laborProd * ratio + mods.addL[0] * ratio;\n  var labMid = baseMid * ls * mods.laborProd * ratio + mods.addL[1] * ratio;\n  var labHigh = baseHigh * ls * mods.laborProd * ratio + mods.addL[2] * ratio;\n  var doDiy = diyAllowed && diy;\n  return {\n    low: doDiy ? matLow : matLow + labLow, mid: doDiy ? matMid : matMid + labMid, high: doDiy ? matHigh : matHigh + labHigh,\n    matMid: matMid, labMid: doDiy ? 0 : labMid, savedLabor: labMid\n  };\n}\nif (!data.items.length) return { result: 'No tasks available.', footprint: 'No cost data available.', invalid: 'task__' };\nvar rf = ratioFor(inputs.state);\nvar ratio = rf.ratio, place = rf.place;\nvar totalLow = 0, totalMid = 0, totalHigh = 0, totalMat = 0, totalLab = 0, totalSaved = 0;\nvar anySelected = false, anyDiy = false, anyPro = false;\nvar infoTotals = {}, infoOrder = [];\nvar steps = [];\nfor (var idx = 0; idx < data.items.length; idx++) {\n  var it = data.items[idx];\n  var task = inputs['task__' + it.id];\n  if (!task || task === 'skip') continue;\n  anySelected = true;\n  var derivedSteps = [];\n  var derived = derivedFor(it.id, derivedSteps);\n  var qty;\n  if (derived.found) {\n    if (derived.qty === null) return { result: 'Enter valid measurements greater than 0 for ' + it.label + '.', footprint: 'Waiting for valid measurements.', invalid: derived.invalidField };\n    qty = derived.qty;\n  } else {\n    qty = it.unit === 'project' ? 1 : lib.numEn(inputs['quantity__' + it.id]);\n    if (!isFinite(qty) || qty <= 0) return { result: 'Enter a project size greater than 0 for ' + it.label + '.', footprint: 'Waiting for a valid project size.', invalid: 'quantity__' + it.id };\n    if (QTY_MAX[it.unit] && qty > QTY_MAX[it.unit]) return { result: 'Enter ' + QTY_MAX_LABEL[it.unit] + ' ' + UNIT_MANY[it.unit] + ' or less.', footprint: 'Waiting for a valid project size.', invalid: 'quantity__' + it.id };\n  }\n  var itemDiyOk = it.diy_allowed !== false;\n  var diy = itemDiyOk && task === 'diy';\n  if (diy) anyDiy = true; else anyPro = true;\n  var modSteps = [];\n  var comp = computeItem(it, qty, 1, ratio, itemDiyOk, diy, modSteps);\n  totalLow += comp.low; totalMid += comp.mid; totalHigh += comp.high; totalMat += comp.matMid; totalLab += comp.labMid; if (diy) totalSaved += comp.savedLabor; // solo lo que de verdad haces tú (antes sumaba también la mano de obra de las tareas en pro)\n  var unitQty = qty === 1 ? (UNIT_ONE[it.unit] || it.unit) : (UNIT_MANY[it.unit] || it.unit);\n  steps = steps.concat(derivedSteps);\n  var unitOneS = UNIT_ONE[it.unit] || it.unit;\n  var unitPrice = it.mid < 100 ? 2 : 0;\n  steps.push(it.label + ': national typical price ' + lib.usd(it.mid, unitPrice) + ' per ' + unitOneS + ' (range ' + lib.usd(it.low, unitPrice) + ' to ' + lib.usd(it.high, unitPrice) + ').');\n  steps.push(it.label + ' (' + (diy ? 'DIY, materials only' : 'pro') + '): ' + qty + ' ' + unitQty + ' x ' + lib.usd(it.mid, unitPrice) + ' = ' + lib.usd(qty * it.mid) + ' before adjustments.');\n  steps = steps.concat(modSteps);\n  steps.push(it.label + ' (' + (diy ? 'DIY' : 'pro') + ') after ' + (diy ? 'materials adjustments' : 'the regional labor factor and adjustments') + ': ' + lib.usd(comp.mid) + ' (range ' + lib.usd(comp.low) + ' to ' + lib.usd(comp.high) + ').');\n  // Salidas informativas: las de igual etiqueta de todas las tareas activas se suman.\n  var taskInfo = infoValuesFor(it.id, qty);\n  for (var ii = 0; ii < taskInfo.length; ii++) {\n    var infoKey = taskInfo[ii].label;\n    if (!infoTotals[infoKey]) { infoTotals[infoKey] = { unit: taskInfo[ii].unit, value: 0 }; infoOrder.push(infoKey); }\n    infoTotals[infoKey].value += taskInfo[ii].value;\n  }\n}\nif (!anySelected) return { result: 'Select at least one task.', footprint: 'Waiting for at least one task.', invalid: 'task__' + data.items[0].id };\nvar minSteps = [];\nvar grand = applyMin({ low: totalLow, mid: totalMid, high: totalHigh, matMid: totalMat, labMid: totalLab, savedLabor: totalSaved }, !anyPro, minSteps);\ntotalLow = grand.low; totalMid = grand.mid; totalHigh = grand.high; totalLab = grand.labMid;\nvar result = {\n  'Typical cost': lib.usd(totalMid),\n  'Low estimate': lib.usd(totalLow),\n  'High estimate': lib.usd(totalHigh),\n  'Materials': lib.usd(totalMat),\n  'Labor': lib.usd(totalLab)\n};\nif (anyDiy) result['DIY labor savings'] = lib.usd(totalSaved);\nfor (var io = 0; io < infoOrder.length; io++) {\n  var infoRow = infoTotals[infoOrder[io]];\n  result[infoOrder[io]] = lib.round(infoRow.value, 2) + ' ' + infoRow.unit;\n  steps.push('Total for all selected tasks, ' + infoOrder[io] + ': ' + lib.round(infoRow.value, 2) + ' ' + infoRow.unit + '.');\n}\nsteps = steps.concat(minSteps);\nif (inputs.state && inputs.state !== 'US') {\n  steps.push('Labor wages in ' + place + ' are adjusted with the BLS regional factor for this trade.');\n}\nsteps.push('Total for all selected tasks: ' + lib.usd(totalMid) + ' (range ' + lib.usd(totalLow) + ' to ' + lib.usd(totalHigh) + ').');\nvar footprint = 'Selected tasks in ' + place + ': typical cost ' + lib.usd(totalMid) + '.';\nreturn { result: result, footprint: footprint, steps: steps };","reference_table":{"caption":"Regional labor cost adjustment (state or metro area wage vs. the national average, BLS OEWS)","headers":["Location","Name","Labor cost factor"],"rows":[["US","National average",1],["AL","Alabama",0.8002],["AK","Alaska",1.2534],["AZ","Arizona",0.9414],["AR","Arkansas",0.7017],["CA","California",1.1406],["CO","Colorado",0.9573],["CT","Connecticut",1.0448],["DE","Delaware",0.9437],["FL","Florida",0.7764],["GA","Georgia",0.8067],["HI","Hawaii",1.1474],["ID","Idaho",0.8099],["IL","Illinois",1.2942],["IN","Indiana",1.0484],["IA","Iowa",0.9703],["KS","Kansas",0.9895],["KY","Kentucky",0.9543],["LA","Louisiana",0.8677],["ME","Maine",0.9224],["MD","Maryland",1.0186],["MA","Massachusetts",1.2527],["MI","Michigan",1.0704],["MN","Minnesota",1.2013],["MS","Mississippi",0.7855],["MO","Missouri",1.0394],["MT","Montana",1.0834],["NE","Nebraska",0.9105],["NV","Nevada",0.9909],["NH","New Hampshire",0.9177],["NJ","New Jersey",1.2829],["NM","New Mexico",0.8562],["NY","New York",1.161],["NC","North Carolina",0.7859],["ND","North Dakota",0.9167],["OH","Ohio",0.9658],["OK","Oklahoma",0.8171],["OR","Oregon",1.3641],["PA","Pennsylvania",1.0676],["RI","Rhode Island",1.1308],["SC","South Carolina",0.7744],["SD","South Dakota",0.7694],["TN","Tennessee",0.8383],["TX","Texas",0.8422],["UT","Utah",0.8897],["VT","Vermont",0.9558],["VA","Virginia",0.8404],["WA","Washington",1.2304],["WV","West Virginia",0.8145],["WI","Wisconsin",1.1739],["WY","Wyoming",0.8576],["DC","District of Columbia",1.2637],["M10420","Akron, OH",0.9573],["M10580","Albany-Schenectady-Troy, NY",1.1269],["M10740","Albuquerque, NM",0.8991],["M10900","Allentown-Bethlehem-Easton, PA-NJ",1.046],["M11260","Anchorage, AK",1.2372],["M12060","Atlanta-Sandy Springs-Alpharetta, GA",0.8316],["M12260","Augusta-Richmond County, GA-SC",0.779],["M12420","Austin-Round Rock-San Marcos, TX",0.8835],["M12540","Bakersfield-Delano, CA",1.0546],["M12580","Baltimore-Columbia-Towson, MD",0.9807],["M12940","Baton Rouge, LA",0.969],["M13820","Birmingham-Hoover, AL",0.8224],["M14260","Boise City, ID",0.8261],["M14460","Boston-Cambridge-Newton, MA-NH",1.286],["M14860","Bridgeport-Stamford-Norwalk, CT",1.1014],["M15380","Buffalo-Cheektowaga, NY",1.0212],["M15980","Cape Coral-Fort Myers, FL",0.7549],["M16700","Charleston-North Charleston, SC",0.8066],["M16740","Charlotte-Concord-Gastonia, NC-SC",0.8056],["M16860","Chattanooga, TN-GA",0.8307],["M16980","Chicago-Naperville-Elgin, IL-IN-WI",1.3362],["M17140","Cincinnati, OH-KY-IN",0.9778],["M17410","Cleveland, OH",0.9654],["M17820","Colorado Springs, CO",0.8998],["M17900","Columbia, SC",0.7639],["M18140","Columbus, OH",0.958],["M18580","Corpus Christi, TX",0.8053],["M19100","Dallas-Fort Worth-Arlington, TX",0.8627],["M19660","Deltona-Daytona Beach-Ormond Beach, FL",0.7635],["M19740","Denver-Aurora-Lakewood, CO",0.9964],["M19780","Des Moines-West Des Moines, IA",1.0147],["M19820","Detroit-Warren-Dearborn, MI",1.1322],["M20500","Durham-Chapel Hill, NC",0.8124],["M21340","El Paso, TX",0.7797],["M22020","Fargo, ND-MN",0.9131],["M22180","Fayetteville, NC",0.7578],["M23060","Fort Wayne, IN",1.0844],["M23420","Fresno, CA",1.0533],["M24340","Grand Rapids-Wyoming-Kentwood, MI",1.0594],["M24660","Greensboro-High Point, NC",0.7791],["M24860","Greenville-Anderson-Greer, SC",0.7777],["M25060","Gulfport-Biloxi, MS",0.8116],["M25420","Harrisburg-Carlisle, PA",1.0885],["M25540","Hartford-West Hartford-East Hartford, CT",1.0373],["M26420","Houston-The Woodlands-Sugar Land, TX",0.8849],["M26620","Huntsville, AL",0.8103],["M26900","Indianapolis-Carmel-Anderson, IN",1.0567],["M27140","Jackson, MS",0.7929],["M27260","Jacksonville, FL",0.8068],["M28140","Kansas City, MO-KS",1.0951],["M28940","Knoxville, TN",0.8384],["M29460","Lakeland-Winter Haven, FL",0.752],["M29540","Lancaster, PA",0.9267],["M29620","Lansing-East Lansing, MI",1.0272],["M29740","Las Cruces, NM",0.7787],["M29820","Las Vegas-Henderson-Paradise, NV",0.9728],["M30460","Lexington-Fayette, KY",0.9243],["M30780","Little Rock-North Little Rock-Conway, AR",0.709],["M31080","Los Angeles-Long Beach-Anaheim, CA",1.1117],["M31140","Louisville/Jefferson County, KY-IN",0.9915],["M31540","Madison, WI",1.1998],["M31700","Manchester-Nashua, NH",0.9302],["M32580","McAllen-Edinburg-Mission, TX",0.6518],["M32820","Memphis, TN-MS-AR",0.8383],["M33100","Miami-Fort Lauderdale-West Palm Beach, FL",0.8013],["M33340","Milwaukee-Waukesha, WI",1.2353],["M33460","Minneapolis-St. Paul-Bloomington, MN-WI",1.2752],["M33660","Mobile, AL",0.8143],["M33700","Modesto, CA",1.006],["M34980","Nashville-Davidson-Murfreesboro-Franklin, TN",0.874],["M35300","New Haven, CT",1.0592],["M35380","New Orleans-Metairie, LA",0.8718],["M35620","New York-Newark-Jersey City, NY-NJ-PA",1.2584],["M35840","North Port-Bradenton-Sarasota, FL",0.7977],["M36100","Ocala, FL",0.7359],["M36420","Oklahoma City, OK",0.8506],["M36540","Omaha, NE-IA",0.9855],["M36740","Orlando-Kissimmee-Sanford, FL",0.7758],["M37100","Oxnard-Thousand Oaks-Ventura, CA",1.0321],["M37340","Palm Bay-Melbourne-Titusville, FL",0.8132],["M37860","Pensacola-Ferry Pass-Brent, FL",0.7426],["M37980","Philadelphia-Camden-Wilmington, PA-NJ-DE-MD",1.1592],["M38060","Phoenix-Mesa-Chandler, AZ",0.9785],["M38300","Pittsburgh, PA",1.045],["M38940","Port St. Lucie, FL",0.766],["M38860","Portland-South Portland, ME",0.9372],["M38900","Portland-Vancouver-Hillsboro, OR-WA",1.3955],["M39300","Providence-Warwick, RI-MA",1.1362],["M39340","Provo-Orem-Lehi, UT",0.8183],["M39580","Raleigh-Cary, NC",0.8354],["M39900","Reno, NV",1.0506],["M40060","Richmond, VA",0.8444],["M40140","Riverside-San Bernardino-Ontario, CA",1.0208],["M40380","Rochester, NY",1.0191],["M40900","Sacramento-Roseville-Folsom, CA",1.0592],["M41420","Salem, OR",1.1017],["M41620","Salt Lake City-Murray, UT",0.9393],["M41700","San Antonio-New Braunfels, TX",0.8032],["M41740","San Diego-Chula Vista-Carlsbad, CA",1.0888],["M41860","San Francisco-Oakland-Berkeley, CA",1.28],["M41940","San Jose-Sunnyvale-Santa Clara, CA",1.5835],["M42220","Santa Rosa-Petaluma, CA",1.0819],["M42340","Savannah, GA",0.8246],["M42540","Scranton--Wilkes-Barre, PA",0.9041],["M42660","Seattle-Tacoma-Bellevue, WA",1.3337],["M43340","Shreveport-Bossier City, LA",0.7996],["M43620","Sioux Falls, SD",0.7883],["M44060","Spokane-Spokane Valley, WA",1.0492],["M41180","St. Louis, MO-IL",1.1233],["M44700","Stockton, CA",0.9985],["M45060","Syracuse, NY",0.992],["M45300","Tampa-St. Petersburg-Clearwater, FL",0.7704],["M45780","Toledo, OH",1.0145],["M45940","Trenton-Princeton, NJ",1.2304],["M46060","Tucson, AZ",0.8092],["M46140","Tulsa, OK",0.8197],["M46520","Urban Honolulu, HI",1.1627],["M47260","Virginia Beach-Norfolk-Newport News, VA-NC",0.8214],["M47900","Washington-Arlington-Alexandria, DC-VA-MD-WV",1.0405],["M48620","Wichita, KS",0.9253],["M49180","Winston-Salem, NC",0.7367],["M49340","Worcester, MA-CT",1.1731],["M49660","Youngstown-Warren, OH",0.9058]]},"cost_data":{"trade":"sewer","version":"v1","country":"us","currency":"USD","retrieved_at":"2026-09-30","labor_soc":"47-2152","diy_allowed":false,"mode":"sum","items":[{"id":"camera_inspection","label":"Sewer camera inspection","unit":"project","low":100,"mid":300,"high":500,"labor_share":0.9,"diy_allowed":false,"default_task":"pro","default_qty":1,"sources":[{"label":"This Old House - Sewer Line Replacement Cost","url":"https://www.thisoldhouse.com/plumbing/sewer-line-replacement-cost","quote":"camera inspections cost $100–$500","retrieved_at":"2026-09-30","low":100,"high":500},{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"A video inspection of a sewer line can cost anywhere between $100 and $500.","retrieved_at":"2026-09-30","low":100,"high":500},{"label":"Forbest USA - How Much Do Plumbers Charge to Inspect a Sewer Line","url":"https://www.forbestusa.com/blogs/resources/how-much-do-plumbers-charge-to-inspect-a-sewer-line","quote":"In most areas, plumbers charge between $150 and $450 to camera a sewer line.","retrieved_at":"2026-10-03","low":150,"high":450},{"label":"Mokher Plumbing - Sewer Camera Inspection Cost","url":"https://mokherplumbing.com/sewer-camera-inspection-cost-guide/","quote":"Homes with cleanout access points usually pay $125 to $500","retrieved_at":"2026-10-03","low":125,"high":500}]},{"id":"line_replacement","label":"Sewer line replacement (per linear ft)","unit":"linear_ft","low":50,"mid":125,"high":250,"labor_share":0.7,"diy_allowed":false,"default_task":"pro","default_qty":40,"qty_label":"Length of sewer line to replace","sources":[{"label":"This Old House - Sewer Line Replacement Cost","url":"https://www.thisoldhouse.com/plumbing/sewer-line-replacement-cost","quote":"Longer lines require more materials and labor, typically costing $50–$250 per linear foot.","retrieved_at":"2026-09-30","low":50,"high":250},{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"Homeowners could pay between $50 and $250 per foot","retrieved_at":"2026-09-30","low":50,"high":250},{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"the cost is usually closer to $50 to $125 per foot","retrieved_at":"2026-09-30","low":50,"high":125},{"label":"The 5 Star Plumbing - Sewer Line Replacement Guide","url":"https://the5starplumbing.com/blog/sewer-line-replacement-guide-methods-costs-and-when-you-need-it/","quote":"Per linear foot: roughly $50–$250, averaging around $150/ft including materials and labor","retrieved_at":"2026-10-03","low":50,"high":250},{"label":"AP Plumbing - Is Trenchless Sewer Line Repair Cheaper","url":"https://applumbing.com/blog/is-trenchless-sewer-line-repair-cheaper/","quote":"The average cost of trenchless repairs can range from $60 to $250 per foot of pipe.","retrieved_at":"2026-10-03","low":60,"high":250}]},{"id":"permit","label":"Sewer permit","unit":"project","low":100,"mid":200,"high":500,"labor_share":0,"diy_allowed":false,"default_task":"pro","default_qty":1,"sources":[{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"most homeowners can expect to pay about $200","retrieved_at":"2026-09-30","low":200,"high":200},{"label":"Mike's Plumbing & Rooter - Permit to Replace a Sewer Line","url":"https://www.mikeplumbingrooter.com/do-i-need-a-permit-to-replace-my-sewer-line","quote":"Usually, you will pay between $100 and $500 for a sewer line replacement permit.","retrieved_at":"2026-10-03","low":100,"high":500},{"label":"Fast Response Plumbing - Sewer Repair Permit Fees","url":"https://www.fastresponseplumbingsf.com/sewer-repair-permit-fees-explained-for-homeowners","quote":"Permit fees for sewer line repairs typically range from $50 to $500","retrieved_at":"2026-10-03","low":50,"high":500}]}],"modifiers":[{"kind":"select","id":"method","label":"Replacement method","applies_to":["line_replacement"],"default":"excavation","options":[{"value":"excavation","label":"Traditional excavation (trench)","basis":"sourced","labor_mult":1,"material_mult":1,"sources":[{"label":"This Old House - Sewer Line Replacement Cost","url":"https://www.thisoldhouse.com/plumbing/sewer-line-replacement-cost","quote":"Traditional excavation is often less expensive upfront, ranging from $50–$200 per linear foot","retrieved_at":"2026-09-30","low":50,"high":200}]},{"value":"pipe_bursting","label":"Trenchless: pipe bursting","basis":"sourced_ratio","labor_mult":1.04,"material_mult":1.04,"sources":[{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"This process costs between $60 and $200 per foot.","retrieved_at":"2026-09-30","low":60,"high":200}]},{"value":"lining","label":"Trenchless: cured-in-place lining (CIPP)","basis":"sourced_ratio","labor_mult":1.32,"material_mult":1.32,"sources":[{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"costs $80 to $250 per foot","retrieved_at":"2026-09-30","low":80,"high":250}]},{"value":"under_slab","label":"Under a concrete slab (break and patch)","basis":"sourced_ratio","labor_mult":2.6,"material_mult":2.6,"sources":[{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/","quote":"repairing or replacing a sewer line under a slab costs $300 to $350 per foot","retrieved_at":"2026-09-30","low":300,"high":350}]}]},{"kind":"select","id":"depth","label":"Pipe depth","applies_to":["line_replacement"],"default":"medium","options":[{"value":"shallow","label":"Shallow (under 4 ft)","basis":"reasoned","labor_mult":0.9,"material_mult":1,"rationale":"Less digging and no trench shoring. No source gives a depth multiplier: estimate on the labor share only."},{"value":"medium","label":"Typical (4 to 8 ft)","basis":"reasoned","labor_mult":1,"material_mult":1,"rationale":"Reference depth of the sourced per-foot prices."},{"value":"deep","label":"Deep (over 8 ft)","basis":"reasoned","labor_mult":1.3,"material_mult":1,"rationale":"Deeper trenches take longer and usually need shoring (This Old House: deeper pipes take more time and specialized equipment). Estimate on the labor share only."}]}]},"cost_data_ref":{"trade":"sewer","version":"v1"},"price_date":"2026-09","title":"Sewer Line Replacement Cost Calculator","description":"Estimate the cost of replacing a sewer line based on pipe length, replacement method, depth, and local labor rates.","seo_title":"Sewer Line Replacement Cost Estimate Calculator","seo_description":"Get a precise sewer line replacement cost estimate. Calculate prices based on pipe length, trenchless or excavation methods, depth, and your local area.","seo_footprint":{"text_intro":"Replacing a main sewer line is a major plumbing project that requires careful planning and a clear understanding of the potential expenses. This calculator provides a detailed sewer line replacement cost estimate by factoring in the specific variables of your project. By adjusting the length of the pipe, the chosen replacement method (such as traditional excavation or trenchless options), the depth of the pipe, and regional labor rates across the United States, you can generate a highly accurate baseline for your budget. Whether you are dealing with a shallow line in a suburban yard or a complex replacement under a concrete slab, understanding these cost drivers is essential before hiring a professional.","faq":[{"question":"What is the average cost of replacing a sewer line?","answer":"On average, replacing 40 linear feet of sewer line, including a preliminary camera inspection, costs around $5,300 nationally. Prices typically range from a low estimate of $2,100 to a high estimate of $10,500 depending on the chosen method, the depth of the pipe, and local labor rates in your specific metropolitan area."},{"question":"How much does it cost to replace a short sewer line at 4 feet deep?","answer":"For a shallow pipe (under 4 feet deep), the labor required for excavation is significantly reduced. Replacing 40 linear feet of shallow sewer line using traditional methods averages about $4,650 nationally, without factoring in additional inspections or permits. The baseline cost for the replacement itself is typically around $125 per linear foot."},{"question":"Can a homeowner replace their own sewer line?","answer":"No, sewer line replacement is not a do-it-yourself project. It requires heavy earth-moving machinery, specialized knowledge of municipal plumbing codes, and professional permits. Improper installation can lead to severe environmental hazards and property damage. Always hire a licensed and insured professional for this trade."},{"question":"Can a sewer line be replaced without digging?","answer":"Yes, trenchless methods are available and often preferred to save landscaping. Options like pipe bursting or cured-in-place lining (CIPP) require minimal excavation, usually just small access points at the ends of the pipe. For example, a 40-foot trenchless pipe bursting replacement averages $5,200 nationally, excluding inspection and permit fees."},{"question":"Why do labor costs vary so much by location?","answer":"Plumbing labor rates are heavily influenced by the local cost of living and regional demand. While materials remain relatively consistent nationwide, the hourly rate for a licensed plumbing crew changes by state and metro area. For instance, a standard sewer camera inspection that costs $300 on average nationally might cost $269 in the Austin, TX metropolitan area due to regional labor adjustments."}],"how_to_use_steps":["Select whether to include a professional sewer camera inspection and enter the project size.","Choose the sewer line replacement task and input the total length of the pipe in linear feet.","Specify the replacement method, such as traditional excavation, pipe bursting, cured-in-place lining, or under a concrete slab.","Select the pipe depth, ranging from shallow (under 4 feet) to deep (over 8 feet).","Indicate if a professional sewer permit is required for the project.","Choose your state or metropolitan area to adjust the labor costs to your local market."]},"content_sections":[{"heading":"Understanding Sewer Line Replacement Costs","paragraphs":["The main sewer line is a critical component of any home's plumbing system, responsible for carrying wastewater from the house to the municipal sewer main. When this line fails due to age, shifting soil, or severe blockages, a full replacement is often the only viable solution. The total expense of a sewer line replacement depends heavily on the length of the pipe and the amount of excavation required to access it.","Because this work involves significant labor, heavy machinery, and strict adherence to local building codes, it is one of the more expensive plumbing repairs a homeowner can face. Getting a reliable sewer line replacement cost estimate early in the process helps in securing financing and comparing quotes from licensed professionals."]},{"heading":"Excavation vs. Trenchless Methods","paragraphs":["The method chosen to replace the pipe is a primary driver of the final cost. Traditional excavation involves digging a trench along the entire length of the pipe. While the per-foot cost of the pipe itself might be standard, the labor to dig, backfill, and repair landscaping adds up quickly. Alternatively, replacing a pipe under a concrete slab requires breaking and patching the concrete, which is highly labor-intensive.","Trenchless methods, such as pipe bursting and cured-in-place lining (CIPP), offer a less destructive alternative. Pipe bursting involves pulling a new pipe through the old one, fracturing the old pipe outward. CIPP involves inserting a resin-coated liner into the existing pipe, which then hardens to form a new pipe within the old one. While trenchless methods often have higher material costs, they drastically reduce excavation labor and preserve driveways and gardens."]},{"heading":"The Impact of Depth and Location","paragraphs":["Pipe depth plays a significant role in determining the labor required for the job. A shallow pipe (under 4 feet) is relatively easy to access and requires minimal shoring to protect workers. In contrast, a deep pipe (over 8 feet) requires extensive excavation, specialized safety equipment, and significantly more time, driving up the overall price.","Additionally, local labor rates can drastically change the final bill. The plumbing industry sees wide variations in hourly wages depending on the metropolitan area. A project that costs a certain amount at the national average will be adjusted up or down based on the specific state or city selected, reflecting the true cost of hiring a professional crew in that market."]},{"heading":"Worked Example: 40-Foot Replacement","paragraphs":["Consider a standard residential project requiring 40 linear feet of sewer line replacement using traditional excavation at a typical depth of 4 to 8 feet. To ensure the job is done correctly, the homeowner also includes a professional camera inspection to locate the issue.","Based on national averages, this comprehensive project has a typical cost of $5,300. This total breaks down to approximately $1,530 in materials and $3,770 in labor. Depending on specific site conditions and regional pricing variations, the low estimate for this exact scope of work would be $2,100, while a high estimate could reach $10,500."]},{"heading":"Common Mistakes in Sewer Line Projects","paragraphs":["One of the most common mistakes is skipping the initial camera inspection. While it adds an average of $300 to the project nationally, a camera inspection precisely locates the damage, preventing unnecessary digging and ensuring the correct replacement method is chosen.","Another frequent error is failing to account for permit costs. Municipalities strictly regulate sewer connections, and a professional permit (averaging $200 nationally) is mandatory to ensure the work meets code. Attempting to bypass this step can result in heavy fines and require the work to be completely redone."]}],"sources":[{"label":"U.S. Bureau of Labor Statistics (BLS), Occupational Employment and Wage Statistics","url":"https://www.bls.gov/oes/"},{"label":"This Old House - Sewer Line Replacement Cost","url":"https://www.thisoldhouse.com/plumbing/sewer-line-replacement-cost"},{"label":"Bob Vila - Sewer Line Replacement Cost","url":"https://www.bobvila.com/articles/sewer-line-replacement-cost/"},{"label":"Forbest USA - How Much Do Plumbers Charge to Inspect a Sewer Line","url":"https://www.forbestusa.com/blogs/resources/how-much-do-plumbers-charge-to-inspect-a-sewer-line"}],"default_output":{"result":{"Typical cost":"$5,500","Low estimate":"$2,200","High estimate":"$11,000","Materials":"$1,730","Labor":"$3,770"},"footprint":"Selected tasks in the U.S. (national average): typical cost $5,500.","steps":["Sewer camera inspection: national typical price $300 per project (range $100 to $500).","Sewer camera inspection (pro): 1 project x $300 = $300 before adjustments.","Sewer camera inspection (pro) after the regional labor factor and adjustments: $300 (range $100 to $500).","Sewer line replacement (per linear ft): national typical price $125 per linear ft (range $50 to $250).","Sewer line replacement (per linear ft) (pro): 40 linear ft x $125 = $5,000 before adjustments.","Sewer line replacement (per linear ft) (pro) after the regional labor factor and adjustments: $5,000 (range $2,000 to $10,000).","Sewer permit: national typical price $200 per project (range $100 to $500).","Sewer permit (pro): 1 project x $200 = $200 before adjustments.","Sewer permit (pro) after the regional labor factor and adjustments: $200 (range $100 to $500).","Total for all selected tasks: $5,500 (range $2,200 to $11,000)."]},"status":"published","reviewed_at":"2026-10-18","verification_note":"Lote de 15 adelantado (18/10)"}