You finished the job, the customer paid, the check cleared. Did you make money on it?

Most small contractors can’t answer that with any confidence. They know the bank account went up, and they know the job felt tight or felt easy, but the actual number is a guess. That’s fine for a while. It stops being fine the moment you start repeating the same kind of job, because if you’re losing four points of margin on every bathroom you touch, you’re going to lose it thirty more times before anything tells you to stop.

Job costing sounds like an accounting exercise. It isn’t. It’s the feedback loop that makes your bidding get better instead of staying the same for ten years.

Bid vs actual is the whole system

Strip away the terminology and job costing is one comparison: what you said the job would cost, against what it actually cost. That’s it.

You already do the first half. Every bid you send has an assumption inside it, even if it never got written down. Two days of labor. Nine yards of concrete. Four hundred in materials. When you priced the job at $6,800, you were implicitly claiming a set of numbers.

The second half is what almost nobody does. Nobody goes back after the job and checks. So the assumptions never get corrected, and the same optimistic labor estimate you made in 2019 is still riding along in the bids you send today.

The whole practice is: write down the assumption, record what actually happened, put them side by side. A contractor who does this for twenty jobs knows more about their business than one who has done four hundred jobs and never looked.

Four buckets, nothing fancier

You don’t need a chart of accounts. Track four categories per job and you’ll catch almost everything that matters.

Labor. Hours on the job, including yours, multiplied by your true hourly cost. Not the wage. The loaded cost, with payroll taxes, workers comp, and any benefits included. If you pay a guy $25, your real cost is meaningfully higher, often in the range of $32 to $38 depending on your state and your comp rate. Using the raw wage is the single most common way small contractors quietly underprice themselves.

Materials. Everything you bought for the job, including the second and third trips to the supply house. Keep the receipts attached to the job, not in a pile in the truck.

Subs. What you actually paid, not what they quoted.

Everything else. Dump fees, equipment rental, permits, fuel if the job was far out, and any consumables you burned through. This is the bucket people skip, and it’s usually the one holding the leak.

Compare those four against what you assumed, and the story of the job becomes obvious in about two minutes.

Where the money actually leaks

The gap between bid and actual is almost never one dramatic mistake. It’s five small things, and they repeat.

Untracked labor hours. You estimated a day and a half. It took two and a quarter. Nobody wrote that down, so the next bid for the same work is still a day and a half. On a job with $1,500 of labor in it, three quarters of a day of unplanned time can eat most of the profit by itself.

Supply house trips. Each unplanned run costs you drive time both ways plus the time inside, and it usually pulls a crew member off the job, not just you. Two of those in a week is a meaningful chunk of a billable day that appears nowhere in your bid.

Dump and disposal. Demo-heavy jobs generate more volume than people picture when they’re standing in the driveway estimating. Disposal is easy to underweight at bid time and impossible to avoid at job time.

Rework and callbacks. The trip back to fix the thing that wasn’t right. It’s labor, fuel, and a lost slot on the schedule, and it almost never gets charged to the job it belongs to. It just disappears into overhead where you can’t see it.

Change orders you did for free. The customer asked for one more outlet, one more step, one more patch, and you said sure. Do that on every job and you’ve built a discount into your business model without deciding to.

None of these are exotic. They’re just invisible unless something forces you to write them down.

The minimum version that works

Here’s the honest floor. A job costing system you’ll actually maintain beats a perfect one you abandon in March.

Start with a folder or a note per job containing four things: the bid with its assumptions, a running tally of hours, photos of every receipt, and a line for anything unexpected. At the end of the job, spend ten minutes filling in the actuals and writing one sentence about what surprised you.

That last part matters more than the arithmetic. “Subfloor was rotted under the tile, cost us most of a day” is the note that makes your next bathroom bid better. The spreadsheet remembers numbers. The sentence remembers why.

If you want a target for the discipline, get hours recorded the same day. Memory for time is bad after twenty four hours and worthless after a week, and labor is the bucket where the biggest gaps live.

Read across jobs, not one job

One job that ran over tells you nothing. Every job runs over or under a little. The signal shows up when you line up ten or fifteen of them.

That’s when the real patterns appear. Maybe your concrete flatwork lands within a few percent of bid every time and your repair work is consistently ugly, because repair has unknowns you can’t see from the driveway and you’ve been pricing it like it doesn’t. Maybe the small jobs are dragging you down, because a $600 job carries the same drive time, the same paperwork, and the same supply run as a $3,000 job.

Those conclusions change what you bid on and what you charge, and they’re worth far more than any individual job’s postmortem. Contractors who track costs usually discover something uncomfortable about a category of work they thought was fine. That discovery is the entire point.

The reason most contractors don’t do this is that it’s a second job on top of the first one, tallying hours and chasing receipts at 8pm after a full day on site. Punchlist keeps the bid, the hours, the receipts, and the change orders attached to the job as it runs, so the bid vs actual comparison is already sitting there when the job closes instead of being something you have to reconstruct. Join the waitlist to get it when it ships.