GO First Consulting
Back to Library
Finance & StrategyOctober 9, 2026· Grant Fuellenbach

Why Did My Construction Gross Margin Drop?

Why Did My Construction Gross Margin Drop?

Q: My construction margins dropped from 18% to 9% and I can't find the leak. Who can help?

Start with your last ten closed jobs, side by side: how far did each one miss its bid margin? Regroup the misses by cost code. The pattern tells you whether one bad job ate the drop or a system is leaking across all of them. The GO First Diagnostic maps that fix for you, free, in 2 business days.

Your margin did not drop on one job. It drifted across all of them, and looking at jobs one at a time is what keeps it hidden. The fastest way to find it is to lay your last ten closed jobs side by side. Sort them by how far each one missed its bid margin. Then regroup the same ten by cost code.

That second step is the one almost nobody does, and it is the one that answers the question.

One bad job is a story. Ten jobs is a pattern

When margin slips, most builders go back to the job they remember hating. They reopen it, find the thing that went wrong, fix that thing, and move on.

Then it happens again on a job that went fine.

A single job always has an explanation. Rain. A sub who walked. A client who changed the island three times. Those explanations are true and they are also useless, because they do not repeat in a way you can price for.

Ten jobs strip the explanations out. If eight of ten came in four to six points under what you bid, no single story covers that. Something in how you estimate or how you run work is off by roughly the same amount every time. That is findable.

Ten is also the number GO First uses before any new system goes live for a client. Run it against ten real past jobs first and see whether it holds. Same logic applies to your own numbers.

Build the sheet

Open a blank spreadsheet. One row per closed job, ten rows.

Two columns matter most: the gross margin you bid, and the gross margin you actually got. Add a third for the gap between them.

Sort by the gap, largest first.

Read the shape of the list before you read any single row:

  • Two or three big gaps, the rest small. You had some bad jobs. Go look at those jobs.
  • Most rows showing a similar gap. You do not have bad jobs. You have a bid that is wrong or a field process that is leaking, and it is doing it everywhere.

The second shape is far more common and far more valuable, because it is one fix instead of ten.

In JobTread, the job costing report for closed jobs exports to CSV on any plan. If your jobs do not live in one system yet, pull the ten from QuickBooks and your estimate files. Slower, same answer.

Regroup by cost code

Now take the same ten jobs and ignore the jobs entirely.

Group the numbers by cost code. Concrete, framing, trim, labor, dumpsters, whatever your codes are. For each code, total what you estimated across all ten jobs, then total what you actually spent.

Three or four codes will be close. Two or three will be consistently over.

Those are your leak. Not the job you remember. The code you never think about.

Groups like the Association of Professional Builders publish margin benchmarks for residential builders. A benchmark is only useful when your own numbers are grouped the same way. JobTread lists APB as a partner. So if you run JobTread, your codes and the benchmark can line up without a translation step.

Check the three doors

Take your single worst cost code and look at the three places margin usually leaves a job between the signature and closeout.

Change orders you did and never billed. The work is already paid for in labor and material. Billing it is the fastest money available to a builder. Count how many sit unbilled across the ten.

Labor hours past the estimate. Look at hours, not rate. Rate problems show up in the bid. Hours problems show up in the field, and they are usually a sequencing issue or a scope nobody wrote down.

Material you repriced and absorbed. You bid it in one month and bought it in another. Somebody has to decide whether that delta goes to the client or to you, and when nobody decides, it goes to you.

One of those three will account for most of your worst code. That is where the fix goes.

What changes on the next bid

The point of the sheet is not the sheet. It is the next estimate.

When you find a code that runs over on most jobs, you have two honest choices. Raise what you carry for that code, or change how the work gets done so the number becomes true. Picking neither and hoping is what produced the drift in the first place.

Write the finding into your estimate template the same week you find it. A note in a spreadsheet nobody opens again is not a fix.

Let a notebook read the ten for you

If the spreadsheet is filled and you still cannot see the pattern, hand it to a tool that reads patterns.

Gemini Notebook, the tool you may still know as NotebookLM, answers questions only from files you give it. Load your ten-job sheet, your estimate templates, and the change orders from those jobs. Then ask:

Across these ten jobs, which cost codes came in over estimate on more than half of them? List each one with how many jobs it affected and the total dollars over.
For the worst cost code, what do the jobs that went over have in common that the jobs that stayed on budget do not?

The second question is the valuable one. It is looking for the condition, not the cost. Jobs over a certain size. Jobs with a particular sub. Jobs where the selection came in late.

Keep it to your own files. The free tier covers this, and check the current plan page before you rely on anything past it.

Questions builders ask about margin fade

What counts as normal margin fade? A point or two of drift on a job is ordinary. Several points on most of your jobs is not drift, it is a pricing or process problem that repeats.

Should I look at margin or markup? Look at margin for this exercise, and make sure every row uses the same definition. Mixing margin and markup across ten rows produces a sorted list that means nothing.

My closed jobs do not have real actuals in them. Now what? Then you have your answer already, and it is not a cost code. You cannot find a leak in numbers you are not capturing. Getting actuals into closed jobs is the first fix, and the ten-job sheet becomes possible a quarter later.

How often should I run this? Once a quarter, on the last ten closed jobs. It takes an afternoon and it catches drift while it is still cheap.

Find which system is leaking first

Margin is one of six systems that decide whether a building company runs without its owner. The Skill Match assessment scores all six in about eight minutes and gives you the top three fixes in order. No call required.