How to Use Job Cost Reports to Sharpen Bidding Accuracy
Learn how to use job cost reports to sharpen bidding accuracy, reduce margin erosion, and build data-driven pricing for your manufacturing business.

Most quoting problems aren't math problems. The estimator does the math fine. The problem is the inputs: hours, yield and setup assumptions that were never checked against what the jobs actually took.
Job cost reports are how you check them. This post is about using closed jobs to fix your quotes: what to look at, how to turn it into a correction factor, and how to price from the corrected cost. The examples are illustrative, with the math worked out.
If you don't have job cost reports yet, start with how to set up a job costing system for manufacturers.
What is a job cost report, and why does it matter to manufacturers?
A job cost report shows what a job was estimated to cost and what it actually cost, line by line: material, labor hours, outside processing and applied overhead.
For bidding, the useful part is the gap between the two columns. One job's gap is noise. Twenty jobs of the same type with the same gap is a quoting assumption that's wrong.
That's the shift I'd push for. Stop reading job cost reports one job at a time to assign blame. Read them in groups to fix the estimate.
What does bidding without job cost history cost you?
Without history, every quote starts from the estimator's memory and a standard template. If the template is off, every quote built on it is off the same way.
The damage isn't symmetric. Where you quote too high, you lose the bid and never find out you were wrong. Where you quote too low, you win the bid and do the work at a thin margin. Over time your backlog fills with exactly the jobs you underpriced.
That's why a shop can be busy and still not make money. The quoting system is selecting for its own mistakes.
How do you read a job cost report for bidding?
I'd look at four things, in this order.
Labor hours, estimate vs actual. Hours drive labor and overhead, so they move cost the most. Split setup from run time if you can. Setup is where estimates are usually furthest off.
Material yield. Compare material issued to what the quote assumed. Drops, scrap and remakes all show up here.
Outside processing. Vendor prices for plating, heat treat and coating change. If the quote template still has last year's price, it's wrong.
Margin by job type and customer. After the cost lines, look at gross margin grouped by part family, material, process and customer. That's where patterns show up.
One caution: if overhead is applied by labor hours, an hours overrun also inflates overhead on the report. That's correct, but make sure you fix the hours assumption, not the overhead rate.
How do you turn closed jobs into a correction factor?
Group closed jobs that are alike: same process, similar size, similar material. Then compare total estimated hours with total actual hours for the group.
Illustrative example. Five recent jobs in the same part family:
| Job | Estimated hours | Actual hours |
|---|---|---|
| A | 40 | 46 |
| B | 32 | 35 |
| C | 55 | 63 |
| D | 28 | 31 |
| E | 45 | 52 |
| Total | 200 | 227 |
227 / 200 = 1.135. These jobs took 13.5% more hours than quoted, and every one of them ran over. That's not bad luck. It's the estimate.
Use totals, not an average of each job's percentage. Totals weight the bigger jobs more, which is what you want.
I'd wait for at least five or so similar jobs before changing a template. With fewer, one bad job can swing the factor. And look for the reason behind the number. If it's all in setup, fix the setup line, not the whole quote.
How does the correction change the price?
Say the estimator's template puts a new job in that family at 50 hours. Material is $3,000. The shop costs labor plus overhead at $95 an hour, its shop rate (illustrative, your own rate will differ). Target gross margin is 25%.
Old quote: 50 hours x $95 = $4,750, plus $3,000 material = $7,750 cost. Price for 25% margin = $7,750 / 0.75 = $10,333.
Corrected quote: 50 x 1.135 = 56.75, call it 57 hours. 57 x $95 = $5,415, plus $3,000 = $8,415 cost. Price = $8,415 / 0.75 = $11,220.
If you send the old $10,333 quote and the job runs like the last five, cost is $8,415. Margin is ($10,333 - $8,415) / $10,333 = 18.6%, not 25%.
Maybe the customer won't pay $11,220. That's a real business decision, and sometimes you take the work anyway. But make it knowingly, with the right cost in front of you.
What should a bid-ready job cost report include?
A report built for accounting and a report built for quoting are not quite the same. For quoting, you need enough detail to change a specific assumption. These are the fields I'd want on every closed job:
| Field | Why it matters for the next quote |
|---|---|
| Part family, material and process | Lets you group like jobs together |
| Quantity and number of setups | Separates setup cost from run cost per piece |
| Setup hours, estimate vs actual | Usually the biggest miss on short runs |
| Run hours by work center, estimate vs actual | Shows which operation is off, not just that the job was |
| Material issued vs quoted, in pounds or pieces | Separates yield problems from price changes |
| Outside processing, quoted vs billed | Catches stale vendor prices in the template |
| Rework hours and remakes | Shows quality cost that the quote never assumed |
| Price, cost and gross margin | The result you're trying to improve |
| One-line note from the shop lead | The reason behind the numbers |
The note is the most underrated field. "New fixture, first run" and "material came in out of spec" lead to very different fixes. Without the note, someone has to guess six weeks later.
If your system can't hold all of this, a simple spreadsheet next to the accounting system is fine to start. What matters is that it's filled in every time.
How do you quote work you have never run?
There's no history for a new part type, so you borrow it. Find the closest family you do have history on and start from its corrected numbers, not the raw template.
Then be explicit about the risk. Break the quote into setup and run so you can see which part is a guess. If the setup is truly unknown, one option is to quote first-article or tooling as a separate line. Another option is to add a contingency for the first order and plan to drop it on repeat orders once you know the real hours.
Either way, flag the job so it gets a careful review when it closes. The first run of a new part type is the most valuable job cost report you'll get for that family.
What about material prices that move after you quote?
A correction factor fixes hours and yield. It doesn't fix a price change between the quote and the purchase order.
For material that moves, I'd do two things. Put a validity date on every quote, so an old price can't be accepted months later. And for long or large jobs, consider pricing material at the cost on the order date, or adding a material adjustment clause, if your customers will accept it.
On the job cost report, keep material price and material quantity separate. If you only see the total, you can't tell whether to fix the estimate or the purchasing.
Margin or markup: which are you actually pricing to?
This one catches a lot of people. A 25% markup is not a 25% margin.
Markup is added on cost. Margin is measured on price. On the corrected job above, a 25% markup gives $8,415 x 1.25 = $10,519. The profit is $2,104, which is 20% of the price.
If you want a 25% margin, divide cost by 0.75. If your quote template multiplies cost by 1.25, you're pricing to 20%. Check which one your template does. It's a five-minute fix.
How do you feed actuals back into the estimating templates?
A simple routine works better than a big project.
- Close each job within about a week of shipping and confirm late bills are in or accrued.
- Each month, group the closed jobs by family and compare estimated with actual hours, yield and outside costs.
- Where a group is off in the same direction on most jobs, change the template assumption: setup hours, cycle time, yield or vendor price.
- Write down what you changed and when. Next quarter, check whether the gap closed.
Who should be in the room? The estimator, the shop lead and whoever owns the numbers. The shop lead usually knows why a job ran long. The numbers tell you whether it keeps happening.
If a single job went badly over, that's a different exercise. Our post on when job costs go over budget covers how to break down one overrun into price and quantity.
Using job cost data to pick better work
Once margin is grouped by job type and customer, you'll usually see that some work is clearly better than other work. The question is what to do with that.
A few options. Raise prices on the weak types. Change how you quote them, for example charging setup as its own line. Steer sales toward the strong types. Or, for a customer whose work never makes money, have the honest conversation.
I'd also look at contribution margin, not just gross margin, when the shop is full. If a machine is your bottleneck, the better job is the one that earns more per hour on that machine, not the one with the higher percentage.
When the shop is slow, it's different. A job that covers material, labor and some of the fixed overhead may be worth taking for a while. If you take it, know that's what you're doing, and don't let it become the new price.
What mistakes undermine bidding accuracy?
- Rework charged to general labor. The job looks fine, so the estimate never gets corrected.
- Outside processing missing from the job. The vendor bill lands in a general account and the job margin looks better than it was.
- Closing jobs late. Bills that arrive after the job was reviewed never make it into the lesson.
- One overhead rate for very different work. Simple jobs carry the cost of complex ones, so you overbid the simple work and underbid the complex work.
- Changing templates on one job. React to patterns, not single bad weeks.
Several of these come down to costs that never reach the job. The list in hidden job costing mistakes manufacturing owners make is a good checklist.
How do job cost reports fit into the monthly financial review?
Job costs should tie to the financials. If closed job costs for the month add up to something far from cost of goods sold, the job reports are missing cost and the quoting lessons will be wrong too.
In the monthly review, I'd add a short page: jobs closed, total estimated vs actual hours, margin by job type, and the two or three jobs furthest off. Then a line on what changed in the quoting template.
That page links the shop to the P&L. Our margin analysis post goes further on the reporting side, and a better way to manage your monthly close covers the close.
Jobs that keep running over also hit cash. More hours means more payroll before you can bill. If the overruns are concentrated on big jobs, it's worth watching in your cash planning too.
How do you know the quotes are getting better?
Track one number per job family: total actual hours divided by total estimated hours on jobs closed each quarter. In the example above it was 1.135.
If the template changes are working, that ratio should move toward 1.0 over the next few quarters. If it stays put, the change didn't address the real cause. If it drops well below 1.0, you may now be quoting too high and losing bids you should win.
Look at the win rate next to it. A ratio near 1.0 with a steady win rate is what you're after. Better quotes should mean fewer surprises, not just higher prices.
How we help
Our pricing and margin analysis work does exactly this: groups your closed jobs, finds where quotes and actuals keep drifting apart, and shows what each job type and customer really earns. As part of our manufacturing accounting work we keep the job cost data clean enough to trust.
We do a lot of this with CNC and precision machining and metal fabrication shops, where setup and cycle-time assumptions drive most of the quote. Happy to jump on a call if helpful.
Frequently Asked Questions
How often should I review job cost reports to improve bidding?
Look at each job when it closes and review groups of similar jobs once a month. Change quoting templates when a pattern holds across several jobs, not after one.
How many jobs do I need before adjusting my estimates?
I'd want at least five or so similar jobs. Fewer than that and one unusual job can swing the result.
What's the difference between markup and margin?
Markup is a percentage added to cost; margin is profit as a percentage of price. A 25% markup gives a 20% margin, so to get a 25% margin you divide cost by 0.75.
Can I do this without an ERP?
Yes. You need hours and material recorded by job and a consistent close-out. A spreadsheet of closed jobs grouped by type is enough to start.
Should I change the overhead rate if jobs keep running over?
Usually not. If the overrun is in hours, fix the hours assumption in the quote; change the overhead rate only if actual overhead spending or volume has changed.
More on: Cost Accounting · KPIs & Financial Reporting


