How to Price From History Instead of Instinct

Why this matters

Instinct is not worthless. An experienced estimator's gut is a compressed memory of hundreds of jobs, and it is usually in the right neighbourhood. The problem is that memory compresses unevenly: the jobs that went badly are vivid, the jobs that went smoothly are forgotten, and the jobs from four years ago carry the same weight as last month's even though your crews, methods, and customer mix have all changed since.

The result is an estimator who is directionally right and unpredictably wrong, with no way to tell which they are on any given bid. Pricing from history does not replace judgment. It gives judgment something to argue with, and it makes the disagreement visible before the bid goes out rather than after the job closes.

This is the forward half of the costing loop. Capturing actuals and running variance reviews produce data; this is the procedure that spends it.

What you need before you start

A labor hour database with per-code medians and spreads, a measured load factor, and observed material ratios by job type. If you do not have those, the steps below have nothing to run on, and building them comes first.

You do not need all of it to start. One job type with 10 clean records is enough to price that type from history while you build the rest.

Step 1: Identify the job type honestly

The bid starts by naming which historical population this job belongs to. That sounds trivial and it is where the method most often fails, because an estimator under pressure will attach a job to the nearest code rather than the right one.

Three questions decide it: same tasks, same access class, comparable equipment or system condition. If any answer is no, find a better-matching code or accept that you are estimating outside your data and mark the bid accordingly.

When nothing matches. Build from component codes rather than a job-type median. You almost always have history on the parts even when you have none on the whole, and a bid assembled from measured task codes plus a stated allowance for the unmeasured piece tells you exactly which piece the risk sits in.

Step 2: Pull the distribution, not the number

Retrieve four things: the record count, the median, the 25th and 75th percentiles, and the full range. Do not let the median travel alone into the bid.

The count sets how much weight the numbers carry. The spread sets how much protection the bid needs. The range tells you what a bad instance of this job type looks like, which is the thing you are deciding whether to price for.

Step 3: Choose the bidding percentile deliberately

This is the actual decision in the whole procedure, and most shops make it by accident.

Bid at When What you are accepting
Median Repeat or high-volume work where overruns and underruns average out across many jobs About half of jobs run over; the portfolio absorbs it
75th percentile One-off customers, jobs where an overrun is commercially painful, or a wide-spread job type A higher price, and losing some bids you could have run profitably
Above the 75th A job type you would rather not run, or genuine one-off risk you cannot scope out You will win few of these, on purpose
Below the median Almost never, and only as a stated strategic decision with a date and a reason Systematic exposure that must be tracked

The median is the right default for a shop with steady volume in a job type, because the overruns and the underruns genuinely do offset across a year. It is the wrong default for a shop running that job type three times a year, where there is no portfolio to average across and a single bad instance is the whole year's experience of it.

Whatever you pick, pick it explicitly and write it on the bid. An estimator who cannot say which percentile they bid at is bidding at instinct with a database open on the desk.

Step 4: Apply the load factor exactly once

The database holds clean coded task hours. Real paid hours are larger by your measured load factor, covering travel, load-out, closeout, and the rest of the day that is not wrench time.

Apply it once, at the bid level, visibly. Two failure modes bracket this: forgetting it entirely, which shorts every bid by the full factor, and applying it twice because the template already had some of it buried inside. The defence against both is keeping templates clean of the factor so there is only ever one place it can live.

Step 5: Price materials from the observed ratio

Your material list is a plan. The observed ratio of actual materials to the allowance across recent closed jobs of the type is what actually happens. If that ratio has sat consistently above 1.00x, carry it, because the difference is real consumption that someone has been absorbing.

Where the ratio is consistently high, though, first ask whether it is a list defect. A missing line that shows up on every job should go on the list as a line, not disappear into a multiplier, because a line can be checked at review and a multiplier cannot.

Step 6: Add risk only for named risks

A contingency covers something you can name. "This equipment's age band has produced a longer tail in our records" is a named risk. "It might go sideways" is anxiety, and anxiety belongs in the percentile choice from step 3, not in a second layer stacked on top of it.

Stacking an unnamed contingency on a 75th-percentile bid is double-counting the same uncertainty, and it is the most common way a data-driven bid ends up higher than the instinct bid it replaced. If you find yourself doing it, go back and raise the percentile instead, which at least keeps the protection in one visible place.

Where the risk is genuinely unknowable rather than just unquantified, a conditions clause moves it to the customer instead of pricing it. That is usually the better trade for a discovered-condition risk.

Step 7: Record the assumption set with the bid

Percentile chosen, record count behind the median, load factor applied, material ratio used, named risks and their treatment. Five lines.

This is what makes the bid reviewable at the pre-send gate and costable afterward. A bid with no recorded assumptions cannot teach you anything when it closes, because you cannot tell whether the miss came from the data or from a call somebody made on top of it.

Worked example: building one bid

The job type. 22 closed records, which puts it in the stable band. Median coded task hours 12.0. Middle half 10.5 to 14.0 hours. Full range 9.0 to 21.0 hours. Median material ratio over the last 10 jobs, 1.06x against the allowance.

Step 3, the percentile. This customer is a repeat account the shop runs this job type for several times a year, so overruns and underruns will average out. Bid at the median: 12.0 coded hours.

Step 4, the load factor. The shop's measured factor is 1.30x. So 12.0 coded hours becomes 15.6 paid labor hours in the bid.

Step 5, materials. The list is built at 1.00x. The observed median is 1.06x, and reading the last ten records shows the excess is scattered across small consumables rather than one missing line, so it is genuinely a multiplier rather than a list defect. Carry materials at 1.06x.

Step 6, risk. The site walk found no condition outside the norm for this job type, and the contract carries a concealed-conditions clause. No contingency added. The tail in the range, out to 21.0 hours, is what the clause exists for.

The bid. 15.6 paid labor hours, materials at 1.06x, assumptions recorded.

What instinct said. The estimator's gut number, written down before pulling the data, was 10.0 hours. That sits 2.0 hours below the 12.0-hour coded median, about 17 percent below it, and it was expressed as a total, meaning no load factor at all.

The full exposure is the difference between the 10.0-hour gut bid and the 15.6-hour built bid: 5.6 hours, which is 36 percent of the 15.6-hour built figure. About a third of the gap is the estimator being optimistic on the task time, and about two thirds is the load factor they never carried. That split is worth noticing, because it says the estimator's feel for wrench time was not bad. What they were missing was the day around the wrench time, which is exactly the thing instinct cannot see, since nobody remembers load-out.

The alternative percentile. Had this been a one-off customer, the 75th percentile of 14.0 coded hours at the same 1.30x factor gives 18.2 paid hours. That is 2.6 hours above the 15.6-hour median-based bid, about 17 percent above it. Whether that costs the job is a question with a measurable answer, which is the point of step 3 being an explicit choice.

The check, one quarter later. Twenty bids on this job type went out built this way. Eleven closed, a win rate of 55 percent, against 14 of 25 before the change, which is 56 percent. That difference is one percentage point across samples of 20 and 25 bids, well inside what chance produces at those sizes. Meanwhile the median labor variance on closed jobs of this type moved from 18 percent over to 3 percent over.

That is the actual result to expect: the win rate barely moves and the variance collapses. Shops brace for a pricing method to cost them work, and what usually happens instead is that they stop winning the specific bids they were winning because they were wrong.

When instinct still wins

History cannot see what has not happened yet. Three cases where the estimator's read should override the data outright:

A visible condition the data has no column for. The tech saw something on the walk that no historical record captured. Trust the eyes, adjust the bid, and add the observation as a tag so the database can see it next time.

A known upcoming change. A method change, a new tool, a crew change. Historical hours describe the old way. Adjust with judgment and re-measure quickly.

Very thin data. Below 5 records, the median is a rumor. Use it as a sanity check on instinct rather than a replacement for it, and say so on the bid.

In all three the correct move is the same: override the number, write down why, and let the next set of records test whether you were right. An override that is recorded becomes data. An override that is silent becomes the habit that this whole procedure was built to replace.

What changes the answer

A job type your competitors price aggressively. History tells you what the work costs, not what it sells for. When the honest number sits above the market, the decision is whether to run the type at all, and that decision should be made once at the job-type level rather than re-litigated nervously on every bid.

Time-and-materials work. The percentile choice becomes a range-setting choice rather than a price. Quote the 25th to 75th percentile as the expected band and say what falls outside it, which is both more honest and easier to defend than a single number the customer will treat as a cap.

Rapidly rising material input costs. The material ratio compares actuals to an allowance, so it stays valid as long as the allowance is refreshed. If the allowance is stale, the ratio inflates and you will read a supplier price movement as a consumption problem.

A brand new crew. Historical hours were produced by people who may no longer be there. Treat medians as provisional for a quarter and lean on the higher percentile until new records confirm the pace.

How to verify you got this right

  • Every bid records which percentile it was built at. If you cannot produce that from the last ten bids, the method is not actually in use.
  • The load factor appears exactly once in each bid, and you can point to where.
  • Closed-job variance on bids built this way trends toward the percentile you chose. Bidding at the median should produce roughly half the jobs over and half under. If nearly all of them run over, your median is stale or the job type is drifting.
  • Win rate is tracked alongside variance. Watching only one of the two is how a shop either prices itself out of the market or holds a price that never covered the work.

References

  • U.S. Small Business Administration (SBA), pricing and bid strategy for small contractors
  • Standard construction estimating practice, historical production data and bid confidence
  • See related: How to Build a Labor Hour Database From Your Own Jobs; Why Your Average Job Is Lying to You; The Estimate Review Before It Goes Out SOP