How estimate pricing is calculated

Every line in an estimate runs through the same four-step recipe to turn a takeoff quantity into a sell price. Then all the line prices are added up to get the bid. This article walks through the recipe in plain language so the numbers in the estimate builder are never a mystery.

takeoff quantity
   → Step 1: pad the quantity for waste/overage
   → Step 2: multiply by unit cost (add sales tax if it's material)
   → Step 3: add overhead, then apply profit margin
   → Step 4: round to whole dollars
   = the line's sell price

add up every line = the bid

What's on a line

FieldWhat it means
QuantityHow much, from the takeoff (e.g. 500 linear feet)
Unit of measureThe "each" — feet, hours, sq ft, lump sum
Cost typeLabor, Material, Equipment, Subcontractor, or Other
Unit costThe price for one unit (e.g. $2.10 per foot)
Waste %Extra material you buy but don't install
Overage %An extra cushion on the quantity
Overhead %Cost of doing business (default 10%); applied as a markup or a margin — see Step 3
Profit margin %Profit you keep, as a margin (default 8%)

The cost type decides which unit cost is used and whether sales tax applies — only Material lines are taxed.

Step 1 — Pad the quantity (waste + overage)

You rarely install exactly what you take off. Waste and overage are both percentages, and they simply add together:

padded quantity = quantity × (1 + waste% + overage%)

Then we round up to a whole unit — you can't buy 4.2 boxes of fittings, you buy 5.

Example: 500 ft, 5% waste, 0% overage → 500 × 1.05 = 525 ft.

Step 2 — Extend the cost (quantity × unit cost)

Multiply the padded quantity by the unit cost to get the raw cost of the line before markup.

extended cost = padded quantity × unit cost

If the line is Material, sales tax is baked in right here — multiplied into the cost, not added at the end. The tax rate is set on the estimate (default 10.25%). Labor, equipment, subcontractor, and "other" lines are not taxed.

extended cost (material) = padded quantity × unit cost × (1 + sales tax%)

Step 3 — Add overhead, then apply profit margin

Overhead covers running the business (office, trucks, PMs); profit is what you keep. Profit is always a margin — a percentage of the final price, so it divides by (1 − margin%). Overhead is applied one of two ways, set per estimate:

Markup mode (the default) — overhead is a % of cost

sell price = extended cost × (1 + overhead%) ÷ (1 − margin%)

A $1,000 cost at 10% overhead, 8% margin:

$1,000 × 1.10        = $1,100      (overhead markup)
$1,100 ÷ (1 − 0.08)  = $1,195.65   (profit margin)
rounds to              $1,196      (sell price)

Margin mode — overhead is a % of revenue

Switch the estimate's Overhead toggle to Margin when you want overhead read as a percentage of the bid rather than a markup on cost. Now overhead and profit are both margins on the sell price, so they share one denominator:

sell price = extended cost ÷ (1 − overhead% − margin%)

The same $1,000 cost:

$1,000 ÷ (1 − 0.10 − 0.08) = $1,000 ÷ 0.82 = $1,219.51
rounds to                                     $1,220   (sell price)

In margin mode overhead is exactly 10% of the $1,220 price ($122) and profit exactly 8% ($98). The toggle sits next to Sales Tax in the estimate builder; its company-wide default lives in Settings → Estimating Defaults.

Markup vs. margin: a 20% markup on $100 gives $120. A 20% margin means $100 is 80% of the price, so the price is $100 ÷ 0.80 = $125.

Step 4 — Rounding

ValueRounded to
Unit costnearest cent
Padded quantitywhole unit, always up
Extended costwhole dollar
Sell pricewhole dollar

Typing in a price directly

Any line can carry a price override. When set, all of the above is ignored and the override is the sell price. Use it for an allowance, a vendor quote, or a round bid figure you just want to type in.

Labor lines: two extra wrinkles

Labor follows the same recipe, but the unit cost can be built two special ways.

The loaded (all-in) wage rate. For union / prevailing-wage work, the hourly cost isn't just the base wage. STrOp stacks fringes, payroll taxes, workers' comp, and general liability + small tools on top of the base wage to get a loaded rate, and uses that as the labor unit cost. (See Prevailing wage rates lookup.)

Pricing from a production rate. Instead of a $/unit, you can describe how fast the crew works — crew size, hours per shift, and how much they finish per day — and STrOp backs into the unit cost:

labor unit cost = (crew size × hourly rate × hours per shift) ÷ daily production

A 2-person crew at $80/hr, 8-hour shifts, 200 ft/day → (2 × 80 × 8) ÷ 200 = $6.40/ft.

Adding it all up

Lines → packages → bid. Line sell prices are summed. Lines can nest one level (a parent with children); the parent's total includes its children. Adding up all the top-level base-bid lines is the base bid.

Hiding a line doesn't change the total. Marking a line "don't show on the proposal" only affects what the client sees — its cost is still in the bid.

Alternates (add / deduct) sit outside the base bid. An add alternate's value is added if the client selects it; a deduct is subtracted; a line flagged a credit inside an alternate counts as negative. A scenario total is just the base bid plus the values of whichever alternates are selected.

One full example, start to finish

A material line: 500 ft of conduit at $2.10/ft, 5% waste, 10.25% tax, 10% overhead, 8% profit margin.

Step 1  pad quantity:   500 × 1.05               = 525 ft
Step 2  extend + tax:   525 × $2.10 × 1.1025      = $1,216
Step 3a overhead:       $1,216 × 1.10             = $1,337.60   (markup mode)
Step 3b profit margin:  $1,337.60 ÷ (1 − 0.08)    = $1,453.91
Step 4  round:                                      $1,454

This line sells for $1,454 in markup mode. In margin mode Step 3 is a single divide: $1,216 ÷ (1 − 0.10 − 0.08) = $1,483. Do that for every line, add them up, and you have the bid.

See also

This is how STrOp works

The data flows you read about here are how the platform threads bid, execution, billing, and closeout. Single pipeline. No re-keying.

Request beta access →

Last updated 2026-06-04.