Skip to content
CheckMySupply.com
Job Costing and Material Variance

Gross Margin by Job vs by Trade in Construction

Company margin looks fine while two jobs bleed out. Here is why gross margin by job in construction exposes material leakage that trade-level averages hide.

By 11 min read

Gross margin by job in construction is the report that finds material leakage. Margin by trade, by division, or by company is the report that hides it. The reason is arithmetic, not accounting philosophy: leakage is small per line and steady across jobs, so any average large enough to smooth out a good month is also large enough to swallow a two point bleed. You see a company margin of 21% against a 22% target, shrug at the point, and never learn that four jobs came in at 25% and two came in at 12%.

So start at the job. Then, when a job looks wrong, go down a level to the cost code, and then to the SKU and the invoice line. Leakage lives at the bottom of that ladder and it is invisible at the top.

The rest of this works down that ladder: what each level of the report is actually good for, why material overruns specifically are the kind that averages destroy, and how to trace a bad job margin down to the invoice lines that caused it.

The averaging problem, worked out

Say your electrical shop closed six jobs last quarter. The numbers below are illustrative, chosen to make the arithmetic legible, not pulled from any real shop’s books.

Job Contract Cost Gross profit Gross margin
Medical office fitout $412,000 $305,000 $107,000 26.0%
Retail strip, 4 units $188,000 $141,000 $47,000 25.0%
Warehouse lighting retrofit $96,000 $70,000 $26,000 27.1%
School addition, phase 2 $640,000 $563,000 $77,000 12.0%
Apartment rough-in, 24 unit $520,000 $458,000 $62,000 11.9%
Service and small works $144,000 $107,000 $37,000 25.7%
All jobs $2,000,000 $1,644,000 $356,000 17.8%

The blended number is 17.8%. If your target was 18%, the company report says you missed by two tenths of a point and everything is basically fine.

The job report says something completely different. Four jobs ran 25% to 27%. Two ran 12%. Those two jobs are $1.16M of the $2M in volume, and they are the entire miss. And notice the shape: both underperformers are long, material-heavy, repetitive-purchase jobs. The strong ones are short or labor-heavy. That is not a coincidence, and it is the single most useful pattern the job-level report produces.

Now do the leakage math in the other direction. Suppose the school job carried a $260,000 material buyout and unit prices ran 4% above the estimate across the board. That is $10,400 of margin, 1.6 points on that job. On the company report, spread across $2M of volume, it is half a point. Half a point is inside the noise of anybody’s forecast. Nobody investigates half a point.

What margin by trade is genuinely good for

Trade-level margin is not a bad report. It is a bad leakage detector, which is a different criticism.

Margin by trade or by division answers real questions: which work types you should bid more of, whether your service department subsidizes your construction department, whether your plumbing crews out-earn your HVAC crews, how to price the next round of work. If you run multiple trades under one roof, that comparison is how you allocate estimating time and field labor.

It answers those questions by design, because it is deliberately aggregating away the individual job to show you a pattern across many. That is the same property that makes it useless for finding an overcharge. A report that is built to remove job-level noise will remove job-level signal too, and material leakage arrives as job-level signal.

There is a second reason trade averages mislead on material specifically: material intensity varies enormously inside a trade. A service-heavy quarter and a gear-heavy quarter in the same trade have completely different exposure to price drift. Blending them produces a number that describes neither.

The five levels of resolution, and what each one can tell you

Think of it as a ladder. You climb down it only when something above looks wrong.

Level Best question it answers Can it find material leakage?
Company gross margin Are we solvent and on plan? No
Margin by trade or division What work should we bid more of? No
Margin by job Which jobs went wrong? Points at it
Margin by cost code within a job What went wrong on this job: labor, material, sub, equipment? Narrows it
Unit price by SKU across invoices Did we pay a different price than we assumed, and than we paid last time? Yes

The bottom two rungs are where most shops stop short. Job costing systems will happily give you cost code detail. Almost nobody re-checks unit prices line by line against what they paid three months ago, because it is genuinely tedious and it never looks urgent.

Why material leakage is the variance that averages destroy

Labor overruns announce themselves. Somebody is on the job three weeks past schedule and everyone knows. Sub overruns arrive as change orders with paperwork attached. Equipment overruns are chunky and visible.

Material leakage has none of those properties. It arrives as a couple of dollars per line, on hundreds of lines, on an invoice that is otherwise completely correct. There is no event to notice. The bag of connectors that was $43.40 in March is $46.10 in June, and the invoice is right, the delivery was right, the PO matched, and nobody called to tell you the price changed. That is material price creep, and it is designed by nobody: it is just what happens when a price file updates and your annual estimate does not.

Several of the mechanisms are structural rather than anyone’s fault. Your negotiated rate is a lookup joining your account, the SKU, and the branch, and if any of the three breaks you fall through to a generic price, which is the mechanics laid out in contract price versus counter price. Job quotes cover named quantities and reprice to stock pricing when they run out. A substituted part number is a different record with a different price. Each of those events costs a job a fraction of a point. Aggregate them across a quarter and you have your missing two points, distributed so evenly that no single report row ever looks wrong.

Contractors have described the endpoint of this for years. In a Mike Holt forum thread on supply house pricing, an electrical contractor writes that suppliers “may quote the stuff on bid day at say $87,000 but when you add all the total invoices up at the completion of the project they can be from $87,000 to $100,000 or more”. The control he suggests in the same post is arithmetic rather than a lawsuit or a new supplier: “keep a running tally on what has been invoiced and when it hits the quote amount flag it.” That is a job-level control. It cannot be run at trade level, because at trade level there is no quote to tally against.

The same poster is worth quoting on tone, because it is the right register for this whole subject: “We use several supply houses. I an friendly to all of them but not friends with any of them. All I want is good materials at a fair price.”

Reading a job margin report down to the cause

When a job’s margin is off, resolve it in this order. Each step is cheap and each one eliminates a category.

1. Split the variance by cost class before anything else. Labor, material, subcontract, equipment, other. A job that missed by $38,000 with $34,000 of it in labor is not a purchasing problem and you should stop looking at invoices.

2. Inside material, separate price from quantity. These are different problems with different owners. The standard definitions: materials price variance equals actual price minus standard price, times actual quantity, and quantity variance equals actual quantity used minus standard quantity, times standard price. Named causes of unfavorable price variance include rush delivery charges, commodity price swings, supplier pricing power, and volume differing from the estimate. Quantity variance is a field conversation about waste, rework, and takeoff accuracy. Price variance is a purchasing and invoice conversation.

3. Pull committed cost, not just actual cost. Purchase orders let you track committed and remaining committed cost at job, cost code, or cost class level, and without them a contractor can genuinely believe a job is more profitable than it is, because the material still to arrive is not on the report yet. A job that looks fine at 60% complete with an unpriced remaining buyout is not a job that looks fine.

4. Rank the material lines by dollar and check the top twenty unit prices against your own history. Same part number, same unit of measure, same branch. This is the step that produces an actual answer. If the same SKU shows three prices in four months, you have your leak and you have the evidence in one screen.

5. Reconcile the job quote against the invoices billed to it. Not the total, the running total, and by line where you can. The pattern and the check are in quote versus invoice mismatch.

Compare actuals against the right baseline

One trap worth naming. A variance is only meaningful against a baseline that was supposed to be accurate.

AACE International’s estimate classification system uses maturity of project definition as the sole primary determinant of estimate class, across five classes from Class 5 (earliest, least defined) to Class 1. AACE also describes the accuracy ranges attached to those classes as an indicative range of ranges rather than fixed values, with true accuracy requiring quantitative risk analysis. The practical translation: if you are measuring job margin against a conceptual budget built before design was complete, a large variance may be telling you about the estimate rather than about your purchasing.

So when you set up a job margin report, be explicit about what the “estimate” column is. Original bid, current budget including approved change orders, or the last re-forecast are three different numbers, and comparing actual cost to the wrong one produces variance that means nothing. For leakage hunting specifically, you want unit prices from a defined estimate, on defined SKUs, that you can actually check against an invoice.

Where the market ends and your invoices begin

Some of what you find at job level is not leakage at all, it is the market, and telling a market move from a bad estimate or a drifting invoice is work you should do before you call your rep.

AGC of America’s read of May 2026 producer price data reported that the PPI for inputs to new nonresidential construction rose 8.4% year over year while contractors’ bid prices rose 3.5%. If a job you bid a year ago is bleeding material margin, a chunk of that is the industry-wide spread and no amount of invoice auditing recovers it. What invoice auditing recovers is the part that is specific to you: a rate that lapsed, a branch that never got the agreement, a duplicate, a quote that expired, a unit of measure billed wrong.

The test is comparative. If your unit price moved roughly with the published index for that material, that is the market. If your price moved and the index did not, or your price moved much more, that is yours to ask about. The same applies in the other direction, and it is worth knowing: when the index falls and your price does not, nobody calls to tell you that either.

What to actually do

  • Run margin at the job level monthly, not just at close. A margin problem found at close is a lesson; found at 40% complete it is a decision.
  • Keep trade and division margin for what it is good at: mix, bidding strategy, and resource allocation. Stop expecting it to find overruns.
  • On every job over your median size, split material variance into price and quantity and report them as separate lines.
  • Keep a running tally of invoices against each material quote and flag it when it approaches the quoted amount.
  • Maintain unit price history by SKU, by branch, going back at least twelve months. Without it, step four above is impossible.
  • Re-price the remaining buyout on open jobs quarterly, and carry that into your schedule. What that does to your reported numbers, and who reads them, is covered in what your banker sees in a WIP report.
  • Match at the line level, not the total. The contractor version of the standard control is in three-way matching for contractors.

Your distributor is not the adversary here, and a job margin report is not an accusation. Your supply house is absorbing the same input inflation you are, its branches carry real autonomy, and its counter staff fix recent errors as a matter of routine. What you are fixing is a reporting gap on your own side: the level at which you look at margin determines whether you can see the problem at all. Look at the job, then the cost code, then the line. The answer is always at the bottom.

Sources