All guides

Guide · Planning, buying and running AI

Automate Job Costing Reports Without Trusting a Single System

McGuire Flanigan · Updated November 1, 2026 · 11 min read

Labor hours, parts consumed, and sublet cost have to land on the same job before any report means anything. Here is how to reconcile all three around the platforms you already run, and exactly where a person stays in the loop.

Your Job Costing Report Is a Join, Not a Report

Every job costing report your business produces is a join across three systems that were never designed to hand each other a job identifier. That is the whole problem, and it is why the number can be wrong without a single line item on it being wrong. The report is the last step in the chain. It is almost never the step that breaks. It faithfully totals whatever arrived, and that is exactly what makes a bad job costing report so hard to argue with.

Three inputs have to land on the same job for the margin to be real. Labor hours, converted to a burdened cost. Parts consumed, at what they actually cost the shop. Sublet and vendor cost, from whatever outside party did work the shop does not do itself. Each one is created by a different person in a different system, on a different day, for a different reason. The report is the place where they finally have to meet, and it is the place with the least authority to make them.

This is why owners end up in an argument with their own software. The job costing feature inside a field service platform is a genuine feature and it is not lying to you. It is reporting on the data that lives inside that platform. Your parts cost arrives on a vendor purchase order. Your sublet cost arrives in an email inbox or a CIECA export. Your labor burden lives in a payroll journal. None of those three things is inside any single platform, which means no single platform can produce the number you are looking for.

Read the categories a level up and the pattern holds. Time tracking tools compute margin from verified hours at per-technician rates, which fixes labor and leaves the other two untouched. Field service platforms compute margin from their own price book and their own jobs, which is complete only for the work that never left the building. Accounting explainers describe the bucket correctly and say nothing about who failed to fill it. Every one of them is a partial answer presented as a whole one.

The rest of this page is the reconciliation. Not a better report. A process that runs underneath the report, on the systems that are already your system of record, and makes the three sources agree on which job paid for what.

See What the Missing Cost Is Doing to Your Margin

A job costing report contains only the cost that was allocated. This calculator starts from the cost the job should have carried and restates the margin with the unallocated portion added back. Nothing is submitted and no contact information is required.

What the customer is invoiced for this job, before any cost.

The margin the estimate assumed. This sets the total cost the job should carry.

Owned by The Shop. The share of this source that actually lands on the job.

Owned by Purchasing. The share of this source that actually lands on the job.

Owned by The Office. The share of this source that actually lands on the job.

Used only to annualize the leak. A shop at this volume does this many times.

Clocked time that never flags to a repair order. The payroll journal carries the cost and no job carries the hours, which makes this the most expensive of the three because there is no source document to recover it from.

Cost the business genuinely paid and cannot see on a job. None of this is estimated revenue or a projected gain. It is money already spent that the margin never recorded.

Illustrative estimate from the inputs above. Your own numbers will differ; this is not a measured result or client data.

One Repair Order, Five Places Cost Goes Missing

Follow a single job through the three systems that have to agree on it. Each stage names the real entity and states where the process typically breaks, because the break is almost never in the report.

Parts Received Against a Purchase Order

What Happens

Six line items arrive for one vehicle against a purchase order the shop raised two days earlier. At this moment the cost exists, it is correctly booked, and it is attached to a document instead of a job. Whether it ever reaches the repair order depends entirely on somebody remembering to do it, and nobody is measured on that.

This is where the second most common failure happens. The receipt posts to the ledger on time and the repair order is never updated, so the parts account carries a balance that nobody can reconcile and the job shows a margin it did not earn.

Cost Record

Sample figures for illustration only, not client data.

Why Labor Fails First and Fails Quietest

Of the three inputs, labor is the one that most often goes missing, and it is the one that is hardest to get back. The reason is structural rather than cultural. A technician's clock and a repair order are two separate records with no forcing function between them. The clock answers whether somebody was on site. The repair order answers what work was attributed to a vehicle. Neither record has any authority over the other, and no system will refuse to accept a shift that flags less time than it recorded.

So a technician clocks 5.4 hours and flags 3.6. Every number in the business is individually correct. Payroll pays 5.4 hours and it should. The repair order shows 3.6 hours of labor and that is what the technician attributed. The job costing report adds up the 3.6 and prints a margin. And somewhere in the business there is 1.8 hours of real, burdened, paid cost attached to no job at all. At a burdened rate in the low sixties, that is roughly $110 on one day for one technician. Run it across a shop for a month and it stops being a rounding error and starts being a hiring decision.

Here is why labor is worse than parts or sublet. When parts go unposted, there is usually a source document. There is a purchase order, a vendor, a packing slip, an amount, and a date. That is a recoverable trail, and a reconciliation can walk it back to a job within the same period. When sublet cost goes unallocated, there is usually an invoice with a vendor and a date, which is a weaker trail but still a trail. Unflagged labor has nothing. There is no document that says this 1.8 hours belonged to RO-41827 instead of the truck in the next bay. By the time the month-end report is read, the technician has moved on to other work, the repair order is closed, and nobody can reconstruct which vehicle consumed the time.

This is the argument for a daily check rather than a monthly one, and it is not about discipline. It is about the window in which the information still exists. A variance between clocked time and flagged time, computed per technician at the end of each day while the repair orders are still open, is a question somebody can actually answer the next morning. The same variance computed at month end is an accusation nobody can resolve, which is why month-end versions of this conversation tend to end with agreement that the report is unreliable and no change in the report.

What the reconciliation does at this stage is deliberately unglamorous. It compares two numbers that already exist in two systems every day. It lists the technicians with a gap and the repair orders they touched. It does not change the clock, it does not change the payroll, and it does not guess which job the hours belonged to. It puts the gap in front of a person while the answer still exists, which is the only thing that reliably recovers it.

Two Situations Where You Should Buy Something Else

Not an ERP, and if you need one you should go get one

If you run multi-phase construction projects with committed cost, change orders, retention, percentage-of-completion revenue recognition, and a job cost ledger that is the accounting system rather than a report out of it, you need a real construction ERP with a cost accounting module and the implementation budget to go with it. Those systems earn their cost because at that scale job costing is not a reconciliation exercise, it is the general ledger. This page is for the far more common case: a service business running one or more field platforms, a parts supply chain, occasional sublet work, and a separate ledger, where the three sources are never going to be replaced by one platform and the reconciliation has to live between them.

Not a labor rate or pricing engine

Nothing here decides what you should charge, what a technician's burdened rate should be, which jobs you should stop selling, or how to split overhead across jobs. Those are judgment calls with consequences that no reconciliation can own, because they depend on capacity, market position, and what the owner is willing to say no to. The system will tell you with precision which jobs lost money and which of the three sources caused it. What you do about a job that is consistently unprofitable at a rate you chose is a business decision, and it stays with the business.

Where the Line Sits on Every Cost-Adjacent Action

Straight Answers

Run the Tri-Source Check on Your Own Jobs

In thirty minutes we will take one month of your closed jobs and reconcile labor, parts, and sublet cost against them. You get the list of unallocated cost with the source that produced it, and you keep that list whether or not you hire us.

Questions operators ask

Can I just fix this in a spreadsheet?

You can, and plenty of shops do. The spreadsheet fails at the same point every time, and it is not the arithmetic. A spreadsheet has no way to notice that a purchase order was received and never posted, because that requires watching two systems that do not talk to each other and comparing what moved. It also has no way to know that a technician's clocked hours exceed their flagged hours, which requires the payroll journal and the repair order side by side. Both of those are detection problems, not calculation problems, and detection is what a spreadsheet cannot do without a person remembering to look every single day.

My techs already flag their time, so is this even a problem?

Flagging time and flagging all of it are different things. A shop where every technician flags time every day can still have a fifteen to twenty percent gap between clocked hours and flagged hours, and it is rarely deliberate. It is the diagnostic lap, the parts run, the help on somebody else's job, the twenty minutes at the end of a shift that does not obviously belong to any single repair order. Those hours get recorded on the clock because the clock is not optional, and they get dropped from the flag because the flag is. The reconciliation does not need anyone to flag more carefully. It needs the two numbers to be compared daily, while the repair orders are still open.

Should I clean up my accounting first?

It depends what you mean, and the honest answer surprises people. You do not need clean books to start, because the reconciliation is one of the tools that produces clean books. The unallocated parts and sublet cost it finds are, in the accounting sense, exactly the mystery balance sitting in your cost of goods sold accounts with no class assigned. What you do need is a stable chart of accounts with Item and Account mapping in place and, if you want job cost by class, class tracking turned on. If those are still being rebuilt, fix that first, because the reconciliation writes class-assigned entries and has nowhere useful to write them otherwise.

Does my field service software not already do this?

It does the part it can see, and it does it well. Job costing inside a field service platform is accurate for the work that starts and finishes inside that platform. It cannot be accurate for parts cost that arrives on a vendor purchase order in your ledger, or sublet work billed by an outside shop by email three weeks later. This is not a criticism of the software, it is a description of the boundary. Some platforms document this openly; Housecall Pro states that its job costing does not integrate with QuickBooks Online even though the product integrates with QuickBooks generally. You keep the platform as the system of record and put the reconciliation around it.

Will this tell me which jobs to stop selling?

It will tell you which jobs lost money and which of the three sources caused it, which is not the same as telling you what to stop selling. A service line can show a bad margin because the labor is genuinely underpriced, or because labor is being logged to it badly, and those two problems have opposite fixes. Restating the margin after reconciliation is what separates them. Once you can see a service line with clean cost attached, the decision about whether to keep selling it depends on capacity, on what your competitors charge, and on what you are willing to say no to. That is a business call and this page will not make it for you.

See where AI fits in your operation

Thirty minutes on how the work actually moves. No pack of agents. No obligation to build. If we can help, we will show you the first paths. If we cannot, we will say so.

Sources

  1. api.getjobber.com/api/graphql, api.getjobber.com
  2. api.tekmetric.com/api/v1, api.tekmetric.com

More guides on planning, buying and running ai