You Are Pricing Jobs on Incomplete Data: How Margin Erosion Starts at the Cost Capture Layer
A field service company closes its books on Q3. Revenue is up 14% year over year. The operations team ran hard: more jobs completed, more technicians deployed, higher billing volume than any prior quarter. The CFO pulls the margin report and finds that net margin dropped from 18% to 11%.
Nobody can explain it immediately. The jobs were completed. The invoices were paid. The revenue is real. But the cost side of the ledger tells a different story: one that the job costing system did not capture in time for anyone to act on it while the quarter was still running.
The margin erosion did not happen at invoicing. It happened at the cost capture layer, weeks earlier, one incomplete record at a time.
Inaccurate job costing is not primarily an estimating problem. Estimating errors contribute to margin variance, but they are visible and correctable: a quoted price that proves too low gets repriced on the next job. The more damaging problem is incomplete cost capture: the systematic failure to record every labor hour, every material consumed, every subcontractor cost, and every overhead allocation against the specific job that generated it, at the moment it was incurred. When cost data is incomplete, job margin calculations are incomplete. When margin calculations are incomplete, the business prices future work on a cost model that does not reflect reality.
The gap between quoted margin and actual margin: what this article will call the margin erosion cascade is not a single error. It is the cumulative effect of four or five small capture failures that each reduce actual margin by 2 to 8 percentage points. Individually, each failure is manageable. Combined, they can convert a job quoted at 20% margin into a job that closes at 4%, or below zero, while the job cost report still shows the quoted figure because the actual costs were never fully recorded.
The Margin Erosion Cascade: How Small Capture Failures Compound
Each cost component in a job, labor, materials, subcontractors, overhead, rework has a capture point: the moment and mechanism by which the actual cost is recorded against the job record. When that capture point fails when the cost is recorded late, recorded against the wrong job, estimated rather than measured, or not recorded at all, the job cost record understates the true cost by exactly that amount. The margin calculation built on that record is wrong by the same amount.
The cascade effect occurs because the failures are independent and cumulative. A labor capture failure that reduces actual margin by 6% does not interact with a material capture failure that reduces it by another 4%. They add. A job with four independent capture failures each individually small and each individually defensible as a rounding issue or a minor process gap, can have its actual margin understated by 15 to 25 percentage points relative to what the job cost system reports.
The Arithmetic of Margin Erosion
The following table makes the cascade concrete. Each row introduces one additional capture failure against a job quoted at 20% margin. The final row shows the combined effect of all four failures simultaneously the condition that describes most operations that have not implemented job-level cost capture.
Costing Scenario | Quoted Margin | Actual Margin | Margin Gap | Operational Status |
Job quoted at 20% margin, labor underestimated by 8% | 20.0% | 12.0% | -8.0% | Profitable — barely |
Material cost increased after quote, not captured in job record | 20.0% | 9.5% | -10.5% | Margin below cost of capital |
Rework hours not attributed to originating job | 20.0% | 4.0% | -16.0% | Near breakeven |
Overhead allocated at prior-year rate, actual overhead +22% | 20.0% | -2.0% | -22.0% | Operating at a loss |
All four errors present simultaneously | 20.0% | -8.5% | -28.5% | Significant loss — reported as profit |
The last row: all four errors present simultaneously, reported margin 20%, actual margin -8.5% is not a hypothetical. It is the cost structure of any operation where labor is allocated from weekly timesheets rather than captured at the job level, where material costs are tracked against planned BOM quantities rather than actual consumption, where overhead is allocated at a standard rate that has not been updated since the prior fiscal year, and where rework hours are absorbed into general overhead rather than attributed to the jobs that generated them.
The business in that last row is reporting profitability it does not have. Every pricing decision made from that cost model perpetuates the loss.
The Four Cost Capture Failures That Erode Job Margin
Each failure below has a precise technical cause and a precise technical fix. The fix in every case is the same structural principle: record the actual cost against the specific job at the moment the cost is incurred, not from a weekly timesheet, not from a planned BOM, not from last year’s overhead rate.
Failure 1: Labor Allocated from Estimates, Not from Actual Time
The most common source of job costing inaccuracy is labor. In most service and manufacturing operations, labor is tracked through a payroll system that records total hours worked by employee and pay period. The allocation of those hours to specific jobs happens as a secondary step, either through a timesheet the employee completes at the end of the week, or through an allocation of total hours proportional to the jobs scheduled during that period.
Neither method captures actual labor at the job level. Weekly timesheets are completed from memory employees round to the nearest half hour, attribute hours to the most memorable job of the week rather than the most accurate, and rarely capture the 20 minutes of rework on Tuesday afternoon that nobody wants to document. Proportional allocation is worse: it distributes labor cost based on scheduled activity rather than actual activity, which means the job that ran over schedule absorbs the same labor allocation as the job that ran under.
The fix is job-level time capture at the moment of work: the technician or operator records time against a specific job ID and task code when they start and stop work, not at the end of the week. The time record is created at the point of activity, not reconstructed from memory. Variance against the estimated labor hours is visible in the job cost record in real time not discovered at job close when corrective action is no longer possible.
Failure 2: Material Cost Tracked Against Planned BOM, Not Actual Consumption
A bill of materials defines what a job is expected to consume. Actual consumption deviates from the BOM on every job where a substitution was made, where scrap exceeded the planned allowance, where a component was damaged during installation and replaced, or where a design change mid-job required additional materials not in the original specification.
When materials are issued from stock against planned BOM quantities, and the actual consumption is not recorded as a discrete transaction against the job, the job cost record carries the planned material cost, not the actual material cost. The variance between planned and actual accumulates invisibly in the inventory adjustment account. It surfaces at month-end as an unexplained variance, disconnected from the jobs that generated it, impossible to attribute and therefore impossible to price correctly on the next similar job.
Failure 3: Rework and Scrap Absorbed into Overhead
Rework, the labor and materials consumed correcting a defect in a completed or in-progress job, is among the most damaging costs to job margin because it is almost never attributed to the job that generated it. The standard accounting treatment is to absorb rework into manufacturing overhead or into a general rework cost center. The overhead rate rises. Every subsequent job’s margin is reduced slightly by the absorbed rework cost. The job that generated the rework carries none of it.
This treatment has two consequences. First, it systematically overstates the margin on high-rework jobs and understates it on low-rework jobs, producing a cost model that rewards poor-quality work with better-looking margin figures. Second, it eliminates the data needed to identify rework patterns: which jobs generate the most rework, which technicians or work cells generate the most rework, which product types or customer specifications are associated with the highest rework rates. That data is the foundation of quality improvement. When it is absorbed into overhead, it disappears.
Failure 4: Overhead Allocated at a Standard Rate That Does Not Reflect Current Cost
Overhead allocation in job costing applies a rate, typically expressed as a percentage of direct labor cost or direct labor hours, to distribute indirect costs across jobs. That rate is set at budget, once per year, based on the prior year’s overhead and the projected volume for the coming year. By the third quarter of the year, the actual overhead rate diverges from the standard rate as actual indirect costs accumulate and actual volume deviates from projection.
Jobs completed in Q4 carry an overhead allocation that may be 15 to 25% above or below the actual overhead cost for that period depending on whether the business ran above or below the projected volume. When overhead is under-allocated, job margins are overstated. When it is over-allocated, they are understated. Either condition produces a cost model that misprices future work and the error is not discovered until the annual review when the actual overhead rate is reconciled against the standard rate applied throughout the year.
Stat: Operations with manual, timesheet-based labor allocation report an average job costing accuracy of 71%, meaning 29% of actual labor cost is either misallocated or unattributed.
(Aberdeen Group Service Management Report, 2024)
Stat: Companies that implement job-level cost capture: recording labor, materials, and overhead against the specific job at the moment of incurrence, reduce job costing variance from an industry average of 18% to under 4%.
(MHI Operations Excellence Survey, 2023)
Stat: 61% of service and project-based operations discover job losses only at job close after the work is complete and corrective action is no longer possible. Real-time job cost visibility reduces this figure to under 8%.
(Field Service News, 2024)
The Job-Level Cost Capture Architecture
Accurate job costing requires a data architecture that captures every cost component against the specific job that generated it, at the moment the cost is incurred, through a mechanism that does not depend on memory, estimation, or end-of-period reconciliation. That architecture has five components, one for each major cost category that contributes to job margin.
The Job Cost Record as the Organizing Data Structure
Every cost-generating event in the operation a labor hour recorded, a material issued, a purchase order raised, a subcontractor invoice received, an overhead period closed must reference a job ID as the primary organizational key. The job cost record is not a report generated at job close. It is a live accumulator: a database record that receives cost transactions in real time and maintains a running actual cost against the estimated cost from the moment the job opens to the moment it closes.
The computed `ActualMargin` column updates every time a cost transaction posts to the job. A supervisor reviewing open jobs sees not the quoted margin but the current actual margin, updated to the last transaction. A job trending toward a loss is visible while the job is still in progress, when there is still time to adjust scope, accelerate completion, or renegotiate with the client.
Five Cost Components, Five Capture Points
The following table maps each major cost component to its capture point, showing the difference between operations that allocate costs from estimates and operations that capture costs at the point of incurrence.
Cost Component | Capture Point | Without Job-Level Capture | With Job-Level Capture |
Labor | Time entry by job and task code | Timesheet submitted weekly, allocated to job by estimate. Overtime, rework hours, and idle time absorbed into overhead not attributed to originating job. | Time recorded against job ID and task code at the moment of work. Rework hours flagged as a separate cost code. Variance against estimate visible in real time, not at job close. |
Materials | Consumption recorded against job BOM | Materials issued from stock against planned BOM quantities. Substitutions, overages, and scrap recorded separately or not recorded at all. Actual material cost reconstructed at job close from memory and delivery notes. | Every material issue records the job ID, the item, the quantity, and the variance against BOM. Substitutions and overages create exception records with cost impact calculated immediately. |
Subcontractor costs | PO linked to job at requisition | Subcontractor invoices processed through accounts payable and allocated to a cost center not to the specific job that generated the cost. Job margin calculation excludes subcontractor spend. | Every subcontractor purchase order is linked to the originating job at requisition. Invoice processing routes through that link. The job cost record includes subcontractor spend as a discrete cost line. |
Overhead | Allocated by actual rate, updated per period | Overhead allocated at a standard rate set at budget. Actual overhead diverges from standard as the year progresses. Jobs completed late in the year carry overhead allocations that do not reflect actual cost. | Overhead rate updated per accounting period based on actual cost data. Jobs completed in any period carry the overhead rate applicable to that period not the annual budget rate. |
Rework and scrap | Attributed to job and root cause code | Rework hours and scrapped materials absorbed into general production overhead. The job that generated the rework does not carry the cost. Margin on that job is overstated. The root cause of the rework is not tracked. | Rework hours and scrapped materials attributed to the originating job with a root cause code. Job margin reflects the true cost. Root cause data accumulates into a defect analysis that supports process improvement. |
How Phoenix Consultants Group Implements Job-Level Cost Capture
Phoenix Consultants Group deploys FireFlight Data System with job costing architecture built on real-time cost accumulation: every labor hour, every material transaction, every subcontractor purchase order, and every overhead allocation posts directly to the job cost record in SQL Server at the moment of incurrence. The job margin figure a supervisor sees on the FireFlight dashboard is not an estimate updated weekly, it is a computed value recalculated on every transaction, reflecting the actual cost position of the job as of the last posted event.
The implementation maps every cost-generating event in the operation to a capture point and a job linkage before configuration begins. That mapping identifies the specific gaps where actual costs are currently being absorbed into overhead or allocated from estimates rather than captured at the job level, the labor allocation that relies on weekly timesheets, the material issues that reference planned BOM quantities, the rework that disappears into a general cost center. Each gap becomes a configuration target. The implementation closes each gap with a specific capture mechanism: time entry by job and task code, material issue by job ID and scan confirmation, rework attribution by job and root cause code.
Evidence of deployment:
Phoenix Consultants Group has implemented job-level cost capture architecture for field service operations, project-driven manufacturers, and equipment service organizations, environments where job profitability analysis drives every pricing and resourcing decision. In each case, the implementation begins by mapping the variance between quoted margin and actual margin on the prior 12 months of closed jobs. That variance analysis identifies which cost components are being captured accurately and which are being estimated, allocated, or absorbed, and the implementation closes each gap in order of margin impact.
Authority FAQ
Our estimating team is experienced and our quotes are competitive. Why would job costing inaccuracy still be a problem?
Estimating accuracy and cost capture accuracy are independent variables. An experienced estimator who correctly predicts that a job will require 120 labor hours and $8,400 in materials has produced an accurate estimate. If the job actually consumes 138 labor hours (because two technicians spent 9 hours each on rework that was not attributed to the job) the job cost record still shows 120 hours. The estimator was not wrong. The cost capture was incomplete. The margin variance is not an estimating failure. It is a data architecture failure. The estimating team’s accuracy cannot be evaluated or improved without a cost capture system that records what actually happened, not what was planned.
We close jobs monthly and reconcile costs at that point. Is monthly reconciliation sufficient for accurate job costing?
Monthly reconciliation produces accurate historical records, it tells you what each closed job actually cost. It does not give you the ability to act on cost overruns while the job is still open. For jobs that close within a single month, monthly reconciliation is operationally adequate. For multi-week or multi-month jobs, common in field service, construction, and project manufacturing, a cost overrun identified at month-end reconciliation may represent two to four weeks of accumulated variance that has already been incurred and cannot be recovered. Real-time job cost accumulation surfaces the overrun at the transaction level, within hours of the cost event, when scope adjustment, resource reallocation, or client communication is still possible.
How does the system handle jobs where the scope changes mid-execution and the original estimate no longer applies?
Scope changes in a properly architected job costing system generate a change order record linked to the original job ID. The change order carries its own estimated cost and revenue, additional labor, additional materials, additional subcontractor scope and posts to the job cost record as an addendum to the original estimate. The job cost record then tracks actual cost against the revised total estimate, not the original. The margin calculation reflects the complete scope, including all approved changes. Unapproved scope additions, work performed beyond the change order, generate a variance flag rather than silently inflating actual cost against an estimate that was never updated to reflect the additional scope.
We use a separate payroll system for time tracking. How does that integrate with job-level cost capture?
There are two integration models, and the choice between them depends on how granular the payroll system’s time data is. If the payroll system captures time by job and task code, as some field service management systems do, that data can be extracted via API or file transfer and posted to the job cost record in FireFlight Data System on a daily or per-shift basis. If the payroll system captures only total hours by employee and pay period, the integration model requires a separate time entry mechanism at the job level, a mobile time entry interface or a workstation-based time clock that records job ID and task code at the point of activity, with the payroll system used only for compensation processing. The job costing data and the payroll data serve different analytical purposes and do not need to come from the same source, provided both sources are accurate at their respective levels of granularity.
About the Author
Allison Woolbert: CEO & Senior Systems Architect, Phoenix Consultants Group
Allison Woolbert has 30 years of experience designing and deploying custom data systems for operationally complex organizations. As the founder and CEO of Phoenix Consultants Group, she has led job costing architecture engagements for field service companies, project manufacturers, equipment service operations, and construction-adjacent businesses throughout the United States.
Her diagnostic starting point for every job costing engagement is the same: pull the last 12 months of closed jobs, calculate the variance between quoted margin and actual margin on each one, and identify which cost component accounts for the largest share of that variance. That analysis takes minutes with the right data. In operations without job-level cost capture, it takes weeks and the answer is always the same cost component that was never captured at the job level.
phxconsultants.com | fireflightdata.com