How Bracketsight prices a job
Rules verified Ruleset trades-decks-2026-08Placeholder pricing basis — internal reference model, pending licensed cost data (RSMeans-style) and contractor review — no published source URL yet
- Unverified pricing
Every unit cost, labor rate and multiplier in v1 is placeholder reference data.
It is a modelled starting point, not market pricing. Real sourcing — licensed cost data, regional wage data, and a sanity check by two working contractors — is a launch gate, and every estimate carries this warning until that gate is passed.
The estimate formula
A deck becomes footings, framing, decking, railing and stairs; a bathroom becomes demo, rough-in, tile and fixtures. Each assembly is priced the same way, and the order of operations is fixed:
line total = qty x (1 + waste) x unit cost (materials)
+ qty x hours/unit x access x rate (labor)
subtotal = sum of line totals
overhead = subtotal x overhead% (your number; taught default shown)
profit = (subtotal + overhead) x profit%
total = subtotal + overhead + profit
range = total x [low%, high%] -- estimates are ranges, not pointsAll money math is integer cents and all rates are basis points. No AI touches a calculation: the engine is dependency-free TypeScript with its rounding rules documented in one file and pinned by tests.
Rounding happens once per value, at the moment it becomes money — quantity times unit cost, hours times rate, and each basis-point application — and it rounds half away from zero. Labor hours are the exception that proves the rule: they are rounded to two decimals before being priced, so the hours printed on the sheet are exactly the hours the customer is charged for. A sheet whose line items add up to a different figure than its total is the fastest way to lose an argument you were winning.
Waste changes the material quantity; access changes the labor hours
Two multipliers ride on every line and they never touch the same number. The waste factor inflates the material quantity alone — you buy more decking than the deck has square feet, because boards get cut. The access multiplier scales labor hours alone, and it is applied to the quantity before waste, because nobody installs the offcuts. Mixing the two would bill labor on lumber that went in the skip.
| Assembly | Unit | Waste | Labor/unit | Material, economy – premium |
|---|---|---|---|---|
| Concrete footings & posts | each | 0% | 1.5 h | $45 – $90 |
| Framing: ledger, joists, beams | sq ft | 10% | 0.08 h | $4.50 – $7 |
| Decking boards | sq ft | 10% | 0.06 h | $3.50 – $14 |
| Railing & balusters | ln ft | 5% | 0.35 h | $18 – $55 |
| Stairs: stringers & treads | step | 0% | 1 h | $35 – $70 |
| Fasteners & hardware | sq ft | 0% | 0 h | $0.45 – $0.75 |
The rows are not the same shape as each other, and that is the useful part. Fasteners & hardware carries 0 hours per unit: it is a materials-only line spread across the deck area, priced but never billed as time. Concrete footings & posts is the opposite: 1.5 hours per unit, which at the base rate is $93 of labor against $90 of material at the top grade. When a quote comes back higher than a customer expected, the argument is usually about a row shaped like that one, not about the price of a board.
Quantities are computed, not typed. Concrete footings & posts are counted from area — one per 20 sq ft, rounded up, never fewer than 4. A 6 × 8 deck is 48 sq ft, so the ratio asks for 3 and the floor delivers 4. Small jobs cost more per square foot than large ones for exactly this reason, and the sheet shows you where it happens instead of burying it in a rate.
| Trade | Easy | Standard | Difficult |
|---|---|---|---|
| Decks & carpentry | 90% | 100% | 125% |
| Interior painting | 90% | 100% | 120% |
| Bathroom remodel | 95% | 100% | 120% |
Difficult access costs a deck crew more than a paint crew in this dataset, and the material cost does not move at all — the lumber is the same lumber whether the truck parks at the deck or two hundred feet away.
Grade moves the surface lines far harder than the structural ones
Grade is a single control on the sheet and it does not scale a job evenly. Across the 6 assemblies in a new deck build, the premium tier costs 1.6× the economy tier on framing: ledger, joists, beams ($4.50 against $7 per sq ft) and 4× on decking boards ($3.50 against $14 per sq ft). In this dataset the structure barely moves and the surface a customer can see moves most, so grade is worth settling line by line rather than as one switch for the whole job.
Regional multipliers
Material unit costs and labor rates are adjusted by region before any line is priced, so every unit cost on your sheet is already local. Base is 100%.
| Region | Decks & carpentry | Interior painting | Bathroom remodel |
|---|---|---|---|
| Northeast | 115% | 115% | 115% |
| Southeast | 92% | 92% | 92% |
| Midwest | 95% | 95% | 95% |
| South Central | 90% | 90% | 90% |
| Mountain West | 105% | 105% | 105% |
| Pacific | 125% | 125% | 125% |
The spread from the lowest region to the highest is 38.9% — 90% against 125% — and it is the only control that lands on materials and labor at once. Grade touches materials only; access touches labor only; the region moves both, on every line, before anything else happens. It is the first thing to check when a total looks unrecognisable.
The three launch trades currently share one multiplier per region. They are separate values in separate rules files, so they can diverge the moment real wage data says they should — and they should diverge, because regional cost spread is not the same for a painter as for a plumber. Identical values across three trades is a tell that these are modelled, not measured.
Overhead and profit compound; they do not add
Overhead is taken on the subtotal. Profit is taken on the subtotal plus overhead. The order is not cosmetic: the two taught defaults on a deck look like a 25% markup and behave like 26.5%.
| Trade | Overhead | Profit | Sum | Applied |
|---|---|---|---|---|
| Decks & carpentry | 10% | 15% | 25% | 26.5% |
| Interior painting | 10% | 15% | 25% | 26.5% |
| Bathroom remodel | 12% | 18% | 30% | 32.16% |
The gap widens as the rates rise, because it is the product of the two: set both to 20% and you are applying 44%, not 40%. It matters most when you are working backwards from a number the customer has already heard, because the percentage you divide by is not the percentage you typed. Both figures are yours to change on the sheet; the defaults shown are teaching values rather than a recommendation, and the verification pass records them, with the access multipliers and the range spreads, as judgement parameters with no public authoritative source and no prospect of one.
The band is wider upward than downward
The low–high range is a fixed spread applied to the computed total, not a confidence interval and not a function of your inputs. Every trade is asymmetric: bathroom remodel runs from −12% to +22%, a band 34 points wide, while interior painting is the tightest at 25 points. The asymmetry is a judgement about which direction a job is more likely to move once it starts, and it is one of the parameters with no public source behind it — worth setting against your own last ten jobs rather than taking on trust.
What the band does not do is absorb a scope change. If the footing hits rock or the wall needs a third coat, that is a change order, not the top of the range — and the assumption that was violated is printed on the line it belongs to, which is the whole reason the sheet lists assumptions at all.
Labor rates, versions, and the date each ruleset starts flagging itself
| Trade | Base rate | Ruleset | Stale after | Flags from |
|---|---|---|---|---|
| Decks & carpentry | $62/hr | trades-decks-2026-08 | 120 days | 6 Dec 2026 |
| Interior painting | $55/hr | trades-interior-paint-2026-08 | 120 days | 6 Dec 2026 |
| Bathroom remodel | $68/hr | trades-bathroom-remodel-2026-08 | 120 days | 6 Dec 2026 |
Staleness is computed, not declared. The engine takes the latest lastVerified date across a ruleset’s citations, adds the stale window, and flags every estimate produced after that date — for decks, 8 Aug 2026 plus 120 days. Nothing stops working on that date and no number changes; the sheet simply stops claiming the data is current, which is the honest behaviour when nobody has re-checked a price in four months.
One inconsistency worth knowing about: the site’s own gap register measures that same window from the ruleset’s effective date (1 Aug 2026) rather than from the last-verified date the engine uses, so the two disagree about when this dataset expires. The engine’s reading is the one that fires the flag on your sheet. Basis: labor: regional median carpentry rate, Aug 2026 placeholder ($62/hr base before regional multiplier)
What would replace the placeholders
Materials and assembly labor-hours come from commercially licensed cost databases — RSMeans (Gordian) is the reference standard for unit costs, crew composition and city cost indexes; the Craftsman National Construction Estimator is the lower-cost alternative with a published annual edition. No free source exists at this granularity, so this is a purchase rather than a research task, and both licences restrict redistributing the figures as raw data. That constraint has to be settled before an ingestion path is built, because it decides what the engine is allowed to expose in the first place.
Labor rates have a free, citable public basis: the BLS Occupational Employment and Wage Statistics series, at SOC 47-2031 for carpentry and 47-2141 for painting. A blended remodel rate has no single occupational analogue and needs a documented weighted basket — carpenters, plumbers (47-2152), electricians (47-2111) and tile setters (47-2044) — with the weights published alongside the rate. OEWS is an annual series on a May reference date, so the release year travels with every figure it produces.
One caveat outlives the purchase. OEWS reports employee wages, not billable contractor rates, and the distance between them — payroll burden, insurance, the truck, overhead, profit — is currently folded into the taught defaults above. If that relationship is not written down when real data lands, the labor half of every estimate will be wrong by a large and consistent factor while looking rigorously sourced. Consented user-submitted actuals sit last on the ladder, clearly labeled, and only once there is enough volume for the median to mean anything.
Every upgrade lands as a new versioned rules file with a changelog entry, and every ruleset is listed with its citations on sources. What counts as verified, and who has to sign off, is set out in the editorial policy.