How to Spot Scope Creep in Your Cost Data
Why this matters
Scope creep is easy to describe and almost impossible to catch in the moment, because the person it is happening to does not experience it as creep. A tech gets asked one small thing, says yes, and moves on. The office never hears about it. By the time it reaches you it is a number: a job type running consistently over on hours with nothing in the notes to explain it. The reason to hunt it in the cost data rather than on site is that the data is the only place where the pattern is visible, and the fix for creep is the opposite of the fix for a low estimate. Confuse the two and you will raise a price that was never the problem, on the jobs that never had it.
What creep looks like in numbers rather than on site
On site, creep is a conversation. In the data it is one specific shape: cost rose, revenue did not. Work was added, the shop paid for it, and nobody billed it. Every other shape is something else, and separating them is the whole job.
That gives you a test with two axes, labor variance and parts variance, and one gate, the revenue check.
| Labor | Parts | What it is | What it is not |
|---|---|---|---|
| Over | On plan | Work added that consumed no new material. Creep, if revenue is flat. | A material pricing problem |
| Over | Over, roughly in proportion | The job was bigger than scoped from the start. Estimating or site-reading miss. | Creep |
| On plan | Over | Material price drift, a quantity error, or a substitution. | Creep |
| Over | Over, but parts far more | Usually a substitution plus the labor to fit it. | Creep |
The gate: in every one of those rows, if invoiced revenue rose roughly in step with cost, the extra work was added and billed. That is upsell, and it is a good outcome badly labelled. Creep is specifically the version where revenue stayed flat.
Step 1: Split labor variance from parts variance before you look for anything
Total variance is useless for this. A job that is 30% over on labor and 25% under on parts can present as roughly on target overall, and that job is a creep candidate hiding inside a number that says nothing happened. Build the two columns separately for every job in the type, and only then look at the shape.
Skipping this step is why so many shops conclude they do not have a creep problem. They looked at a total.
Step 2: Look for the extra visit, not just the extra hours
Creep does not always show up as longer hours on the same day. Very often it shows up as a second trip that never got its own job number: the tech comes back Thursday to finish the thing that got added Tuesday, and logs the time against the original job because that is where it belongs in his head.
Count jobs of the type that carry time entries on more than one calendar date, and compare that count against how many were scoped as multi-day work. The gap is your unbooked-return-trip population, and it is usually larger than anyone expects.
Step 3: Check the clock against the sign-off date
Time entries dated after the customer signed off are a strong signal. Either the work continued past the point everyone agreed it was done, or a return trip happened without a record. Both are creep, and both are invisible on the invoice because the invoice was already produced.
Pull any job with labor hours logged after its completion or sign-off timestamp and read the notes on each one by hand. There will not be many, and they are the most informative jobs in the set.
Step 4: Compare change orders raised against jobs that ran over
This is the single sharpest ratio in the article. For a job type, count the jobs that exceeded their estimated hours by more than a meaningful threshold, and count the change orders or added lines raised on that type in the same period. If the first number is many times the second, work is being added and not captured, and you do not need any further evidence of the mechanism.
A healthy ratio is not one change order per overrun job, because plenty of overruns are honest estimating misses with no scope change at all. But a type running nine badly-over jobs against a single change order is not a mix of causes, it is a process that has no capture step in it.
Step 5: Read the customer, not just the job type
Creep concentrates. It clusters on repeat customers who are comfortable asking, on properties with more than one system on site, on jobs where the decision-maker is present the whole time, and on accounts where somebody once said yes to a favor and set a precedent. Cut your overrun jobs by customer and by property before you conclude the job type is the unit of the problem. Often three accounts are producing most of it, and that is a conversation, not a template change.
A worked detection: one job type, one quarter
A shop looks at its "service call with repair" type. Twenty-four of them ran in the quarter, each estimated at 2.5 labor hours, so 60.0 estimated hours committed.
Step 1, the split. Actual labor across the 24 jobs totalled 74.4 hours, which against 60.0 estimated is 24% over. Parts came in 2% above estimated parts cost, effectively on plan. That is the first row of the table: labor over, parts flat.
The gate. Invoiced amounts across the 24 jobs averaged 1% above the quoted amounts. Revenue did not move with cost. Creep candidate confirmed as a hypothesis, not yet as a finding.
The shape. Before accepting "this type runs 24% over," look at the distribution. Fifteen of the 24 jobs landed within 10% of their estimated hours, with a median of 3% over. Applying that median, those 15 jobs account for about 15 x 2.5 x 1.03 = 38.6 hours. The remaining nine jobs therefore account for 74.4 - 38.6 = 35.8 hours, which is 3.98 hours each against 2.5 estimated, about 59% over.
That is the finding that changes everything. The type is not uniformly 24% over. Fifteen of the 24 jobs are essentially on target and nine of the 24 are running about 59% over. A shifted center would have been a template problem. A clean group and a badly-over group is a subset problem, which is what creep looks like.
Step 2 and 3. Of the nine overrun jobs, three carried time entries on a second calendar date with no return visit scheduled and no second job number, and all three had hours logged after the sign-off timestamp.
Step 4. One change order was raised on this job type in the entire quarter, against nine jobs that ran more than 40% over. One capture event for nine overruns is not a mixed-cause picture.
Step 5. Seven of the nine were repeat customers, and the notes on six of those seven mention a second issue the tech was asked to look at while on site. None of those second issues appear on an invoice line.
The wrong correction. The obvious move from the headline number is to multiply the template's labor line by 1.24. Run that against the clean jobs: 2.5 x 1.24 = 3.1 estimated hours quoted against an actual of about 2.575 hours, which prices those 15 jobs roughly 20% above what they consume. You would have made two-thirds of your work uncompetitive to cover a capture failure on the other third, and the nine creep jobs would still absorb their extra hours because nothing about the mechanism changed.
The right correction. Leave the template alone. Add a capture step at close-out: any task not on the original scope gets a line before the job can be marked complete, even if the line is priced at zero because you chose to give it away. Deciding to give it away is fine. Not knowing you gave it away is the problem. Then have the office call the three repeat accounts that produced most of the nine and reset the expectation before the next visit.
Distinguishing creep from a bad estimate, because the fixes point opposite ways
Both present as hours over estimate. Three tests separate them, and you should run all three before deciding.
Distribution shape. A low template shifts the whole distribution: most jobs of the type run over by a similar amount, and the middle half of the jobs sits above zero. Creep is bimodal: a clean cluster and an over cluster.
Parts movement. A job that was genuinely bigger than scoped usually consumed more material as well as more time. Creep that consumes no material at all is common, because the added tasks are frequently adjustments, checks, cleanup, and troubleshooting.
The notes. A bad estimate leaves no trace in the job notes because nothing unexpected happened, the job simply took longer than the number said. Creep leaves language: "while I was there," "customer also asked," "went ahead and."
If all three point at a low template, change the template. If they point at creep, the template is fine and the capture process is not. If they genuinely point both ways, split the type in two and measure each half, because you probably have two job types sharing a name.
How to verify you found creep and not something else
Deploy the capture step, then re-measure the same job type one quarter later and check two numbers together, not one.
The overrun cohort should shrink, and invoiced revenue on the jobs that still run over should rise. Both moving is confirmation. If hours stay high and revenue is still flat, the added work is not being captured even with a capture step, and the next question is whether the field rule is being followed or whether the extra hours were never scope at all.
If hours drop but revenue does not rise, you did not capture creep, you stopped it, and the customers who were getting free work will notice. That is a real outcome and it is worth being ready for, but it is a different one than billing for what you were already doing.
References
- U.S. Small Business Administration (SBA), contract and change management guidance for small business
- Trade-standard practice for change-order capture and scope documentation
- See related: Scope Creep Starts at the Estimate, Service Call Scope Creep, How to Cost a Job That Changed Mid-Stream, The Signed Scope That Prevents the Dispute, How to Read Your Own Job Costing Data