BESS installation labour estimator

A takeoff and man-hour model for the electrical scope of a grid-scale battery site — DC and AC cable pulling, terminations, conduit, and the BESS-specific work that no general electrical labour book has a line for. It ships the structure. You bring the labour units.

What this is, and is not. An estimating aid, not a bid and not a compliance document. It computes man-hours from quantities and the labour units you supply; it does not tell you what those units should be. Check the result against your own history before it leaves your desk.

Direct man-hoursMan-daysCostnothing priced yet — type your first unit value in 02 and hours appear here

Twenty 5 MWh enclosures on one conversion block. Row spacing assumed typical for a utility-scale site.

Cable schedule

Each line becomes a pull and its terminations. Conductors per run is asked rather than assumed: a DC pull carrying + and − is ONE run with TWO conductors, and the units are per conductor-foot — getting it backwards doubles or halves the largest line on the sheet.

Cable schedule
ScopeRunsLength (ft)Conductors / runSizeRemove
Enclosure internals — cabinets to a connection box (off)

For a block where the run from each cabinet to its connection box differs enough to be worth stating separately. Each cabinet adds its own pull and terminations to the takeoff.

Conversion scope, derived: 1 PCS skid · 1 transformer · 4 MV runs · 900 tray-ft. Change the enclosure count and these follow it.

MV collection and comms — the values the schedule does not carry

Polarity is a conductor, not a run. A DC pull carrying + and − is one pull with two conductors, and the cable rows are priced per conductor-foot. Getting this backwards doubles or halves the biggest line on the sheet.

0 of 28 unit values entered28 rows of scope need 28 unit values at Normal — 28 still to enter.

This tool ships the structure of a BESS electrical takeoff — 316 unit records across 25 categories — and no labour values. That is deliberate. Published labour-unit manuals are commercial products and their tables are not ours to redistribute, and inventing numbers for a page whose stated use is checking a contractor’s bid would be worse than shipping none. So you bring the units: from your own licensed source, or from what your own crews actually book.

Values stay in this browser. Nothing you enter is transmitted or stored on a server. The blank template never contains a value. Your filled sheet and the estimate export do — they are your numbers, in a file only you have.

Enter them here — 0 of 28 doneman-hours per unit, at Normal · 3 of these do not vary by condition and are stored once
  1. Enclosure DC output to conversion block — 500 kcmil
    22680 conductor-ft
    dcCablePull.conduit.500kcmil
    Unit
    500 kcmil conductor pulled in conduit
    Size
    500 kcmil
    Priced per
    perConductorFoot
    Install method
    inConduit
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per CONDUCTOR foot, not per raceway foot.
    mh / 1,000 ft
  2. Enclosure DC output to conversion block — lugs, Compression lug, two hole, 500 kcmil
    480 each
    termination.comp-2hole.500kcmil
    Unit
    Compression lug, two hole, 500 kcmil
    Size
    500 kcmil
    Priced per
    perConnection
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Torque and witness
    included in this unit
    Condition
    three values; this writes Normal
    Note
    Includes torque-to-spec and witness mark, so no separate torque row.
    mh / each
  3. DC equipment grounding conductor — #4/0
    1890 conductor-ft
    dcCablePull.conduit.no4-0
    Unit
    #4/0 conductor pulled in conduit
    Size
    #4/0
    Priced per
    perConductorFoot
    Install method
    inConduit
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per CONDUCTOR foot, not per raceway foot.
    mh / 1,000 ft
  4. DC equipment grounding conductor — lugs, Compression lug, two hole, #4/0
    40 each
    termination.comp-2hole.no4-0
    Unit
    Compression lug, two hole, #4/0
    Size
    #4/0
    Priced per
    perConnection
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Torque and witness
    included in this unit
    Condition
    three values; this writes Normal
    Note
    Includes torque-to-spec and witness mark, so no separate torque row.
    mh / each
  5. Underground DC duct — enclosures to combiner — PVC Sch 40, 3"
    2400 raceway-ft
    conduit.pvc40.3in
    Unit
    PVC Sch 40, 3"
    Size
    3"
    Priced per
    perRacewayFoot
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per raceway foot. Conductors are priced separately.
    mh / 100 ft
  6. Underground DC duct — combiner to PCS — PVC Sch 40, 4"
    7830 raceway-ft
    conduit.pvc40.4in
    Unit
    PVC Sch 40, 4"
    Size
    4"
    Priced per
    perRacewayFoot
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per raceway foot. Conductors are priced separately.
    mh / 100 ft
  7. Stub-ups / risers at battery enclosures — GRC / RMC steel, 3"
    240 raceway-ft
    conduit.grc.3in
    Unit
    GRC / RMC steel, 3"
    Size
    3"
    Priced per
    perRacewayFoot
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per raceway foot. Conductors are priced separately.
    mh / 100 ft
  8. Stub-ups / risers at PCS skid — GRC / RMC steel, 4"
    100 raceway-ft
    conduit.grc.4in
    Unit
    GRC / RMC steel, 4"
    Size
    4"
    Priced per
    perRacewayFoot
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per raceway foot. Conductors are priced separately.
    mh / 100 ft
  9. BMS / comms raceway — EMT, 1"
    600 raceway-ft
    conduit.emt.1in
    Unit
    EMT, 1"
    Size
    1"
    Priced per
    perRacewayFoot
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Per raceway foot. Conductors are priced separately.
    mh / 100 ft
  10. Riser elbows at battery enclosures — GRC factory elbow, 3"
    160 each
    conduitFitting.grc-factory-elbow.3in
    Unit
    GRC factory elbow, 3"
    Size
    3"
    Priced per
    perFitting
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    Per fitting, installed.
    mh / each
  11. Riser elbows at PCS skid — GRC factory elbow, 4"
    80 each
    conduitFitting.grc-factory-elbow.4in
    Unit
    GRC factory elbow, 4"
    Size
    4"
    Priced per
    perFitting
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    Per fitting, installed.
    mh / each
  12. Enclosure conduit entries — GRC locknut and bushing set, 3"
    160 each
    conduitFitting.grc-locknut-bushing.3in
    Unit
    GRC locknut and bushing set, 3"
    Size
    3"
    Priced per
    perFitting
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    Per fitting, installed.
    mh / each
  13. Underground duct bends — PVC Sch 40 elbow, 3"
    240 each
    conduitFitting.pvc40-elbow.3in
    Unit
    PVC Sch 40 elbow, 3"
    Size
    3"
    Priced per
    perFitting
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    Per fitting, installed.
    mh / each
  14. Comms raceway elbows — EMT factory elbow, 1"
    280 each
    conduitFitting.emt-factory-elbow.1in
    Unit
    EMT factory elbow, 1"
    Size
    1"
    Priced per
    perFitting
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    Per fitting, installed.
    mh / each
  15. Comms raceway terminations — EMT set-screw box connector, 1"
    400 each
    conduitFitting.emt-connector.1in
    Unit
    EMT set-screw box connector, 1"
    Size
    1"
    Priced per
    perFitting
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    Per fitting, installed.
    mh / each
  16. Battery enclosure - hoist, set, level and shim, anchor with torque record
    20 each
    equipmentSet.enclosure
    Unit
    Battery enclosure - hoist, set, level and shim, anchor with torque record
    Priced per
    perAssembly
    Install method
    notApplicable
    Hours are
    man-hours, crew of 4
    Condition
    three values; this writes Normal
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  17. PCS skid - set, level, anchor
    1 each
    equipmentSet.pcsSkid
    Unit
    PCS skid - set, level, anchor
    Priced per
    perAssembly
    Install method
    notApplicable
    Hours are
    man-hours, crew of 4
    Condition
    three values; this writes Normal
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  18. MV transformer - set, level, anchor
    1 each
    equipmentSet.mvTransformer
    Unit
    MV transformer - set, level, anchor
    Priced per
    perAssembly
    Install method
    notApplicable
    Hours are
    man-hours, crew of 4
    Condition
    three values; this writes Normal
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  19. Maintenance service disconnect install
    20 each
    bessInternal.msd
    Unit
    Maintenance service disconnect install
    Priced per
    perCabinet
    Install method
    inCabinet
    Hours are
    man-hours, crew of 1
    Condition
    one value, used at every condition
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  20. OEM harness route, dress and land
    20 each
    bessInternal.harness
    Unit
    OEM harness route, dress and land
    Priced per
    perCabinet
    Install method
    inCabinet
    Hours are
    man-hours, crew of 1
    Condition
    one value, used at every condition
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  21. Coolant loop connect, fill, bleed
    20 each
    thermal.loopConnect
    Unit
    Coolant loop connect, fill, bleed
    Priced per
    perCabinet
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    one value, used at every condition
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  22. CAN / RS-485 daisy chain per rack
    40 each
    commsAndControls.canBus
    Unit
    CAN / RS-485 daisy chain per rack
    Priced per
    perLink
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  23. Insulation resistance test per DC circuit
    140 each
    testAndTurnover.irTest
    Unit
    Insulation resistance test per DC circuit
    Priced per
    perTest
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  24. Pack voltage and SoC balance verification before series connection
    20 each
    testAndTurnover.packBalance
    Unit
    Pack voltage and SoC balance verification before series connection
    Priced per
    perTest
    Install method
    notApplicable
    Hours are
    man-hours, crew of 1
    Condition
    three values; this writes Normal
    Note
    BESS-specific task. No general electrical labour book publishes a unit for this.
    mh / each
  25. HV elbow or deadbreak landing
    3 each
    transformerConnection.hv-elbow
    Unit
    HV elbow or deadbreak landing
    Priced per
    perConnection
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Torque and witness
    included in this unit
    Condition
    three values; this writes Normal
    Note
    Commissioning-adjacent scope a general electrical book does not carry.
    mh / each
  26. LV bushing landing
    3 each
    transformerConnection.lv-bushing
    Unit
    LV bushing landing
    Priced per
    perConnection
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Torque and witness
    included in this unit
    Condition
    three values; this writes Normal
    Note
    Commissioning-adjacent scope a general electrical book does not carry.
    mh / each
  27. Ground-grid bonding
    1 each
    transformerConnection.grid-bond
    Unit
    Ground-grid bonding
    Priced per
    perConnection
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Torque and witness
    included in this unit
    Condition
    three values; this writes Normal
    Note
    Commissioning-adjacent scope a general electrical book does not carry.
    mh / each
  28. Ladder tray, 18 in
    900 raceway-ft
    trayAndSupport.ladder-18
    Unit
    Ladder tray, 18 in
    Size
    18 in
    Priced per
    perRacewayFoot
    Install method
    notApplicable
    Hours are
    man-hours, crew of 2
    Condition
    three values; this writes Normal
    Note
    Tray and support steel. Conductors are priced separately.
    mh / 100 ft

Fill missing sizes from my own size step — 4 size families in this takeoff

Type your value for one size, then your own multiplier per size step. Larger sizes without a value follow upward from your nearest typed size; sizes below it stay open rather than dividing down. We ship no ladder — the anchor and the step are both yours, and a derived value always shows as a placeholder marked derived.

Bring them as a file instead — download the sheet, fill it, re-import
Partial estimate — not a total.

28 rows have no labour unit, so what you see below is the sum of the rows that do. It is not the scope. Per-MWh and per-enclosure figures are withheld until every row prices, because a normalised number computed over an incomplete scope is the most quotable wrong answer this tool could give you.

Direct man-hours
Man-days
Man-hours / MWh (this scope)
Man-hours / MW (this scope)
Man-hours / enclosure
Takeoff, categories, hours by craft, the cost build-up and the assumptions behind them. Unpriced rows export as blank with a reason, never as zero.

Scope: this takeoff covers the DC block and the MV collection. It does not include AC LV collection, MV collection, MV terminations, enclosure bonding, station service, protection and relaying, fire and gas detection, SCADA checkout. The per-MWh and per-enclosure figures are therefore for the scope above, not for a whole site — add the rest before comparing them to a contractor’s number.

Takeoff rows with quantity, unit and resulting man-hours
ScopeQuantityUnitMan-hoursActions
Enclosure DC output to conversion block — 500 kcmilDC cable pullingruns22680 conductor-ftneeds a value
Enclosure DC output to conversion block — lugs, Compression lug, two hole, 500 kcmilTerminationscount480 eachneeds a value
DC equipment grounding conductor — #4/0DC cable pullingruns1890 conductor-ftneeds a value
DC equipment grounding conductor — lugs, Compression lug, two hole, #4/0Terminationscount40 eachneeds a value
Underground DC duct — enclosures to combiner — PVC Sch 40, 3"Conduitft2400 raceway-ftneeds a value
Underground DC duct — combiner to PCS — PVC Sch 40, 4"Conduitft7830 raceway-ftneeds a value
Stub-ups / risers at battery enclosures — GRC / RMC steel, 3"Conduitft240 raceway-ftneeds a value
Stub-ups / risers at PCS skid — GRC / RMC steel, 4"Conduitft100 raceway-ftneeds a value
BMS / comms raceway — EMT, 1"Conduitft600 raceway-ftneeds a value
Riser elbows at battery enclosures — GRC factory elbow, 3"Conduit fittingscount160 eachneeds a value
Riser elbows at PCS skid — GRC factory elbow, 4"Conduit fittingscount80 eachneeds a value
Enclosure conduit entries — GRC locknut and bushing set, 3"Conduit fittingscount160 eachneeds a value
Underground duct bends — PVC Sch 40 elbow, 3"Conduit fittingscount240 eachneeds a value
Comms raceway elbows — EMT factory elbow, 1"Conduit fittingscount280 eachneeds a value
Comms raceway terminations — EMT set-screw box connector, 1"Conduit fittingscount400 eachneeds a value
Battery enclosure - hoist, set, level and shim, anchor with torque recordEquipment settingcount20 eachneeds a value
PCS skid - set, level, anchorEquipment settingcount1 eachneeds a value
MV transformer - set, level, anchorEquipment settingcount1 eachneeds a value
Maintenance service disconnect installBESS internal wiringcount20 eachneeds a value
OEM harness route, dress and landBESS internal wiringcount20 eachneeds a value
Coolant loop connect, fill, bleedThermal managementcount20 eachneeds a value
CAN / RS-485 daisy chain per rackComms and controlscount40 eachneeds a value
Insulation resistance test per DC circuitTest and turnovercount140 eachneeds a value
Pack voltage and SoC balance verification before series connectionTest and turnovercount20 eachneeds a value
HV elbow or deadbreak landingTransformer connectionscount3 eachneeds a value
LV bushing landingTransformer connectionscount3 eachneeds a value
Ground-grid bondingTransformer connectionscount1 eachneeds a value
Ladder tray, 18 inTray and supportsft900 raceway-ftneeds a value
316 units

Edit a quantity, remove a row, or add one from any of the 316 unit records — including the scopes this preset does not generate. Changing the block specification re-derives the generated rows and leaves your edits and additions alone.

Material and method — 7 factors, applied only where the unit allows

1.0 is no change. These multiply hours on the units that declare them eligible and are ignored everywhere else — an aluminium deduct on a termination is not harmless, it is wrong in direction.

Crew size converts man-days into calendar days, which is what equipment rental, temporary facilities and travel are charged against. Leave it blank and those three cannot be priced: man-days are calendar days multiplied by the crew, so charging a daily rate against them overstates it by the crew size.

Scheduled week, derived: 4 × 10 = 40 hours. Hours above the straight-time week set in 05 carry the overtime premium.

There is one clock. Attended hours per shift is the only divisor for duration and man-days — the efficiency factors multiply hours once and never take a second haircut off the same schedule.

No wage rates ship. Inventing a metro number is the same mistake as inventing a labour unit — it reads as authoritative and nobody can tell where it came from. Enter the rates from your own agreement or determination, and cost appears.

Rate fields appear here for each craft the takeoff uses — they follow from the hours, and no row carries hours yet. Enter unit values in 02 — Labour units and the wage fields arrive with the crafts.

Cost details — overtime split, prevailing wage, travel and site costs

Payroll tax and workers’ compensation ride the base wage, not the wage-plus-fringe package. Bona fide fringe paid into a plan is not taxable wages and is not payroll for comp rating, and burdening it overstates the largest number here by roughly 4% on a typical rate — more on a determination carrying a large fringe. Overtime premium rides the base wage only.

Cost withheld.

The estimate is partial, so a cost would be computed over an incomplete scope. Hours above are unaffected.

Hours by craft, direct and indirect
CraftMan-hours
Total0.0

Of the total, 0.0 man-hours are indirect — supervision and attendants, already inside the craft rows above. They ride in cost and in the total, and never in crew-days: supervision does not shorten the job.

A scenario carries the block, its rates, your row edits, the condition and size steps and the site factors — not your labour units, which have their own sheet in 02. Reset keeps the units too.

Why it ships without labour units

The obvious way to build this is to load a published labour manual into the page. That is not available to us, and the reason is worth stating plainly rather than hiding behind a disclaimer.

Manuals like NECA’s are commercial publications, and their labour-unit tables are the product being sold. Owning a copy licenses you to use it — including in your own estimating, on your own machine. It does not license anyone to republish the tables on a free web page. And the numbers are not raw facts that copyright leaves alone: they are predicted values reflecting editorial judgement, which courts have treated as protectable in exactly this shape.

The alternative — inventing plausible-looking units so the tool shows a total on landing — is worse. The stated use of this page is checking a contractor’s number. A confident total built on made-up productivity would be the most damaging thing it could do.

So the page ships 316 unit records with their structure fully defined — category, size, install method, unit basis, assumed crew, whether condition changes them, whether the termination already includes torque — and no values. An unpriced row says not priced. It never contributes a zero.

Getting to a number

  1. Pick a block and write the cable schedule. Enclosure count and power, then a line per scope: how many runs, how far, how many conductors, what size. The takeoff follows the schedule, so every cable row on the sheet is one you wrote and can correct — and the per-enclosure scopes (equipment setting, comms, conduit, tray) re-derive from the enclosure count.
  2. The schedule does not multiply itself. Runs and lengths are what you measured, so changing the enclosure count leaves them alone. If a bigger block means more cable, that is a number only you can state.
  3. Type the unit values, in the panel under “Labour units”. This takeoff needs 28 of the 316 records — not all 316 — and they are listed in the takeoff’s own order, each showing the basis, the assumed crew and whether the value is man-hours or crew-elapsed hours. Values come from a source you are entitled to use: your licensed manual, your estimating database, or the hours your own crews book against these tasks. The last of those is the best input anyone has.
  4. Or bring them as a file. Download the 28 units this takeoff needs (or all 316), fill the sheet, and paste or upload it back. Values stay in your browser and are remembered between visits. They are not transmitted to us, and clearing them is one button.
  5. Enter one wage rate. Cost needs a base and a fringe for each craft the takeoff uses; one composite rate can fill them all, and each field it fills says so. Until a rate exists the ledger returns nothing rather than guessing.

The sheet records each unit’s basis and crew. If a unit’s definition changes after you exported the sheet, the import refuses that value rather than applying it — the same number under a different basis is a different number.

The four things this gets right that spreadsheets usually do not

  • Polarity is a conductor, not a runA DC pull carrying + and − is one pull with two conductors. Cable units are per conductor-foot, so treating the pair as two runs doubles the largest line on the sheet. The generator decides this once and the row echoes the basis it resolved.
  • Condition selects a column, it does not multiplyNormal, Difficult and Very difficult are three independent values. Nothing here derives the harder tiers from the easy one by a fixed ladder. If you only have a Normal value, you can apply your own step — and it is labelled as yours.
  • Torque is a property of the termination, not a separate multiplierIf a termination unit already contains torque-to-spec and witness marking, no separate torque row is generated for those joints. Put both in and you have counted the joint twice; the engine refuses that outright and names both rows.
  • One clockAttended hours per shift is the only divisor for duration and man-days. Site efficiency multiplies hours, once. Dividing paid hours by a net-of-breaks figure and then also applying an efficiency factor takes the same haircut twice, and it is a common way per-diem estimates come out 50% high.

Limits worth knowing before you rely on it

It prices direct installation man-hours first, then adds indirect supervision — foreman by ratio with a minimum-foreman floor, and general foreman by percentage. Those ride in cost and in the total and never in crew-days, because supervision does not shorten a job. The ledger also carries a safety attendant on any row marked as an energised work front, but nothing on this page can mark one yet — no shipped record is flagged and the unit sheet has no column for it — so that term is always zero today.

Cost is optional, and it is withheld rather than guessed. No wage rates ship, for the same reason no labour units ship: you enter your own, and until every craft carrying hours has one the ledger returns nothing. It is withheld while any row is unpriced, and while prevailing wage is switched on without a multiplier — there is no safe default for that number, so the ledger refuses rather than assuming one. The switch lives under “Cost details” in the rates section.

What it still does not model: escalation to a construction midpoint, shift differential, a detailed equipment schedule, per-craft workers’-comp rates, cash-in-lieu fringe, or anything below the line — bonding, insurance, permits, sales tax on materials. Per diem, mobilisation and demobilisation, travel, temporary facilities, the overtime and double-time split and the OEM field-service day rate have inputs in the rates section, most under “Cost details”; anything left at zero is listed as zero rather than hidden.

Per-MWh and per-enclosure figures are withheld whenever any row is unpriced. A normalised number computed over an incomplete scope is precise, quotable and wrong, and it is the failure mode most likely to end up in somebody’s board pack.

The learning curve is implemented and structurally gated: it applies only to units that are first-unit values, and no record in this dataset is one — so it could take no repetition saving even if it were switched on, and no control offers it. That is the safe direction to be wrong in: applying a cumulative-average curve to a unit that is already an average takes roughly 28% off at a hundred repetitions, which is a large and entirely fictional saving.