CIV-450 · Lesson 4 of 12 · 19 min

Estimating for engineers

An engineer's estimate does several jobs at once. Early in a project it tells the owner whether the project is affordable and how much to budget. At tender it is the yardstick against which bids are judged, and the basis for deciding whether to award or retender. During construction it is the reference for pricing changes. Engineers who prepare estimates for owners do not need the full apparatus of a contractor's estimating department, which CON-200 and CON-300 cover in detail, but they do need to know how a contractor builds a price, where the uncertainty lies, and how to express that uncertainty honestly.

Estimate classes

Estimates are classified by the maturity of the design they are based on. The classification published by AACE International, widely used in North America, runs from Class 5, a concept screening estimate made with almost no design, to Class 1, a check estimate or bid made from complete documents. Each class has an expected accuracy range, wide and skewed upward for early estimates, narrowing as the design matures. The ranges are wider than many owners assume: a Class 5 estimate might be 50 % low or 100 % high. Early estimates are wrong more often by being too low than too high, because the unknown scope is mostly additional scope.

Bar chart of estimate classes 5 to 1. Each class shows an outer box for the widest typical accuracy range and an inner box for the narrowest. Class 5 at concept ranges from about minus 50 to plus 100 percent at its widest, narrowing through classes 4, 3 and 2 to Class 1, a bid check, at about minus 10 to plus 15 percent at its widest.
Estimate classes and their typical accuracy ranges.
Estimate classes after AACE International practice, with indicative maturity ranges.
ClassDesign maturityTypical methodTypical use
5concept, 0 to 2 %cost per lane-kilometre or similar unitscreening, long-range plans
4feasibility, 1 to 15 %parametric models, factored costsoptions study, preliminary budget
3preliminary design, 10 to 40 %semi-detailed unit costsbudget authorization
2detailed design, 30 to 75 %detailed unit costs, takeoffcontrol estimate
1complete, 65 to 100 %detailed takeoff and pricingengineer estimate, bid check

Conceptual and parametric estimates

At the concept stage of the Ridgeway project, two years earlier, Kestrel Bay used historical costs from the city's recent road contracts: about CAD 3.5 million per kilometre for full urban reconstruction with storm sewers, plus separate allowances for the culvert, the wall and the roundabout. That Class 4 estimate, about CAD 7 million for construction, was enough to put the project in the capital plan. Parametric estimates of this kind work when the historical projects are similar and the costs are brought to the same date with a construction price index; they fail when the new project has unusual features, such as soft ground, which the historical average hides.

How a contractor builds a unit price

A contractor prices each item from its components. Direct costs are labour, equipment and materials, calculated from the crew, its production rate and the quantity. Subcontract prices are added for work the contractor does not self-perform. Then come indirect costs: the site office, supervision, temporary facilities, small tools, insurance and bonds, often called general conditions or site overhead. Finally the contractor adds home office overhead and profit. In a unit-price bid, all of these are spread over the unit prices, so a unit price for excavation includes a share of the superintendent's wages and the company's profit.

Worked problem

Building a unit price for excavation

A crew of one excavator with an operator and three trucks with drivers moves 900 m³ of clay a day. The crew costs CAD 9,450 a day including fuel and equipment. Site overhead and markup add 30 % to direct cost. What unit price per m³ results?

Show solution
  1. \[\text{direct} = 9450 / 900 = 10.50\ \text{per m}^3\]
  2. Disposal of surplus clay at a licensed site adds CAD 5.65 per m³ of material.
  3. \[\text{price} = (10.50 + 5.65) \times 1.30 = 21.00\ \text{per m}^3\]

Answer: The engineer's unit price of CAD 21.00 per m³ is consistent with this crew and haul.

Production rates drive the estimate. The same excavator moves far less soft wet clay than dry sand, and a crew that must stop for traffic every few minutes is slower than one working in a closed road. This is why the engineer's estimate should be built with the site in mind, not just from a price book: the varved clay, the two-stage traffic plan, the narrow working strip along the wall and the in-water work window all reduce production and raise costs.

The Ridgeway engineer's estimate

The Class 1 engineer's estimate for the tender follows the 16 items of the bid form. Quantities come from the takeoff of the final drawings, done by Sofia and checked by Owen. Unit prices come from recent city tenders, adjusted for date and site conditions, and from first-principles pricing of the items with no good history: the box culvert, the cofferdam and the retaining wall. A 5 % allowance covers mobilization, bonds and insurance, which the bid form carries as a separate lump sum.

The engineer's estimate, then a Monte Carlo range from triangular distributions on the item costs.
# Engineer's estimate for the Ridgeway Road East and Kestrel Creek crossing contract,
# then a Monte Carlo range for the contingency
import random
UNITS = "SI"
SI = UNITS == "SI"
CUR = "CAD" if SI else "USD"
# item, unit, quantity, unit price  (unit prices include the contractor's overhead and profit)
if SI:
    items = [("Traffic control and staging", "LS", 1, 420000), ("Asphalt and curb removals", "m2", 9800, 9.0),
             ("Earth excavation", "m3", 14500, 21.0), ("Granular subbase", "m3", 4600, 55.0),
             ("Granular base", "m3", 2300, 72.0), ("Hot-mix asphalt, two lifts", "m2", 11500, 42.0),
             ("Concrete curb and gutter", "m", 3400, 85.0), ("Storm sewer, 300-900 mm", "m", 1150, 680.0),
             ("Catch basins and maintenance holes", "each", 46, 4800.0), ("Precast box culvert 4.5 x 2.4 m", "m", 26, 52000.0),
             ("Cofferdam and creek diversion", "LS", 1, 280000), ("Cantilever retaining wall", "m", 140, 5200.0),
             ("Roundabout at the operations centre", "LS", 1, 820000), ("Bioretention and low impact development", "LS", 1, 410000),
             ("Street lighting", "each", 48, 9800.0), ("Pavement markings and signs", "LS", 1, 110000)]
else:
    items = [("Traffic control and staging", "LS", 1, 330000), ("Asphalt and curb removals", "yd2", 11700, 7.0),
             ("Earth excavation", "yd3", 19000, 15.0), ("Granular subbase", "yd3", 6000, 38.0),
             ("Granular base", "yd3", 3000, 50.0), ("Hot-mix asphalt, two lifts", "yd2", 13750, 30.0),
             ("Concrete curb and gutter", "ft", 11150, 24.0), ("Storm sewer, 12-36 in.", "ft", 3770, 190.0),
             ("Catch basins and manholes", "each", 46, 3900.0), ("Precast box culvert 15 x 8 ft", "ft", 85, 12800.0),
             ("Cofferdam and creek diversion", "LS", 1, 220000), ("Cantilever retaining wall", "ft", 460, 1250.0),
             ("Roundabout at the operations center", "LS", 1, 640000), ("Bioretention and low impact development", "LS", 1, 320000),
             ("Street lighting", "each", 48, 7600.0), ("Pavement markings and signs", "LS", 1, 85000)]
sub = 0.0
for name, unit, q, p in items:
    sub += q * p
    print(f"{name:42s} {q:>8,} {unit:5s} x {p:>10,.2f} = {q*p:>12,.0f}")
mob = 0.05 * sub
print(f"{'Subtotal of unit-price items':42s} {sub:>40,.0f}")
print(f"{'Mobilization, bonds and insurance (5 %)':42s} {mob:>40,.0f}")
est = sub + mob
print(f"{'Engineer estimate (' + CUR + ')':42s} {est:>40,.0f}")
# uncertainty: triangular factors (low, most likely, high) on each item, plus a market factor on the whole bid
rng = {"Earth excavation": (0.90, 1.0, 1.35), "Precast box culvert": (0.95, 1.0, 1.30),
       "Cofferdam": (0.90, 1.0, 1.60), "Storm sewer": (0.92, 1.0, 1.20)}
random.seed(450)
runs = []
for _ in range(5000):
    tot = 0.0
    for name, unit, q, p in items:
        lo, ml, hi = next((v for k, v in rng.items() if name.startswith(k)), (0.93, 1.0, 1.10))
        tot += q * p * random.triangular(lo, hi, ml)
    tot *= 1.05 * random.triangular(0.94, 1.15, 1.0)
    runs.append(tot)
runs.sort()
pc = lambda f: runs[int(f * len(runs)) - 1]
print(f"\nMonte Carlo, 5,000 runs: P10 {pc(0.10):,.0f}  P50 {pc(0.50):,.0f}  P80 {pc(0.80):,.0f}  P90 {pc(0.90):,.0f}")
print(f"Chance the point estimate is not exceeded: {sum(r <= est for r in runs) / len(runs):.0%}")
print(f"Contingency to reach P80: {pc(0.80) - est:,.0f} ({(pc(0.80) - est) / est:.1%} of the estimate)")
Output
Traffic control and staging                       1 LS    x 420,000.00 =      420,000
Asphalt and curb removals                     9,800 m2    x       9.00 =       88,200
Earth excavation                             14,500 m3    x      21.00 =      304,500
Granular subbase                              4,600 m3    x      55.00 =      253,000
Granular base                                 2,300 m3    x      72.00 =      165,600
Hot-mix asphalt, two lifts                   11,500 m2    x      42.00 =      483,000
Concrete curb and gutter                      3,400 m     x      85.00 =      289,000
Storm sewer, 300-900 mm                       1,150 m     x     680.00 =      782,000
Catch basins and maintenance holes               46 each  x   4,800.00 =      220,800
Precast box culvert 4.5 x 2.4 m                  26 m     x  52,000.00 =    1,352,000
Cofferdam and creek diversion                     1 LS    x 280,000.00 =      280,000
Cantilever retaining wall                       140 m     x   5,200.00 =      728,000
Roundabout at the operations centre               1 LS    x 820,000.00 =      820,000
Bioretention and low impact development           1 LS    x 410,000.00 =      410,000
Street lighting                                  48 each  x   9,800.00 =      470,400
Pavement markings and signs                       1 LS    x 110,000.00 =      110,000
Subtotal of unit-price items                                              7,176,500
Mobilization, bonds and insurance (5 %)                                     358,825
Engineer estimate (CAD)                                                   7,535,325

Monte Carlo, 5,000 runs: P10 7,576,061  P50 8,014,816  P80 8,388,262  P90 8,578,997
Chance the point estimate is not exceeded: 8%
Contingency to reach P80: 852,937 (11.3% of the estimate)

The point estimate is CAD 7,535,325. The largest single item is the precast box culvert at CAD 1.35 million, followed by the roundabout, the storm sewer and the retaining wall. The culvert, the cofferdam, the wall and the excavation in soft clay together make up more than a third of the unit-price items, and that is where the uncertainty is concentrated.

Expressing uncertainty: the Monte Carlo range

A single number hides the most important information in an estimate, its uncertainty. Sofia's script assigns each item a triangular distribution: a low, most likely and high factor on its estimated cost. Most items get a narrow range of minus 7 % to plus 10 %. Excavation gets minus 10 % to plus 35 %, because the soft clay may need more subexcavation; the culvert minus 5 % to plus 30 %; the cofferdam minus 10 % to plus 60 %, because its cost depends on water levels during the work window; the storm sewer minus 8 % to plus 20 %. A market factor applied to the whole estimate, from minus 6 % to plus 15 %, represents the bidding climate. The simulation draws 5,000 combinations.

The results are striking. The point estimate of CAD 7.54 million has only about an 8 % chance of not being exceeded. The median is CAD 8.01 million, and the 80th percentile, P80, is CAD 8.39 million. The reason is that every distribution is skewed upward: the most likely value of each item is at the low end of its range, so adding the most likely values gives a total well below the likely total. The contingency needed to reach P80 is CAD 853,000, or 11.3 % of the estimate, which is the figure carried into the capital budget in lesson 1.

Cumulative distribution curve of the simulated construction cost, an S-shaped curve rising from 0 to 1. A dashed red vertical line marks the point estimate near the bottom of the curve, at about an 8 percent probability. A blue dot marks the 80th percentile, with dashed guide lines to the axes.
Simulated construction cost: the point estimate sits low on the curve.

Two caveats keep this honest. First, the item ranges are judgements, and the analysis is only as good as the conversations that produced them; the team held a short risk workshop with Dr. Kowalczyk and the city's roads staff to set them. Second, the simulation treats items as independent, apart from the market factor. In reality, if the clay is worse than expected, excavation, the wall and the culvert will all cost more at once. Correlation widens the range, so the P80 above is, if anything, optimistic. More advanced practice models the main risks as events with probabilities and impacts, rather than as ranges on line items.

The estimate at tender

When bids arrive, the engineer's estimate is the benchmark. Bids within about 10 % of a good Class 1 estimate are normal. A low bid far below the estimate prompts a check of the low bidder's understanding of the scope and its unit prices; a cluster of bids well above it suggests either an error in the estimate or a risk that bidders priced and the estimator did not. In lesson 3, Northline's corrected bid of CAD 7.24 million came in 3.9 % below the estimate, and the spread of bids was about 9 %, a healthy result.

The engineer's estimate is usually kept confidential until bids close, because publishing it anchors bidders to it. Some agencies publish a budget range instead. Either way, the estimate and its basis, quantities, prices, sources and assumptions, should be documented well enough that someone else could check it, because it may be needed years later in a claim.

Practical points

  • State the class and accuracy range with every estimate.
  • Price items with no reliable history from crews, production rates and site conditions.
  • Remember that most likely values do not add up to a likely total when ranges are skewed.
  • Size contingency from a risk analysis, not a fixed percentage.
  • Document the basis of the estimate for use in bid evaluation, changes and claims.

Common mistakes

  • MistakeQuoting an early estimate as a single figure without its range.

    InsteadGive the class and the range; early estimates are uncertain and usually low.

  • MistakePricing from a price book without considering site conditions.

    InsteadAdjust production rates for soft ground, traffic and working space.

  • MistakeAdding most likely values and calling the result the expected cost.

    InsteadWith upward-skewed ranges, the sum of modes lies well below the median.

  • MistakeTreating every item as independent in a risk model.

    InsteadCorrelated items, such as everything in soft clay, widen the range.

Summary and key terms

  • Estimate classes run from Class 5 at concept to Class 1 at complete design, with narrowing accuracy ranges.
  • Parametric estimates use historical unit costs adjusted for date and scope.
  • A contractor's unit price includes direct costs, site overhead, home office overhead and profit.
  • The Ridgeway engineer's estimate is CAD 7.54 million; the culvert is the largest item.
  • A Monte Carlo simulation of skewed item ranges puts the point estimate at only about an 8 % chance of not being exceeded.
  • Contingency of 11.3 % brings the budget to the 80th percentile.
Engineer estimate
The owner's independent estimate of the expected bid price, prepared from the final documents.
Estimate class
A category of estimate defined by design maturity, method and expected accuracy.
Parametric estimate
An estimate from historical costs per unit of a key parameter, such as length of road.
Direct cost
The cost of labour, equipment, materials and subcontracts for an item.
Site overhead
Project costs not tied to one item, such as supervision and site facilities.
Production rate
The quantity of work a crew completes per unit of time.
Triangular distribution
A probability distribution defined by low, most likely and high values.
P80
The value with an 80 % probability of not being exceeded.

Practice problems

Work each problem on paper first, then reveal the answer to check.

  1. A crew costs CAD 6,200 a day and places 140 m of curb. With 35 % markup, what unit price results?

    Show answer

    6,200 / 140 × 1.35 = CAD 59.79 per metre.

  2. Why is the sum of the most likely item costs usually below the median total?

    Show answer

    Each item's distribution is skewed upward, so its mean exceeds its mode; the means add, not the modes.

  3. A Class 5 estimate is 10 million. What range might be reported?

    Show answer

    Roughly 5 to 20 million at the widest, using minus 50 % to plus 100 %.

  4. How would correlation between the excavation, wall and culvert costs change the P80?

    Show answer

    It would widen the distribution and raise the P80.

Lesson quiz · 5 questions

Score 60% or more to complete this lesson.

Take the quiz