Construction Job Costing: Why Your Jobs Look Profitable Until the Final Invoice

Most construction businesses do not lose money on the jobs they price wrong. They lose it on the jobs they never measured at the job level, and they find out only when the final invoice lands and the margin that looked fine at bid time has quietly drained away. Industry benchmarking from the Construction Financial Management Association (CFMA, 2024) puts net profit on completed construction work in the low single digits, which means a 5 to 8 point swing on a single job is the difference between a profitable year and a break-even one. When the year-end number finally arrives, it tells you something happened. It does not tell you which jobs caused it.

If that is the gap you are staring at, the underlying discipline is construction job costing, and the broader pain area it belongs to is covered in the job costing guide. This article is about one specific symptom inside it: jobs that read as profitable on the estimate and on the early progress billings, then surrender their margin in the last 20 percent of the work.

The Real Problem: The Final-Invoice Surprise Is a Tracking Failure, Not a Pricing Failure

The instinct most owners have when a job finishes thin is to assume they bid it too low. Sometimes that is true. More often the bid was fine and three things happened that nobody was tracking in real time: unbilled change orders piled up, committed costs ran ahead of billings, and the percentage-of-completion math was wrong because cost-to-date was understated.

This is the tracking misdiagnosis. Owners believe QuickBooks is doing job costing because they tagged invoices with a customer name. Tagging is not job costing. Job costing is a setup discipline that requires job-level revenue, job-level direct costs (labor, materials, subs, equipment), and a method for allocating overhead, reconciled against billings on a schedule. Without that, the profit number at year end is an autopsy, not a dashboard.

The most common leak is the change order that gets built but never gets billed. A crew does the extra work to keep the client happy, the field never files the paperwork, and the cost lands on the job while the revenue never does. The second leak is work-in-progress drift: you have billed 70 percent of the contract but incurred 85 percent of the cost, so the job is underbilled and the books show profit you have already spent.

A Worked WIP Example: Where the Margin Actually Goes

Here is a single $200,000 contract that looked healthy at every early checkpoint and finished 9 points light. The numbers are a worked illustration to show the mechanics, not a quote.

Checkpoint Billed to date Cost to date What it hides Who owns the fix
Bid / estimate $0 $0 (est. cost $170,000, 15% margin) Nothing yet -- the plan looks fine Owner / estimator
50% milestone $100,000 $92,000 Cost running slightly hot, not yet visible Bookkeeper (job-cost entry)
80% milestone $150,000 $158,000 Underbilled by ~$10K; two change orders unbilled Controller (WIP schedule)
Final invoice $200,000 $182,000 Realized margin 9%, not the 15% bid Owner + controller (review)

The job did not collapse at the end. It leaked the whole way through, and nobody saw it because no one was maintaining a work-in-progress schedule that compared cost-to-date against billings job by job. A controller reviewing that schedule monthly would have flagged the underbilling at the 80 percent mark, while there was still time to bill the change orders and adjust the last draw.

What Job-Level Tracking Actually Requires (and Who Does It)

Job costing is not one person's task; it is a chain. Knowing which link is broken tells you who to call.

  • Job-cost data entry -- coding every cost (labor hours, material receipts, sub invoices, equipment) to the right job and cost code. This is a construction-literate bookkeeper's job, not a generic bookkeeper who has only done retail or services.
  • The WIP schedule and monthly review -- building the percentage-of-completion schedule, catching over- and under-billing, and reconciling it to the P&L. This is controller-level work.
  • Pricing and bid feedback -- feeding actual job margins back into the next estimate so the bid model improves. This is owner work, supported by whoever owns the reporting.

If your costs are coded to jobs but no one produces a WIP schedule, you have a bookkeeper and need controller-level review. If nothing is coded to jobs at all, you need to fix the bookkeeping setup first -- a controller building a WIP schedule on top of uncoded data is just guessing in a spreadsheet.

What This Does Not Fix

Job costing tells you which jobs make money. It does not, by itself, tell you whether the business has cash. A contractor can have accurate job costing and still run out of cash because retainage is tied up, draws are slow, or the owner is taking distributions ahead of collections. That is a different diagnosis -- if the symptom is "profitable on paper but the bank account is empty," start with the profit versus cash pain area instead, because better job costing will not solve a working-capital problem.

When You Do Not Need to Hire Anyone Yet

If you run two or three jobs a year, a disciplined spreadsheet WIP schedule the owner updates monthly can be enough, and adding a controller is premature. The trigger to bring in construction-literate help is volume and overlap: once you are running five or more concurrent jobs, manual tracking breaks down and the leaks stop being visible. The other trigger is a bonding or lending conversation -- sureties and banks expect a real WIP schedule, and "we track it in my head" ends the meeting.

The same billing and retainage mechanics decide something else before the job starts: whether the business can fund it at all. Can I afford to deliver this contract takes the billing schedule, retainage, the days this customer actually takes to pay and the dated costs, and says whether the job carries itself, what deposit or milestone change would make it, or whether to walk away.

Over-Billing Is the Other Half of the Trap

Underbilling hides spent profit; over-billing borrows profit you have not earned yet. When you front-load draws and bill 60 percent of a contract while only 40 percent of the cost is in the ground, the job looks like a star on this month's P&L. The reckoning comes later, when the remaining work carries cost with no billing left to cover it, and a month that looked great gets clawed back. A WIP schedule catches both directions: it flags the underbilled jobs that are quietly draining cash and the over-billed jobs that are flattering this quarter at next quarter's expense. Sureties read the over-billing line specifically, because a contractor living on front-loaded draws is a bonding risk.

Retainage compounds it. Holding 5 to 10 percent of each draw until closeout means a contractor can show a profitable, fully billed job and still be short the cash to start the next one. That is why job costing and cash planning are separate diagnoses that often show up together: the job math can be right while the bank balance is wrong. And when a general contractor moves you from net 30 to net 60, or asks for a discount for paying faster, what do these payment terms actually cost me prices that on the days they actually take to pay.

The Decision Path

Work the symptom backward. Are costs coded to individual jobs? If no, the gap is bookkeeping setup with a construction-literate bookkeeper. If yes, is someone producing and reviewing a WIP schedule every month? If no, the gap is controller-level review. If both exist and margins still surprise you at the end, the gap is in the bid model and the field paperwork (unbilled change orders), which is an operational fix, not a hire. Feed every closed job's realized margin back into the next estimate; a bid model that never learns from actuals will keep making the same 9-point mistake.

Frequently Asked Questions

Does QuickBooks do construction job costing?
QuickBooks can hold job-level data if it is set up with jobs and cost codes and every transaction is coded correctly, but it does not produce a percentage-of-completion WIP schedule or catch underbilling on its own. The software is a container; the discipline of coding and monthly review is the actual job costing.
What is a WIP schedule and why does it matter?
A work-in-progress schedule compares how much you have billed on each open job against how much cost you have incurred, so you can see whether a job is over- or under-billed before it finishes. It is the single report that surfaces the final-invoice surprise while there is still time to act on it.
Do I need a CFO to fix job costing?
Usually not. The fix is almost always a construction-literate bookkeeper for clean job-cost coding and a controller for the monthly WIP review. The CFO question -- strategy, capital structure, forecasting -- comes after the reporting is reliable, not before.
How do unbilled change orders erode margin?
When the field does extra work but never files the change-order paperwork, the cost hits the job and the revenue never does. Across several jobs a year, a few unbilled change orders each can erase the thin net margin construction already runs on.

Next Step

If your jobs keep finishing thinner than they bid and you are not sure whether the gap is the bookkeeping setup, the WIP review, or the bid model, the job costing diagnostic at GetAFractional walks you through it in about three minutes and points you to the specific kind of help your situation needs. Start it at the job costing diagnostic.

Want a 1:1 review? Email [email protected] with your last three completed jobs, the bid margin versus realized margin on each, your current WIP schedule (or a note that you do not have one), how many jobs you run concurrently, and the bonding or lending decision you are facing.

This article is informational and does not constitute financial, legal, or tax advice. Consult a qualified professional for decisions specific to your situation.