I'm an electrical contractor. For a long time my "job costing" was a feeling. I knew which jobs felt tight and which felt loose, and at the end of the month my bookkeeper would tell me whether the feeling was right. Usually it was close. Sometimes it wasn't, and by then the job was finished, the crew was three jobs down the road, and the money was already spent. You can't fix a job you can't see.
You don't have a costing problem. You have a timing problem.
Here's the thing nobody says out loud: most contractors already have all the data they need to cost a job. The hours are on timecards. The materials are on supplier invoices. The change orders are sitting in an email thread. The problem isn't that the information doesn't exist — it's that it shows up in four different places at four different times, and the only place it all finally meets is your bookkeeper's accounting file, weeks after the work happened.
By the time the numbers reconcile, the job is over. You're doing an autopsy, not a checkup.
That delay is the whole problem. A job that's quietly bleeding labor in week two looks fine until the timecards get keyed in, coded to the right job, and reconciled at month-end. That's four weeks of bleeding you didn't see — on a job that might only run six.
Where the money actually hides
When your estimate lives in one tool, your time in another, your bills in a third, and your books in a fourth, nothing reconciles until somebody forces it to. And the stuff that kills margin is exactly the stuff that's easiest to lose in the gaps:
- The extra hour the crew worked but didn't write down.
- The second trip to the supply house that nobody tied to the job.
- The material you ate on a change you never wrote up.
- The sub invoice that got coded to the wrong job because two jobs were running for the same customer.
None of those are big on their own. Together, across a year, they're the difference between a good year and a "where did it all go" year.
The fix: one cost spine
The contractors who actually know their numbers in real time all do the same thing, whether they call it this or not: they run every dollar through a single structure. I think of it as the cost spine — Job → Phase → Cost-Category.
It sounds technical. It isn't. It just means every job is broken into phases (rough-in, trim, service), and every phase has a few cost categories (labor, material, subs, equipment). Then everything — an estimate line, a timecard, a PO, a bill, a change order — posts against that same structure. Because it all shares one backbone, the math rolls up by itself.
What "live" actually buys you
Say you're three weeks into a tenant improvement. Rough-in was budgeted at 640 hours. On a paper system you'd find out you blew it at closeout. On a live system, here's week two:
- Budgeted rough-in labor: 640 hrs
- Hours burned so far: 410 hrs
- Percent of rough-in actually complete: ~55%
You're past 64% of your hours and barely half done. That's a flashing light, and you saw it on a Tuesday with three weeks left to add a body, change sequence, or have the hard conversation with the GC about the conditions slowing you down. That's the entire point: information you get while you can still act on it is worth ten times the same information at month-end.
Earned revenue and WIP, without the accounting headache
Two words scare contractors off this stuff: "earned revenue" and "WIP." Don't let them. In plain terms: earned revenue is how much of the contract you've actually worked off (if you're 55% done, you've earned 55% of the price). WIP — work in progress — is just the gap between what you've earned and what you've billed. Over-billed means you've collected ahead of the work; under-billed means you're financing the job out of your own pocket. When everything posts to one spine, both numbers fall out automatically instead of being a spreadsheet you dread.
How to start without boiling the ocean
You don't migrate ten years of history. Pick one active job. Set up its phases and cost categories, drop in the estimate, and route time and bills to it for two weeks. The first time you watch earned revenue tick up as the crew works — and catch a phase drifting before it's too late — the month-behind era is over and you won't want to go back.
The one-minute version
- You don't have a costing problem, you have a timing problem — the data exists, it just arrives too late.
- Run every dollar through one structure: Job → Phase → Cost-Category.
- "Live" means you catch a bleeding job mid-stream, not at the autopsy.
- Start with one job. Prove it to yourself before you roll it out.