Almost every contractor who asks about job costing has already tried it once. The customer and project fields got switched on, a few costs were coded, and within a couple of months the reports stopped tying to anything. The setup was not wrong so much as unfinished.
Job costing is a discipline with a software component, not a software feature with a discipline component. What follows is the order that actually holds up: decisions first, structure second, capture third, reporting last.
Why job costing usually stalls
Three failure modes account for most of it.
The job list drifts. Someone creates "Henderson Remodel" while someone else creates "Henderson kitchen" and the estimator has "Henderson 2nd St" in a spreadsheet. Within a quarter there are three versions of the same job and no report can reconcile them.
Coding happens late. A material receipt coded a week after purchase is coded from memory. A month later it is coded from a guess. The cost still lands in the file, so nothing looks broken, but the job it lands on is wrong often enough to make the margin meaningless.
Labor never arrives. This is the big one. Labor is frequently the largest single cost on a job, and in most files it enters QuickBooks Online as one lump payroll entry with no job attached. A gross margin calculated without labor is not a gross margin.
None of these are software problems. They are all decisions about who does what, and when.
Decide what a job is before you touch the software
The most consequential choice comes first: what is the smallest unit you will report on?
There are three sensible answers, and the right one depends entirely on who is going to maintain the coding.
- Job level. One record per contract or per address. Simplest to maintain, and enough to answer "did this job make money".
- Phase level. Job, subdivided into a handful of stages such as demolition, rough-in, finish. Useful on longer jobs where a margin problem in one phase would otherwise be hidden by another.
- Cost code level. A full code structure, sometimes dozens of codes per job. Powerful, and the level at which most small contractors abandon the effort within two months.
Deeper is not better. A structure nobody maintains produces reports that are precisely wrong rather than roughly right. If in doubt, start at job level, run it for two quarters, and add phases only where you have a specific question the job level could not answer.
Then write down the naming convention. Address first, or client first, but one of them, everywhere: the job list, the estimate, the purchase order, the field paperwork. This sounds trivial and it is the single most common reason job reports cannot be reconciled six months in.
Separate direct cost from overhead in the chart of accounts
Job costing depends on a chart of accounts that distinguishes cost of the work from cost of the company. If field wages and office wages sit in the same account, no report can separate them afterwards.
A workable structure for a small contractor keeps four direct cost groups above the gross profit line:
- Materials. Purchased for a specific job.
- Labor and burden. Field wages, plus the payroll taxes and workers compensation attributable to that labor.
- Subcontractors. Invoiced against a job.
- Other direct costs. Equipment rented for the job, permits, dump fees, job-specific travel, small tools consumed on the job.
Everything else, office salaries, rent, insurance not tied to a job, software, marketing, professional fees, financing costs, sits below gross profit as overhead.
Where a cost genuinely could go either way, and several can, the answer is to choose once, write the choice down, and apply it every month. A consistently defined margin is more useful than a theoretically perfect one that changes definition each quarter. There is a longer treatment of the boundary in direct costs versus overhead.
Get labor onto the job
This is where job costing is won or lost, and it is not primarily an accounting task.
The accounting side is straightforward: payroll enters QuickBooks Online as separated components, wages, employer taxes, withholdings, net cash, rather than one combined figure, and the wage portion is allocated to jobs. What makes that possible is the data underneath it.
You need time captured against jobs
No accounting treatment can recover detail that was never recorded. If crews record hours as a daily total with no job reference, labor cost per job is unrecoverable for that period, and the honest thing is to say so rather than allocate by estimate and call it actual.
Whatever your crews will actually use is the right tool, whether that is a time tracking app, a field app that already knows the job, or a paper sheet with a job column that the foreman fills in daily. The test is not sophistication. The test is whether it is complete on Friday.
Burden has to follow the wages
Raw wages understate labor cost, often by twenty to forty percent depending on your workers compensation rates and benefit load. If burden sits in overhead while wages sit in direct cost, every job looks more profitable than it is, and the error is proportional to how labor-heavy the job was, which is the worst possible distribution.
The practical approach is to allocate employer payroll taxes and workers compensation to jobs on the same basis as the wages they relate to. Where a precise allocation is impractical, a documented burden rate applied consistently is far better than leaving burden out.
Get materials and subcontractor costs onto the job
Materials and subcontract costs are easier than labor, because they arrive with paperwork. The discipline is making the job reference a condition of processing.
- Purchase orders carry the job. If the PO has a job number, the invoice will too, and the coding is decided at the point of ordering rather than reconstructed later.
- Subcontractor invoices without a job reference get returned. Vendors will comply quickly once this is consistently applied, because it is a condition of getting paid.
- Supply house accounts get job references at the counter. Most suppliers will print a job or PO field on the invoice if asked, which removes the guesswork entirely.
- Credit card purchases get coded the same week. Receipt capture in QuickBooks Online, or a photo sent the same day, with the job written on it.
Enter subcontractor and vendor bills in the period the work happened, not the period you paid them. A job that shows materials and labor in March and the subcontractor invoice in May will report a fictional margin in both months.
Track committed cost, not only spent cost
A report that shows only invoiced cost tells you where the job was, not where it is going. By the time a subcontractor invoice arrives, the decision it might have informed has already been made.
Committed cost is spent cost plus approved-but-unbilled obligations: open purchase orders, signed subcontracts not yet invoiced, approved change orders with cost attached.
You do not need specialist software for this on a small job list. A maintained schedule of open commitments per job, reviewed weekly, is enough to turn a lagging report into a usable one. What matters is that the number exists somewhere consistent, and that the person pricing the next job knows to look at it.
Handle change orders while the job is open
Change orders are the most common reason a job that looked profitable at 60 percent complete finishes below margin.
The pattern is familiar: work is added in the field, the crew does it because stopping is worse, and the paperwork lags. The cost lands on the job immediately. The revenue lands when someone gets round to the change order, sometimes after the job closes.
The bookkeeping fix is partial but real. Record the approved change order value against the job contract as soon as it is approved, and keep a visible list of performed-but-unapproved work. Then the margin report shows a job with unbilled work, which is a question, rather than a job with poor margin, which is a conclusion.
Anything genuinely unrecoverable should be visible as such. A contractor who can see how much unbilled change order work a job absorbed has an operational problem to fix. A contractor who only sees a low margin has a mystery.
The reports worth running
Once the coding holds, four reports do most of the work. All four exist in QuickBooks Online without add-ons.
- Profit and Loss by job, for the period. Revenue and the four direct cost groups per job, with a gross margin percentage. The core report.
- Job cost detail for one job. Every transaction coded to a job, used when a margin looks wrong and you need to know why.
- Estimate versus actual. Only as good as the estimate loaded into the system, and worth the effort if you want the estimating feedback loop to close.
- Unbilled cost and open receivables by job. Cost incurred and not yet billed, plus what is billed and unpaid, including retainage held. This is a cash report as much as a margin report.
Run them monthly, after the close rather than before. A margin report built on unreconciled accounts will be revised, and a report that gets revised twice teaches people to ignore it.
The monthly checks that keep it honest
Job costing degrades quietly. Five checks catch most of the drift.
- Job columns sum to the company total. If they do not, cost is sitting uncoded, and the difference tells you how much.
- The uncategorized and ask-my-accountant accounts are empty. A balance there means the report is unfinished.
- No job appears twice under different names. Review the job list, not just the report.
- Labor is present on every active job. A job with materials and no labor is almost always a capture failure, not a job that nobody worked on.
- Closed jobs get reviewed against the estimate. This is the step that makes the whole exercise pay, and the one most often skipped.
Where contractors get stuck, and what actually helps
Three patterns come up repeatedly.
"We set it up but the numbers do not tie." Almost always uncoded labor or duplicated transactions from a bank feed re-import. Both are findable in an afternoon. Check whether job columns sum to the company total first, because that single test points at the cause.
"The crews will not use the time app." Then the app is wrong for the crews. A paper sheet with a job column, collected daily, produces better data than sophisticated software nobody opens. Choose for completeness, not features.
"It worked for three months and then stopped." Usually because one person was holding it together informally. Job costing survives when the coding is a condition of a transaction being processed, not a task someone does when there is time.
If the file is already inconsistent, resist the urge to backfill from memory. Establish a clean start date, get the structure right from that point forward, and treat the earlier history as approximate. Two accurate quarters are worth more than two years of reconstructed guesses. If the file is also behind on reconciliation, that comes first: cleanup and catch-up before job costing, because coding into an unreconciled file means coding twice.
The short version
Decide the reporting unit and the naming convention before touching the software, separate direct cost from overhead in the chart of accounts, and get labor onto jobs, because labor is usually the largest cost and the one most often missing. Then run the job margin report monthly, after the close, and check that job columns sum to the company total.