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.

Columns of a typical WIP schedule.
ColumnCalculationSource
A. Contract valueOriginal contract plus approved changes and constrained variable considerationContract and change order log
B. Estimated total costCost to date plus estimated cost to completeProject manager's forecast
C. Estimated gross profitA − BCalculated
D. Cost to dateRecorded and accrued costsJob cost ledger
E. Percent completeD ÷ BCalculated
F. Revenue earned to dateE × ACalculated
G. Gross profit to dateF − DCalculated
H. Billed to dateTotal progress billings including holdbackBilling records
I. Underbilling (contract asset)F − H, if positiveCalculated
J. Overbilling (contract liability)H − F, if positiveCalculated
K. Cost to completeB − DCalculated
L. Revenue to be earned (backlog)A − FCalculated

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}")
Output
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
  1. Percent complete = 2,860,000 ÷ 7,900,000 = 36.2 %.
  2. Revenue to date = 0.362 × 7,750,000 = $2,805,696; loss to date = 2,805,696 − 2,860,000 = −$54,304.
  3. Total expected loss = 7,900,000 − 7,750,000 = $150,000.
  4. 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.

Interpreting underbillings and overbillings.
PositionPossible innocent explanationPossible warning sign
UnderbilledBilling cut-off falls before month-end; a large material delivery was recorded at cost; an approved change has not yet been invoicedThe estimated total cost is too low, so percent complete and revenue are overstated; work is being done on unapproved changes; billing is sloppy
OverbilledThe payment schedule is front-loaded by agreement; mobilization or deposits were billed early; materials were billed on deliveryThe 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.

Line chart over the life of a job showing cumulative revenue earned and cumulative billings. Billings run above revenue early in the job (shaded as overbilled), cross over at mid-job, and then fall below revenue near the end (shaded as underbilled) before both reach the contract value.
Billings and earned revenue over a job's life. The shaded gap between the lines is the over or underbilling at any date.

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.

Fade/gain analysis for Kestrel's open jobs (illustrative).
JobGP at bidGP at 30 SepGP at 31 DecChange this quarterExplanation
J-2407 Ashdale library1,240,0001,310,0001,350,000+40,000Buyout savings on finishes
J-2411 Northgate clinic360,000345,000330,000−15,000Extended general conditions
J-2415 Riverside co-op1,780,0001,700,0001,600,000−100,000Formwork productivity below estimate
J-2421 Brookmere retail520,000310,000120,000−190,000Unrecovered changes; storefront subcontractor default
J-2502 Fire hall870,000870,000870,0000Early stage
J-2506 School addition410,000120,000(150,000)−270,000Ground conditions; owner disputes extra
J-2509 Parkade repair450,000450,000450,0000Early stage
Total5,630,0005,105,0004,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)}")
Output
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.

Schedule of completed contracts (illustrative). Final results came in about 6 % below the estimates at the previous year-end.
Completed in 2025Final revenueFinal costFinal GPGP expected at bidGP expected at last year-end
Harbourview offices11,820,00010,880,000940,0001,010,000980,000
Elm Street townhomes8,440,0007,960,000480,000690,000590,000
County works yard5,260,0004,780,000480,000450,000460,000
Total25,520,00023,620,0001,900,0002,150,0002,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.

Questions to ask when reviewing a WIP schedule.
QuestionWhy 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
  1. Remaining cost to complete in the estimate = 6,000,000 − 5,700,000 = $300,000.
  2. 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.
  3. 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.

  1. 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.

  2. For the same job, what is gross profit to date?

    Show answer

    $200,000.

  3. Why are billings measured including holdback?

    Show answer

    Holdback is part of what the contractor has billed and is entitled to, though collected later.

  4. 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.

  5. 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.

  6. A job's estimated GP was $400,000 last quarter and is $250,000 now. What is the fade?

    Show answer

    $150,000.

  7. What does consistent fade across many jobs suggest?

    Show answer

    A systematic problem with estimating, buyout or project control.

  8. 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.

  9. 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.

  10. 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.

Take the quiz