Esc

↑↓ move↵ openIndex · Pagefind

Cost-to-cost percent complete: when it lies and how to catch it

Cost-to-cost is the most common way contractors measure progress, and it's only as honest as the cost to complete behind it. Five ways it misleads, a worked example of each, and the cross-checks that catch them early.

Charley Forey5 min readAccountingWIPForecasting
On this page
  1. 1. Material bought before it’s installed
  2. 2. Costs that haven’t arrived yet
  3. 3. A stale cost to complete
  4. 4. Inefficiency counted as progress
  5. 5. Costs coded to the wrong job
  6. How to catch it
  7. Why it’s hard to catch today
  8. What we’re building

Cost-to-cost is the default way most contractors measure percent complete on long-term contracts. It’s simple, it uses numbers accounting already has, and auditors understand it:

percent complete = cost to date ÷ estimated total cost

It also has a quiet assumption baked in: that every dollar spent represents the same amount of progress as every other dollar. When that’s true, cost-to-cost is a good measure. When it isn’t, the job’s revenue, margin and over/under billing are all wrong, and they’re wrong in a way that looks perfectly reasonable on the WIP schedule.

Here are the five most common ways it goes wrong.

Illustrative numbersThe examples below use one made-up job so the effects are easy to compare: a $10,000,000 contract with an estimated total cost of $9,000,000 (10% margin).

1. Material bought before it’s installed

The mechanical sub buys $600,000 of rooftop units early to lock pricing. The invoice posts. Cost to date jumps by $600,000, and percent complete jumps with it, even though not one unit is on the roof.

Without the units With the units
Cost to date $3,600,000 $4,200,000
Percent complete 40.0% 46.7%
Earned revenue $4,000,000 $4,666,667

That’s $666,667 of revenue recognized for equipment sitting in a warehouse. Revenue recognition guidance under ASC 606 recognizes this problem: costs that don’t depict progress, such as certain uninstalled materials, can be excluded from the measure of progress. Many contractors handle it by tracking uninstalled materials separately and keeping them out of cost-to-cost until installed. Your CPA should set the policy, but the fix is the same either way: you have to know which costs are uninstalled material.

2. Costs that haven’t arrived yet

The opposite problem. A sub did $300,000 of work in March but won’t bill until April. Unless someone accrues it, March cost to date is $300,000 light, so percent complete is understated, earned revenue is understated, and the job looks overbilled.

This one is endemic. Sub pay apps usually lag the work, and accruals often depend on someone in accounting knowing what happened in the field. Commitments help here: if you know the subcontract, its schedule of values and what the PM has seen installed, you can estimate the accrual instead of waiting for the invoice.

3. A stale cost to complete

This is the big one, and we’ve written about it in over billing vs under billing. Cost to date is a fact. Cost to complete is an opinion. If costs are running hot and the forecast hasn’t moved, percent complete inflates:

Forecast as booked Honest forecast
Cost to date $5,400,000 $5,400,000
Cost to complete $3,600,000 $4,300,000
Estimated total cost $9,000,000 $9,700,000
Percent complete 60.0% 55.7%
Earned revenue $6,000,000 $5,567,010
Projected margin 10.0% 3.0%

The stale forecast overstates revenue by about $433,000 and hides seven points of margin fade. Nothing about it looks wrong on the WIP schedule. It’s a perfectly reasonable 60%.

4. Inefficiency counted as progress

A crew spends 400 extra hours reworking a wall assembly that failed inspection. Those labor costs are real, and they hit cost to date. But the job isn’t 400 hours further along. Under cost-to-cost, the rework looks like progress, which pushes revenue forward. ASC 606 guidance also addresses this: costs from significant inefficiencies that weren’t reflected in the contract price generally shouldn’t count toward progress. In practice, rework and wasted costs need their own cost codes to be visible at all.

5. Costs coded to the wrong job

The simplest one. An invoice for Job A gets coded to Job B. Job B’s percent complete rises, Job A’s falls. Both are wrong, and the error survives until someone notices a cost line that doesn’t make sense.

Material not installedCosts not accruedStale cost to completeRework countedMiscoded cost▲▲▲▲▼▼% COMPLETEcost to date ÷ est. total cost
Five distortions. Red overstates progress, blue understates it, a miscode does both.

How to catch it

Cost-to-cost doesn’t need to be replaced. It needs a second opinion. The cross-checks that work:

Compare to physical progress. Ask the PM for their physical percent complete by major scope. Units installed, linear feet of pipe, floors topped out, rooms finished. When cost-to-cost and physical disagree by more than a few points, someone writes a sentence explaining why. On our sample job, Riverside Medical is about 67% complete by the field’s estimate (66.9% billed through Pay App #9) and 72.6% by cost-to-cost in the WIP from an earlier post. That gap is exactly the kind that deserves a sentence.

Compare to billing. Billing percent complete (billed to date ÷ revised contract) is a third view. If billing, physical and cost-to-cost all disagree, start asking questions.

Look at cost codes, not just totals. A job can look fine in total while one cost code is 30% over and another is 30% under because of a miscode. A job cost report by cost code shows it.

Watch the forecast’s age. Every cost-to-complete line should have a last-updated date and a name. A line that hasn’t moved in three months on an active scope is a stale forecast until proven otherwise.

Separate what doesn’t depict progress. Uninstalled materials, rework and known inefficiencies on their own cost codes or flags, so they can be excluded or explained.

Track the estimate at completion over time. A single month’s EAC tells you little. A chart of EAC by month tells you whether the job has been quietly fading.

Try thisFor your five largest active jobs, write down cost-to-cost percent complete, the PM’s physical percent complete and billing percent complete side by side. Any job where the three spread by more than five points gets a conversation this week.

Why it’s hard to catch today

Each cross-check needs data from a different place. Cost-to-cost comes from accounting. Physical progress lives in the field: daily logs, quantities, the super’s judgment. Billing comes from the pay app. The forecast lives in a spreadsheet with no history. Comparing them takes someone assembling four sources by hand, which is why it tends to happen at year-end with the auditors instead of every month.

What we’re building

In os.construction, cost, commitments, field records, billing and the forecast share one job record. The budget already rolls up by cost code with forecasts, modifications and snapshots you can compare. A job cost report with cost-to-cost next to billing progress, and the Risk agent that flags gaps for a person to review, are planned.

The budget is live. The accounting job-cost forecast implementation uses posted job-cost entries subject to coverage checks; the Risk agent is planned. See the project and accounting boundary. The EAC calculator is available now if you want to run the numbers on a job today. If your percent complete is a number nobody questions, join the founding program.

Share this article

Written by

Charley Forey

Founder of os.construction. We're building the operating system for construction. Project Financials follows job money, and company Accounting covers the books and controls. AI agents remain planned. We write about how money and data actually move on a job, and we build in public.

Apply to the founding program →Start a free trial →
Open file