Key takeaways
- You know what you invoiced. The unknown side is almost always cost.
- Job costing is a recording problem before it is a reporting problem.
- The four inputs: hours, materials, work after delivery, and what an hour actually costs you.
- Callbacks and support are where jobs quietly lose money — usually in a different system with no link back.
- An hour’s cost is not the rate you charge for it, and using the rate makes every job look profitable.
Ask a project business what a job was worth and the answer comes back immediately. It is on the contract, it is on the invoices, everybody knows it.
Ask what the job cost and the room changes. Somebody offers a figure with a caveat. Somebody else says the real problem was the three weeks of snagging afterwards. Nobody actually knows, and — this is the important part — they are not being evasive. The information was never recorded in a form that could be added up.
It is a recording problem, not a maths problem
Job profitability is subtraction. There is no clever technique waiting to be adopted. What is missing is upstream: at the moment work happened, nothing tied it to the job it happened for.
So the useful question is not “how do we calculate project margin”. It is “when somebody spends an afternoon on this, where does that fact end up?” There are four inputs, and each one goes missing in its own characteristic way.
1. The hours
Hours are the largest cost in most project work and the most reliably lost. The reason is that “someone did some work” exists in several incompatible shapes in the same company: a timesheet for the office, a job card for the field crew, a note written on a maintenance visit, a line on a production report, an entry in whatever the project managers use.
Each of those is a perfectly good record. What none of them can do is be added to the others. So the honest total for a job is available in four places, in four formats, and in practice gets estimated instead.
The fix is structural rather than procedural. One record type — work happened, by this person, for this long, on this — that can attach to any kind of job. Then “how much time went into this?” is one query, whether the answer needs to cover a project task, a service call, a maintenance visit, a production run or a kind of work that only your business has.
If reporting an hour of work requires choosing which system to report it in, the total will always be an estimate.
2. The materials
Materials are easier to capture and easier to value wrongly, because there are two plausible numbers for the same item: what you paid for it and what you sell it for.
Job cost needs the first one, and the first one is not a single figure either — it depends on how your stock is valued. The same steel issued to the same job can cost you 10 or 12 depending on whether the system consumes the oldest batch or a blended average. If that sounds like a technicality, it is the difference between a job at 8% margin and a job at 3%. We wrote about what FIFO and moving average actually do separately; the point here is that job margin inherits whichever answer your inventory gives.
The practical requirement is that stock issued to a job is recorded as issued to that job, at cost, at the time it left the store — not reconstructed afterwards from a delivery note.
3. The work that happens after you have delivered
This is where jobs lose money, and it is the input almost nobody has.
The project closes. The invoice goes out. Then over the following months there are callbacks, warranty visits, questions that take half a day to answer, a part replaced free because it is easier than arguing. Each one is small. Collectively they are often the entire difference between the margin you reported and the margin you got.
Two things conspire to hide it. First, that work usually lands in a help desk or a support inbox, which is a different system from the one the project lived in, so there is no path back to the job. Second, by the time it arrives the project is closed, and closed projects stop being places anyone posts costs to.
What makes it visible is unremarkable once stated: a support ticket that carries both the customer it is for and the project it belongs to, plus an explicit answer to whether it is billable. That last attribute is the one that converts a vague sense that support is expensive into a number, per job, that you can act on.
Watch out for
Unbillable work being recorded as no work. When something is not going to be invoiced, the incentive to log it disappears — and the people doing it are often doing it as a favour to a customer. So the cost that most needs measuring is the cost least likely to be captured. Make logging it easy and make “not billable” a normal, respectable answer rather than an admission.
4. What an hour actually costs you
The final input is the one that quietly invalidates a lot of otherwise careful job costing: the difference between what an hour costs and what an hour is worth.
If you value logged time at your charge-out rate, every job you have ever done was profitable, by construction. Cost has to come from the employee’s own wage — the internal cost of that person’s time — which is a different number and usually a much smaller one.
Two honest caveats. A wage is not a fully loaded cost: employer contributions, equipment, vehicles, unbilled time and overhead all sit on top, and how much of that you allocate to a job is a management decision rather than a fact the software can discover. And an hourly cost for a monthly salary requires a divisor that somebody has to choose. Neither is a reason to skip the exercise — direct labour plus materials plus post-delivery work already tells you which of your jobs are quietly bad. It is a reason to be explicit about what is included, so that comparisons between jobs are comparisons of the same thing.
Then, and only then, is it a report
Once those four inputs attach to the job, the reporting is the easy part. Hours by job, cost of hours by job, materials issued at cost, post-delivery tickets and their hours, against what you invoiced. It can be a report, a dashboard tile, or a monthly export — the format is genuinely not the interesting decision.
Which is why so much job-costing effort is spent in the wrong place. The spreadsheet at the end is never the bottleneck. The bottleneck is that three of the four inputs live somewhere the spreadsheet cannot reach.
Where Capitán fits
Capitán is built so those inputs land on the job at the moment they happen rather than being reassembled later.
Work reporting is one record type that attaches to any kind of job — a project or one of its tasks, a service call, a maintenance visit, a production run, or a record type you defined yourself — so hours from the office, the field and the floor are the same data and can be totalled. Service tickets carry their customer, their project and an explicit billing option, which is what makes post-delivery cost attributable instead of anecdotal. Stock can be allocated and issued to a project from inventory at its actual cost, and each employee record in HR holds a base hourly wage, so the cost side of an hour is a figure you already have rather than a charge-out rate standing in for it.
The roll-up itself is a report you define against that data — one that can be pinned to a dashboard — rather than a fixed screen, because what belongs in “cost” differs between a construction firm, a software team and a service contractor, and a hard-coded definition would be wrong for two of the three.
If you want to test this on your own numbers, pick one job you suspect went badly and walk it through with us. Finding out which of the four inputs you currently cannot produce is the whole diagnosis.
The short version
You already know what you charged. Whether the job made money depends on four things you probably are not recording against it: hours, materials at cost, the work that happened after delivery, and what an hour of your team’s time actually costs. Fix the recording and the report writes itself.