Your Bid Said 30%. The Job Closed at 12%. Where Did It Go?
The five places contractor gross margin disappears between bid and final invoice, with the arithmetic on a $180,000 job.
You bid the job at a 30% gross margin. You watched the crew. Nobody sat around. The customer paid on time. Then the job closed and your books showed 12%.
That gap is not bad luck and it is usually not bad estimating. It is five specific costs that happen after the bid is accepted and before the final invoice goes out. Most of them never touch the job in your accounting system, so you cannot see them until the year is over and your CPA hands you a number you do not recognize.
Here is a real example, with the arithmetic.
The job
A commercial tenant build-out. Contract price $180,000.
Your estimate said $126,000 in cost and $54,000 in gross profit. That is 30%.
When the job closed, actual cost came in at $158,400. Gross profit was $21,600. That is 12%.
You lost $32,400. Below is where every dollar of it went.
Leak 1: labor burden that never made it into the bid. $14,400.
You estimated 900 labor hours at $32 an hour, your crew's base wage. That is $28,800 and it is the number most contractors carry into a bid.
But $32 an hour is not what an hour of labor costs you. Add employer payroll taxes, workers compensation, general liability, unemployment, and whatever you carry for paid time off, and the real cost of that hour is closer to $48. Your burden factor will be different from this example. Pull your actual workers comp policy, your last four payroll registers, and your GL premium and calculate it. In construction it commonly lands between 35% and 60% on top of base wage, and your class codes drive most of the spread.
At $48 an hour, 900 hours costs $43,200, not $28,800.
That is $14,400 gone before anyone picks up a tool.
This is the single largest leak on almost every job I look at, and it is the easiest one to fix. You fix it once, in the estimating template, and it never bites you again.
Leak 2: rework nobody tracked separately. $5,760.
The job took 1,020 hours, not 900. The extra 120 hours were punch list items, a wall that had to come back out, and two days of waiting on an inspection that failed the first time.
At $48 fully burdened, those 120 hours cost you $5,760.
Here is what makes rework expensive twice. Most contractors log those hours to the same cost code as the original work. So the code shows an overrun and nobody can tell whether you underbid the scope or whether you built it twice. Next time you bid similar work, you carry the inflated number forward and price yourself out, or you assume it was a one-time problem and eat it again.
Give rework its own cost code. Then you can answer the question that matters: is this an estimating problem or a field problem? They have completely different fixes.
Leak 3: change orders you performed and never billed. $2,800.
Three of them. The customer asked for two extra outlets, a different door hardware finish, and moving a demising wall eighteen inches. All three were handled on site with a nod. None were written up.
Your crew spent the hours and you bought the material. $2,800 in cost with no revenue against it.
Small change orders are where profit quietly leaves. Nobody argues about a $40,000 change order because it goes through paperwork. The $600 ones go through nothing.
Set one rule and enforce it: no work outside the original scope starts without a signed change order, even if the change order says $0 because you decided to eat it. Writing it up at $0 is fine. Not writing it up means it never shows on the job, so you never learn which customers do this and which ones do not.
Leak 4: material escalation between bid and buy. $4,100.
You priced the material in March and bought it in June. Conduit, fixtures, and gypsum all moved. Your supplier honored some of the quote and not the rest.
$4,100 in additional cost with no mechanism to recover it.
Two fixes, and you should use both. Put a quote expiration on your proposals, 30 days is standard and customers accept it without argument. And on any job with a long gap between bid and start, add a material escalation clause that lets you pass through increases above a stated percentage. Your supplier gives you a quote with an expiration date. You are allowed to do the same thing.
Leak 5: equipment, rental, and consumables buried in overhead. $5,340.
Six days of lift rental. Fuel and truck time for the crew. Blades, bits, fasteners, and the compressor that lives on your truck.
All of it hit your P&L as an overhead expense. None of it hit the job.
$5,340 of real cost that this job caused and this job never carried.
This one distorts more than a single job. When equipment and consumables live in overhead, every job looks more profitable than it is and your overhead looks worse than it is. You end up thinking you have a fixed cost problem when what you actually have is a job costing problem.
Allocate rental directly to the job that used it. For owned equipment and consumables, set an internal hourly or daily rate and charge it to the job the same way you would charge a rental. It does not have to be perfect to be a lot better than zero.
The full accounting
| Where it went | Amount |
|---|---|
| Labor burden not in the bid | $14,400 |
| Rework hours, not tracked separately | $5,760 |
| Change orders performed and never billed | $2,800 |
| Material escalation between bid and buy | $4,100 |
| Equipment, rental, and consumables in overhead | $5,340 |
| Total | $32,400 |
$54,000 in bid profit minus $32,400 is $21,600. Twelve percent.
Nothing on that list is dramatic. Not one of those five items would make you stop a job and call a meeting. Together they took 60% of your gross profit.
Run this on your last three closed jobs
You do not need new software to do this. You need three closed jobs and about two hours.
For each one, write down four numbers:
- Contract price including every change order you actually billed
- Direct labor hours, and your real burdened rate rather than base wage
- Material and subcontractor cost that you can tie to that job with a receipt or an invoice
- Any rental, equipment, or consumable cost that job caused, whether or not it hit the job in your books
Subtract, and compare the result to what you bid. Then do it for the other two jobs.
If all three land in the same place, you have a systematic problem and it is almost always burden. If they scatter, you have a field problem on specific jobs or specific crews, and that is a different conversation.
Run the numbers yourself with our job profitability calculator, or send us the three jobs and we will do it with you.
What it looks like when this is fixed
You know a job's real margin while it is still open, not four months after it closes.
Your estimating template carries a burdened labor rate that matches your actual payroll and insurance, and you update it when your comp policy renews.
Rework has its own cost code, so you can tell an estimating miss from a field miss.
Every scope change gets written up, including the ones you decide to absorb.
Rental and consumables land on the job that caused them.
And when a lender asks why your gross margin moved four points, you can answer with a specific job and a specific number instead of a guess. That answer is the difference between a loan that gets approved and one that sits in underwriting for six weeks.
If your books are not currently set up to answer any of this, that is a fixable problem. Start with construction bookkeeping for Houston contractors for how to build the cost code structure, and see catch-up bookkeeping and QuickBooks cleanup if you are working from books that are months behind.
Frequently asked questions
What is a good gross margin on a construction job?
It depends on trade and delivery method, and anyone who gives you one number for all construction is guessing. What matters more than the benchmark is whether your actual margin matches what you bid. A contractor consistently hitting 18% when he bids 20% is running a better business than one who bids 35% and closes at 19%.
How do I calculate my labor burden rate?
Take your total annual labor cost, meaning gross wages plus employer payroll taxes plus workers compensation premium plus general liability attributable to labor plus any benefits, and divide it by total productive hours worked. Productive hours, not paid hours. Paid time off is a cost, not an hour you can bill.
Should I job cost every job, even small ones?
Track every job. How deep you track can scale with size. A $2,000 service call needs labor hours and material. A $180,000 build-out needs cost codes. What you cannot do is skip the small ones entirely, because in most contracting businesses the small jobs are where margin is thinnest and volume is highest.
Does QuickBooks Online handle construction job costing?
Yes, for most contractors under about $5 million in revenue. You need Projects turned on, a consistent cost code structure in your item or service list, and payroll set up so labor hours flow to jobs with burden attached. That last piece is where most setups break.
How often should I review job profitability?
Monthly on open jobs, and again within 30 days of closing each one. Reviewing only at year end means you find the problem after you have already repeated it a dozen times.
About the author
Fractional CFO support, Sugar Land bookkeeping, and Houston pricing
- Fractional CFO services in HoustonMonthly dashboards, 13-week cash flow forecasts, and lender-ready reporting from a fractional CFO — without a full-time salary.See fractional CFO services
- Bookkeeping in Sugar Land, TXFlat monthly fees from $300 for Sugar Land bookkeeping and QuickBooks cleanup — multi-entity and IOLTA experience, no hourly billing.See Sugar Land bookkeeping
- What bookkeeping services cost in Houston2026 monthly package ranges, hourly vs. flat-fee comparisons, and what catch-up cleanup adds to the first invoice.See Houston pricing ranges
Popular tools & nearby service areas
- Bookkeeping in Klein, TXMonthly bookkeeping and cleanup for Klein and north Harris County businesses.Open Bookkeeping in Klein, TX
- Bookkeeping in Jersey Village, TXLocal support for contractors, clinics, and shops along US-290.Open Bookkeeping in Jersey Village, TX
- 13-week cash flow forecast toolFree rolling forecast to see payroll and tax gaps a quarter ahead.Open 13-week cash flow forecast tool
- How to calculate profit marginGross, operating, and net margin formulas with worked examples by industry.Open How to calculate profit margin
- Bookkeeping basics for new Texas ownersWhat to set up in your first 90 days so your books stay loan-ready.Open Bookkeeping basics for new Texas owners