AI electrical estimating is often described as "the AI reads the plans and gives you a bid." The actual workflow is more interesting and more reliable. BuildCrux uses a three-pass pipeline that separates sheet identification, quantity takeoff, and unit-cost application into discrete model calls — each pass optimized for its job. Plus a scope filter that lets sub-bidders extract only the electrical scope from a multi-trade plan set. This article walks the full workflow on a 40-sheet commercial electrical sub-bid, end-to-end, with the engineering decisions that make the difference between an AI bid that works and one that does not.
The multi-pass pipeline is the result of 18 months of iteration. The first version was a single-pass model call — read the PDF, output a priced bid. It produced 18 to 25 line items on a complex commercial set when a senior estimator would produce 60 to 90. The fix was decomposition: separate the tasks the AI does well (pattern-matching sheet types, counting devices, applying unit costs) from the tasks where it benefits from being told what to focus on (takeoff scope, building type, scope filter). The result: 60 to 90 line items on the same commercial set, with accuracy inside the senior-estimator band on clean plans.
Why multi-pass beats single-pass
A 40-sheet commercial electrical plan set has between 12,000 and 24,000 individual visual elements: panel schedules, circuit identifiers, fixture symbols, switch markers, conduit routing, dimension callouts, sheet legends, revision markers. A single model call asked to "read the plans and produce a bid" has to do everything at once: identify which sheets matter, extract quantities from each, apply costs, structure the output. The model spreads attention thin. The output reflects this: fewer line items, less specific unit costs, more hallucinated scope.
Multi-pass changes the math. Each pass has a single job. Pass 1 only identifies sheet types; the model can use its full context for that. Pass 2 only does takeoff against the sheets Pass 1 identified; the model can use compute_area to extract real measurements rather than estimating from visual context. Pass 3 only applies costs to the quantities Pass 2 produced; the model can use lookup_unit_cost to pull from a calibrated table rather than guessing from training data. Each pass produces structured intermediate output that the next pass consumes. Errors get caught earlier and accumulate less.
The full pipeline, end to end
End-to-end multi-pass pipeline on a typical commercial electrical sub-bid. Total: 12-25 minutes AI runtime + 20-45 minutes senior review.
| Step | Job | Time | Tool / output |
|---|---|---|---|
| Upload | PDF intake, Anthropic Files API | 15-60 sec | File ID |
| Pass 1 | Identify electrical + non-drawing sheets | 60-120 sec | Sheet index (cached for Pass 2 + 3) |
| Preflight modal | Confirm scope + credit cost | 15-30 sec | User approves |
| Pass 2 | Quantity takeoff with compute_area tool | 3-8 min | Structured quantity list |
| Pass 3 | Unit-cost application with lookup_unit_cost | 4-12 min | 60-90 line-item priced estimate |
| Post-process | Universal baseline checks, missing-trade sweep | 10-30 sec | Final estimate JSON |
| Senior review | Engineering judgment, scope verification | 20-45 min | Polished submission |
Pass 1 — sheet identification
Pass 1 reads the cover sheet and sheet index, then samples each sheet to identify its type. Output is a structured sheet map: E0.0 is "cover + legend", E1.0 is "power plan", M2.0 is "mechanical equipment schedule", A3.1 is "reflected ceiling plan", and so on. Non-drawing sheets — energy compliance reports, specifications, narrative submittals — get tagged so they are ignored in Pass 2.
The cached sheet index is the most important Pass 1 output. Pass 2 and Pass 3 receive the index as input so they know which sheets to read for takeoff (electrical sheets only when scope filter is electrical) and which to skip (every non-drawing sheet, plus non-electrical sheets when filtering).
Pass 2 — quantity takeoff
Pass 2 produces the quantified line list. The model reads each electrical sheet identified by Pass 1 and outputs structured quantities: 38 LED troffers from the lighting plan, 64 commercial receptacles from the power plan, 1,420 linear feet of EMT from the conduit routing, 12 dedicated equipment circuits from the kitchen equipment schedule.
The compute_area tool is the workhorse of Pass 2. When the model needs a square footage or linear distance from a sheet, it calls compute_area with the sheet ID and the bounding region. The tool returns actual computed pixels-to-feet measurements derived from the sheet scale annotations. This is more accurate than asking the model to estimate distances from visual context, which is where single-pass approaches consistently underestimate conduit runs by 15 to 30 percent.
- Panel schedules read directly: amperage, voltage, phase, breaker counts captured exactly as drawn.
- Fixture schedules cross-referenced: each fixture type on the schedule cross-checked against count on the lighting plan to flag mismatches.
- Branch circuits counted from circuit-tag annotations on the power plan, then verified against panel schedule positions.
- Conduit runs measured with compute_area against scale annotations on each sheet.
- Equipment connections matched to the equipment schedule (typically delivered by the foodservice or mechanical consultant).
Pass 3 — unit-cost application
Pass 3 takes the quantities from Pass 2 and applies unit costs. For each line, the model calls the lookup_unit_cost tool with the line description and unit (each, linear foot, lump). The tool returns a calibrated unit cost from the BuildCrux electrical unit-cost table, which is updated quarterly against copper futures, BLS PPI for electrical equipment, and BLS wage indices for licensed electricians.
For lines where the lookup table does not have a direct match (unusual gear, specialty equipment, custom assemblies), the model falls back to its training-data estimate and flags the line for senior review. These flagged lines are the priority items in the senior-review step.
Pass 3 also runs the universal baseline check: a verification step that confirms every commercial electrical scope has the expected line items present (service, panels, branch wiring, devices, lighting, equipment connections, low-voltage rough, fire alarm rough). If any baseline category is missing entirely, the post-processor adds an "investigate" annotation rather than silently shipping an incomplete bid.
Try the multi-pass pipeline on your next commercial bid
14-day free trial. 12-minute end-to-end on a 40-sheet set. 30-day money-back guarantee.
Get StartedScope filter — the sub-bid unlock
Most electrical contractors sub-bid to a GC on multi-trade plan sets. The plan set has architectural, structural, plumbing, mechanical, and electrical sheets; the electrical contractor bids only electrical scope. Without scope filtering, an AI estimating tool produces a bid for the whole project — every trade, every line item — and the user manually deletes everything that is not electrical. That is 15 to 30 minutes of cleanup per bid and a real risk of leaving in cross-trade items.
Scope filter mode tells the pipeline to restrict output. The user picks "electrical only" at estimate creation time. Pass 1 still identifies all sheets, but Pass 2 only runs takeoff against E-series sheets (plus architectural for fixture locations). Pass 3 only applies costs to electrical line items. The output reads cleanly — no structural, no plumbing, no HVAC, no finishes. Zero manual cleanup.
| Without scope filter | With scope filter |
|---|---|
| Output: every line item across all trades | Output: electrical only |
| You manually delete non-electrical lines | Clean output ready to send |
| Risk of leaving in non-electrical scope | No bleed across trades |
| 10 to 25 minutes of manual cleanup per bid | Zero manual cleanup |
| Mode-selection modal shows full-project cost | Mode-selection modal shows electrical-only cost |
How large PDFs get handled
A 40 to 80 sheet commercial electrical plan set is typically 80 to 350 MB. Some are larger. The pipeline uses two technical decisions to handle these:
- Anthropic Files API: PDFs upload to the Files API (up to 500 MB), which gives the pipeline a stable file ID it passes to each pass as a reference. This sidesteps the 32 MB request-body cap that would otherwise limit estimating to small residential sets.
- PDF page-split fallback: for PDFs over 500 MB or that include high-resolution scans pushing memory limits, the pipeline runs a pre-step that splits the PDF page-by-page using pdf-lib. Each page is uploaded individually and the pipeline reads them in parallel during Pass 2.
- Streaming API for long runs: Pass 3 on complex commercial scope with Opus model can run 8 to 14 minutes. The streaming API keeps the connection alive past the Vercel 300-second serverless cap. Without streaming, the pipeline would silently truncate at 5 minutes.
- 1M context beta: the Pass 3 model call uses Anthropic's 1M context beta to fit the full sheet index + Pass 2 takeoff output + lookup_unit_cost tool definitions + unit-cost lookup table in a single context. This keeps Pass 3 reasoning consistent across all line items.
Senior review — the judgment overlay
The senior-review step is not optional on commercial sub-bids. AI multi-pass produces 60 to 90 line items at acceptable accuracy on clean commercial plans; the senior estimator catches the 4 to 8 items the AI either missed or under-specified. The review takes 20 to 45 minutes and follows a consistent checklist:
- Missing scope check: is fire alarm rough included? Low-voltage rough? Equipment connections per the equipment schedule? Long-lead annotations on custom gear?
- Gear sizing check: does the panel amperage match the connected load calculation? Does the transformer kVA cover the secondary loads? Are breaker AIC ratings adequate for fault current at this location?
- Code compliance check: voltage drop on long branch runs under 5 percent? AFCI/GFCI placement per NEC 2023? Working clearances around new gear?
- Engineering coordination items: AHJ submittal time? Utility coordination time? Specialty engineering (lighting controls, fire alarm panel programming) included as line items?
- Customer-facing polish: line items grouped by scope group? Long-lead items annotated? Exclusions stated clearly? Allowances called out for owner-furnished items?
Frequently asked questions
How long does the AI portion of the workflow take?+
Pass 1 runs in 60 to 120 seconds and is free. Pass 2 runs in 3 to 8 minutes depending on plan-set size. Pass 3 runs in 4 to 12 minutes depending on model tier (Sonnet faster, Opus more accurate). End-to-end AI runtime on a 40-sheet commercial electrical set: 12 to 25 minutes. Add 20 to 45 minutes for senior review.
What is the compute_area tool?+
A function the AI calls during Pass 2 to extract actual square footage and linear measurements from sheet bounding regions. It uses the sheet scale annotation (e.g. "1/4 inch = 1 foot") and pixel-to-region math to return real distances. This is more accurate than asking the model to estimate distances visually, which is where single-pass approaches underestimate conduit runs and overestimate small areas.
What is the lookup_unit_cost tool?+
A function the AI calls during Pass 3 to fetch the calibrated unit cost for a line item. Returns a national-average cost from the BuildCrux electrical unit-cost lookup table, which is updated quarterly against copper futures, BLS PPI for electrical equipment, and electrician wage indices. For lines without a direct table match, the model falls back to training-data estimate and flags the line for senior review.
Can I override the default unit-cost lookup table with my own numbers?+
Yes. Account-level unit-cost overrides let you replace any default with your calibrated value. Common pattern: override the receptacle install cost, the linear-foot EMT cost, the panel install cost, and the common fixture install costs with your subs' actual quoted rates. The AI uses your overrides on every future estimate, so the output matches your historical pricing patterns.
What happens if a sheet is unreadable (scanned hardcopy, low resolution)?+
Pass 1 tags low-quality sheets and propagates a warning to Pass 2 and Pass 3. The output flags the affected line items as "low confidence" so the senior reviewer knows where to double-check. The pipeline does not silently produce bad output; it produces output with the uncertainty visible.
Does the pipeline work on incomplete plan sets (missing single-line, missing fixture schedule)?+
Yes, with caveats. Missing sheets trigger inference: the pipeline uses what it has plus building type and square footage to estimate the missing scope. The output is flagged "based on inference" so the senior reviewer knows to validate. Best practice: request the missing sheets from the GC before bidding rather than relying on inference.
The bottom line
AI electrical estimating is not a single model call against a PDF. It is a multi-pass pipeline that decomposes the work into discrete tasks each pass does well — sheet identification, quantity takeoff with computed areas, unit-cost application via a calibrated lookup table — plus a scope filter that handles the sub-bid case cleanly. The pipeline does 12 to 25 minutes of work that would take a senior estimator 8 to 14 hours, freeing the senior estimator to do the engineering judgment, code compliance, and customer-facing polish that AI cannot substitute. The result is the same quality bid in 3 to 4x less time, on a workflow that scales from 1 commercial bid per day to 3 to 4 without growing headcount.
See a real $342K commercial sub-bid the pipeline produced
Run the pipeline on your next commercial set
14-day free trial. Scope filter for electrical sub-bids. 30-day money-back guarantee.
Get Started