CON-320 · Lesson 5 of 12 · 28 min
The WIP schedule and over and underbillings
The schedule of contracts in progress, almost always called the WIP schedule (work in progress), is the single most important report in a contracting firm. It lists every open job with its contract value, estimated total cost, cost to date, revenue earned, billings and the resulting over or underbilling. It is where the percentage-of-completion calculations of Lesson 4 are actually done, where the balance sheet's contract assets and liabilities come from, and where a surety or banker looks first to judge whether the contractor's profits are real. A contractor that produces an accurate WIP schedule every month, and reads it critically, will see most problems before they become crises.
Building the WIP schedule
For each open job, the WIP schedule starts with three numbers from the project and accounting records: the current contract value (including approved changes), the estimated total cost at completion (from the project manager's forecast) and the cost incurred to date (from the job cost ledger). It adds the amount billed to date from the billing records. Everything else is calculated.
| Column | Calculation | Source |
|---|---|---|
| A. Contract value | Original contract plus approved changes and constrained variable consideration | Contract and change order log |
| B. Estimated total cost | Cost to date plus estimated cost to complete | Project manager's forecast |
| C. Estimated gross profit | A − B | Calculated |
| D. Cost to date | Recorded and accrued costs | Job cost ledger |
| E. Percent complete | D ÷ B | Calculated |
| F. Revenue earned to date | E × A | Calculated |
| G. Gross profit to date | F − D | Calculated |
| H. Billed to date | Total progress billings including holdback | Billing records |
| I. Underbilling (contract asset) | F − H, if positive | Calculated |
| J. Overbilling (contract liability) | H − F, if positive | Calculated |
| K. Cost to complete | B − D | Calculated |
| L. Revenue to be earned (backlog) | A − F | Calculated |
Billings include the amounts held back, because holdback is part of what the contractor has billed and is entitled to; it is simply collected later. The holdback receivable is a separate balance sheet item, but it does not change the over or underbilling calculation.
jobs = [ # job, contract, est. total cost, cost to date, billed to date
("J-2407 Ashdale library", 14_600_000, 13_250_000, 9_940_000, 12_152_755),
("J-2411 Northgate clinic", 3_850_000, 3_520_000, 2_710_000, 2_849_062),
("J-2415 Riverside co-op", 21_400_000, 19_800_000, 7_120_000, 7_215_354),
("J-2421 Brookmere retail", 6_900_000, 6_780_000, 5_650_000, 5_400_000),
("J-2502 Fire hall", 9_200_000, 8_330_000, 1_240_000, 1_959_508),
("J-2506 School addition", 7_750_000, 7_900_000, 2_860_000, 2_600_696),
("J-2509 Parkade repair", 4_300_000, 3_850_000, 620_000, 1_152_467),
]
under = over = 0
print(f"{'Job':24}{'%':>7}{'Revenue':>12}{'GP to date':>12}{'Billed':>12}{'Under':>10}{'Over':>11}")
for name, c, etc, ctd, billed in jobs:
pct = ctd / etc
rev = pct * c
gp = rev - ctd
diff = rev - billed
u, o = max(diff, 0), max(-diff, 0)
under += u; over += o
print(f"{name:24}{pct:7.1%}{rev:12,.0f}{gp:12,.0f}{billed:12,.0f}{u:10,.0f}{o:11,.0f}")
print(f"{'Totals':24}{'':7}{'':12}{'':12}{'':12}{under:10,.0f}{over:11,.0f}")Job % Revenue GP to date Billed Under Over J-2407 Ashdale library 75.0% 10,952,755 1,012,755 12,152,755 0 1,200,000 J-2411 Northgate clinic 77.0% 2,964,062 254,062 2,849,062 115,000 0 J-2415 Riverside co-op 36.0% 7,695,354 575,354 7,215,354 480,000 0 J-2421 Brookmere retail 83.3% 5,750,000 100,000 5,400,000 350,000 0 J-2502 Fire hall 14.9% 1,369,508 129,508 1,959,508 0 590,000 J-2506 School addition 36.2% 2,805,696 -54,304 2,600,696 205,000 0 J-2509 Parkade repair 16.1% 692,468 72,468 1,152,467 0 459,999 Totals 1,150,000 2,250,000
The totals of the underbilling and overbilling columns are the contract assets of $1,150,000 and contract liabilities of $2,250,000 on Kestrel's balance sheet in Lesson 3. Each job is assessed separately, and its net position appears in one column or the other; the standards do not allow an underbilling on one job to be netted against an overbilling on another.
Loss jobs on the WIP schedule
One of Kestrel's jobs, J-2506, the school addition, now has an estimated total cost of $7,900,000 against a contract value of $7,750,000. Percentage of completion shows a loss to date of about $54,000, but Lesson 4 requires the whole expected loss of $150,000 to be recognized now. The extra provision of about $96,000 is usually shown on a separate line or added to contract liabilities, and the job is flagged on the schedule. From this month forward the school addition will show no gross profit; any further cost increase becomes an additional loss when identified.
Worked problem
The school addition loss provision
J-2506 has contract value $7,750,000, estimated total cost $7,900,000 and cost to date $2,860,000. What loss provision is needed beyond the loss already recognized through percentage of completion?
Show solution
- Percent complete = 2,860,000 ÷ 7,900,000 = 36.2 %.
- Revenue to date = 0.362 × 7,750,000 = $2,805,696; loss to date = 2,805,696 − 2,860,000 = −$54,304.
- Total expected loss = 7,900,000 − 7,750,000 = $150,000.
- Additional provision = 150,000 − 54,304 = $95,696.
Answer: A provision of about $95,700 is added so that the full $150,000 loss is in this period's results.
What underbillings and overbillings mean
Underbillings and overbillings are not good or bad in themselves. They are signals that need to be explained, job by job.
| Position | Possible innocent explanation | Possible warning sign |
|---|---|---|
| Underbilled | Billing cut-off falls before month-end; a large material delivery was recorded at cost; an approved change has not yet been invoiced | The estimated total cost is too low, so percent complete and revenue are overstated; work is being done on unapproved changes; billing is sloppy |
| Overbilled | The payment schedule is front-loaded by agreement; mobilization or deposits were billed early; materials were billed on delivery | The estimated total cost is too high (hiding profit); the job is being front-loaded to fund other jobs; the overbilling cash has been spent elsewhere |
Sureties are particularly wary of underbillings. An underbilling is revenue the contractor has recognized but has not been able to bill. If the reason is that the estimated total cost is understated, the job is further along in cost than in value, and the revenue may never be billed or collected. A pattern of large underbillings on troubled jobs is one of the classic signs of a contractor that is about to report a large loss. Many sureties discount underbillings heavily, or deduct them entirely, when they assess working capital (Lesson 11).
Overbillings deserve scrutiny too. A modest overbilling position is normal and healthy for a general contractor, because owners pay for mobilization and early items and the contractor pays subcontractors after it is paid. But overbillings are cash collected for work not yet done. If the contractor has used that cash to pay overhead, buy equipment or cover losses on other jobs, it will have to find money from somewhere when the remaining work comes due. Comparing total overbillings with cash on hand is a quick test: Kestrel's overbillings of $2.25 million are covered by its $2.85 million of cash, but only just.
Fade and gain: reading the WIP schedule over time
A single WIP schedule is a snapshot. Its real power comes from comparing schedules over time. Profit fade is the decrease in a job's estimated gross profit from one period to the next; profit gain is the increase. A fade/gain analysis lines up each job's estimated gross profit at bid, at the previous WIP date and now, and explains every significant change.
| Job | GP at bid | GP at 30 Sep | GP at 31 Dec | Change this quarter | Explanation |
|---|---|---|---|---|---|
| J-2407 Ashdale library | 1,240,000 | 1,310,000 | 1,350,000 | +40,000 | Buyout savings on finishes |
| J-2411 Northgate clinic | 360,000 | 345,000 | 330,000 | −15,000 | Extended general conditions |
| J-2415 Riverside co-op | 1,780,000 | 1,700,000 | 1,600,000 | −100,000 | Formwork productivity below estimate |
| J-2421 Brookmere retail | 520,000 | 310,000 | 120,000 | −190,000 | Unrecovered changes; storefront subcontractor default |
| J-2502 Fire hall | 870,000 | 870,000 | 870,000 | 0 | Early stage |
| J-2506 School addition | 410,000 | 120,000 | (150,000) | −270,000 | Ground conditions; owner disputes extra |
| J-2509 Parkade repair | 450,000 | 450,000 | 450,000 | 0 | Early stage |
| Total | 5,630,000 | 5,105,000 | 4,570,000 | −535,000 |
Three jobs account for nearly all the fade this quarter, and two of them, Brookmere and the school addition, have faded every quarter. A pattern like that tells management where to look and tells a surety that the firm's estimates of profit on uncompleted work may still be optimistic. Most contractors see some fade; consistent fade across many jobs suggests a systematic problem with estimating, buyout or project control.
bid = [1_240_000, 360_000, 1_780_000, 520_000, 870_000, 410_000, 450_000]
prev = [1_310_000, 345_000, 1_700_000, 310_000, 870_000, 120_000, 450_000]
now = [1_350_000, 330_000, 1_600_000, 120_000, 870_000, -150_000, 450_000]
q_change = sum(n - p for n, p in zip(now, prev))
since_bid = sum(n - b for n, b in zip(now, bid))
print(f"Fade this quarter: {q_change:,}")
print(f"Fade since bid: {since_bid:,} ({since_bid / sum(bid):.1%} of bid gross profit)")
fading = [i for i, (n, p) in enumerate(zip(now, prev)) if n < p]
print(f"Jobs fading this quarter: {len(fading)} of {len(now)}")Fade this quarter: -535,000 Fade since bid: -1,060,000 (-18.8% of bid gross profit) Jobs fading this quarter: 4 of 7
The schedule of completed contracts
When a job finishes, it moves from the WIP schedule to the schedule of completed contracts, which shows final revenue, final cost and final gross profit, alongside the gross profit expected at bid and at the start of the year. Comparing the final result with the earlier estimates measures the reliability of the firm's estimates. If jobs consistently finish below what the WIP schedule showed while they were open, readers will discount the current WIP schedule. A firm that consistently finishes at or above its estimates earns credibility, and that credibility translates into bonding capacity and better credit terms.
| Completed in 2025 | Final revenue | Final cost | Final GP | GP expected at bid | GP expected at last year-end |
|---|---|---|---|---|---|
| Harbourview offices | 11,820,000 | 10,880,000 | 940,000 | 1,010,000 | 980,000 |
| Elm Street townhomes | 8,440,000 | 7,960,000 | 480,000 | 690,000 | 590,000 |
| County works yard | 5,260,000 | 4,780,000 | 480,000 | 450,000 | 460,000 |
| Total | 25,520,000 | 23,620,000 | 1,900,000 | 2,150,000 | 2,030,000 |
Reviewing a WIP schedule
Experienced controllers, sureties and bankers review a WIP schedule with a standard set of questions. Project managers should be ready to answer them.
| Question | Why it matters |
|---|---|
| Has the estimated total cost been updated by the project manager this month, or simply carried forward? | Stale estimates are the main source of misstated revenue |
| Do any jobs show a higher gross margin to date than at bid? | Possible understated cost to complete, or unrecognized buyout savings that should be explained |
| Which jobs are underbilled, and why? | Underbillings on troubled jobs often precede losses |
| Do overbillings exceed cash on hand? | Overbilling cash may have been spent elsewhere |
| Are any jobs near completion with large remaining cost to complete? | Inconsistent: cost to complete should shrink as the job finishes |
| Are unapproved changes or claims included in contract value? | They should be constrained (Lesson 4) |
| Is any one job a large share of backlog or gross profit? | Concentration risk |
| How did last year's jobs finish compared with their WIP estimates? | Reliability of estimates |
Worked problem
Spotting an inconsistent estimate
A project manager reports a job as 95 % complete by cost, with cost to date of $5,700,000 and estimated total cost of $6,000,000. The superintendent says punch list and two floors of finishes remain, about four weeks of work for a crew of twelve plus subcontractors. Is the estimate plausible?
Show solution
- Remaining cost to complete in the estimate = 6,000,000 − 5,700,000 = $300,000.
- Four weeks of a twelve-person crew at about $3,600 per person-week (illustrative loaded rate) = 12 × 4 × 3,600 = $172,800 for self-performed labour alone.
- Subcontract finishes, general conditions for a month and materials would add substantially more.
Answer: The $300,000 cost to complete looks too low. If the true remaining cost is, say, $500,000, the job is about 92 % complete, revenue to date is overstated and the margin will fade. The estimate should be rebuilt from the remaining work, as CON-310 recommends.
Billing strategy and the WIP schedule
Because the WIP schedule exposes the billing position, it encourages good billing discipline. A contractor should bill promptly and fully for work done, including approved changes, and should avoid both chronic underbilling, which starves cash, and aggressive front-loading, which owners resist and which leaves the contractor short of contract value to finish the work. Many contractors set a policy target, such as keeping each job modestly overbilled while staying within what the payment certifier will accept as fair value for work done. CON-310 Lesson 11 covered the mechanics of the schedule of values and progress claims; the WIP schedule is where the company sees the result.
Common mistakes
MistakeCarrying forward last month's estimated total cost without review.
InsteadHave the project manager rebuild cost to complete each month from the remaining work.
MistakeNetting underbillings and overbillings across jobs.
InsteadAssess each job separately; total underbillings are a contract asset and total overbillings a contract liability.
MistakeTreating a large underbilling as harmless unbilled revenue.
InsteadFind out why; on a troubled job it often means estimated total cost is too low.
MistakeSpending overbilling cash on overhead or other jobs.
InsteadOverbillings are cash for work still to be done; compare them with cash on hand.
MistakeRecognizing only the loss to date on a loss job.
InsteadProvide for the full expected loss when it is foreseen.
MistakeReviewing the WIP schedule as a single snapshot.
InsteadTrack fade and gain over time and compare completed jobs with their earlier estimates.
Summary and key terms
- The WIP schedule calculates percent complete, revenue earned, gross profit to date and over or underbilling for each open job.
- Total underbillings are contract assets; total overbillings are contract liabilities; jobs are not netted against each other.
- Loss jobs need a provision for the whole expected loss in addition to the loss recognized through percentage of completion.
- Underbillings can signal understated cost estimates; overbillings are cash for future work that must not be spent elsewhere.
- Fade/gain analysis compares each job's estimated gross profit over time and explains the changes.
- The schedule of completed contracts tests how reliable the firm's in-progress estimates have been.
- A good WIP review asks whether estimates are current, consistent with remaining work and free of unconstrained claims.
- WIP schedule
- The schedule of contracts in progress showing revenue, cost, gross profit and billing position for each open job.
- Underbilling
- Revenue earned in excess of amounts billed; a contract asset.
- Overbilling
- Amounts billed in excess of revenue earned; a contract liability.
- Estimated total cost
- Cost to date plus estimated cost to complete.
- Cost to complete
- The estimated remaining cost to finish a job.
- Profit fade
- A decrease in a job's estimated gross profit over time.
- Profit gain
- An increase in a job's estimated gross profit over time.
- Fade/gain analysis
- A comparison of estimated gross profit across WIP dates with explanations.
- Front-loading
- Billing early work at inflated values to accelerate cash collection.
- Revenue to be earned
- Contract value less revenue earned to date; backlog for an open job.
Practice problems
Work each problem on paper first, then reveal the answer to check.
A job has contract value $5,000,000, estimated total cost $4,600,000, cost to date $2,300,000 and billings $2,700,000. What is its billing position?
Show answer
50 % complete; revenue $2,500,000; overbilled by $200,000.
For the same job, what is gross profit to date?
Show answer
$200,000.
Why are billings measured including holdback?
Show answer
Holdback is part of what the contractor has billed and is entitled to, though collected later.
Name an innocent and a warning explanation for an underbilling.
Show answer
Innocent: an approved change not yet invoiced. Cause for concern: estimated total cost too low.
Kestrel has overbillings of $2.25 million and cash of $2.85 million. What does the comparison suggest?
Show answer
Overbillings are covered by cash, but with little margin.
A job's estimated GP was $400,000 last quarter and is $250,000 now. What is the fade?
Show answer
$150,000.
What does consistent fade across many jobs suggest?
Show answer
A systematic problem with estimating, buyout or project control.
A job priced at $3,000,000 now has estimated total cost $3,120,000 and is 40 % complete. What extra provision is needed beyond the loss to date?
Show answer
Loss to date = 0.40 × 3,000,000 − 0.40 × 3,120,000 = −$48,000; total loss $120,000; provision $72,000.
Why is a job at 95 % complete with a large remaining scope suspicious?
Show answer
Cost to complete should shrink as the job finishes; large remaining work implies the estimate is understated.
What does the schedule of completed contracts measure?
Show answer
The reliability of in-progress profit estimates.
Lesson quiz · 5 questions
Score 60% or more to complete this lesson.
Create a free account to save your progress, take quizzes and earn a certificate.