A plain-English walkthrough of the construction work-in-progress schedule: the cost-to-cost method, over and under billing, the columns it contains, and a full worked example you can follow line by line.
Quick answer: a WIP schedule lists every open job with its percent complete, earned revenue, and over/under billing. Percent complete = cost to date ÷ estimated total cost; earned revenue = percent complete × contract value; over/under billing = billed to date − earned revenue. Build it monthly — your surety, bank, and CPA all read it, and it is your earliest warning that a job is drifting.
A work-in-progress (WIP) schedule is a report that shows, for every open job, how far along the work is, how much revenue you have actually earned, and how that earned revenue compares to what you have billed. On long-duration construction contracts, revenue is recognized as you perform the work, not when you send an invoice. The WIP schedule is the tool that translates "we're about halfway done" into a dollar figure your financial statements can stand on.
It matters because almost everyone who evaluates a contractor reads it. Your bonding company and surety use the WIP to judge how well you estimate and control jobs before they extend a bond line. Your bank leans on it to understand the real earnings behind your balance sheet. Your CPA needs it to book percentage-of-completion revenue correctly at year end. And internally, it is the earliest warning system you have: a WIP schedule updated every month catches a job that is bleeding cost (or one you have overbilled and are quietly borrowing against) while there is still time to react.
Skip it, or build it once a year in a hurry, and you are flying blind on the two questions that sink contractors: are my jobs actually making the margin I bid, and am I billing ahead of the work I've done?
Almost every construction WIP schedule is built on one simple idea: you are as far along as the share of your costs you have already spent.
The cost-to-cost method measures percent complete by comparing costs incurred to date against the total costs you expect the job to require:
That last line is the one everyone cares about. When you have billed more than you have earned, the difference is called billings in excess of costs and estimated earnings. It is a liability on your balance sheet, because it represents work you have collected for but not yet performed. When you have billed less than you have earned, the difference is costs and estimated earnings in excess of billings, an asset, because you have done work you have not yet invoiced.
A healthy contractor tends to bill slightly ahead of cost to stay cash-positive, but large or growing overbillings are a red flag: they can mask a job that is losing money, and they represent cash you may have to give back in production later. Underbillings are money left on the table and a sign your billing is lagging your field.
Numbers make this concrete. Follow one $500,000 roofing contract through the math.
Say you hold a commercial re-roof contract worth $500,000. Your estimate says the job will cost $350,000 in labor, material, equipment, and subcontract to complete. As of month-end, your job-cost report shows you have spent $175,000 so far.
Now bring in billings. Suppose your pay applications to date total $300,000. Compare that to the $250,000 you have earned:
You are carrying a $50,000 billing in excess, a liability. That is not automatically bad; you are ahead on cash. But it means the next $50,000 of work is, in a sense, already spoken for, and if your cost estimate is too optimistic, that cushion can evaporate. Flip the billings to $220,000 instead and the sign reverses: $220,000 − $250,000 = −$30,000 underbilled, an asset. You have performed $30,000 of work you have not yet invoiced, and you should get a pay application out.
With stored materials. Same job, but $40,000 of membrane was delivered and billed as stored materials and is still on pallets. Cost to date and estimated total cost both drop by $40,000 before the division, so percent complete is computed on installed work only. Earned revenue then adds the $40,000 back at cost. The margin on that membrane is recognized when it goes on the roof, not when it comes off the truck.
A standard WIP schedule is one row per open job and a set of columns that walk left to right from contract value to over/under billing. The typical layout:
Controllers frequently add a few more: costs remaining (estimated total cost − cost to date), gross profit earned to date, and a comparison of this month's estimated margin to last month's, which surfaces jobs whose margin is quietly slipping.
The mechanics, in the order you actually do them each month.
Start with each open job's original contract. Add every approved change order to get the revised contract value. Only signed, approved changes belong here. Pending or verbal changes are not contract yet, and including them overstates both revenue and margin.
For each job, refresh the forecast of what it will cost to finish. This is your best estimate today, not the original bid frozen in time, reflecting cost overruns, buyout savings, and any change-order scope. A stale estimate is the single biggest source of a wrong WIP.
From job costing, total the labor, material, equipment, and subcontract cost booked to each job through the cut-off date. Accrued costs matter here: material you have received but not yet been billed for, or a sub's completed work not yet invoiced, is cost incurred and belongs in the numerator. Leave it out and percent complete comes in low. Do not add open POs or unperformed subcontract scope: those are commitments, not incurred cost, and they overstate percent complete.
Divide cost to date by total estimated cost for each job. This is the engine of the whole schedule: every revenue and billing comparison flows from it.
Material delivered to the job and billed on a pay app as stored materials, but not yet installed, is not progress. Before computing percent complete, pull its cost out of both cost to date and estimated total cost, compute percent complete on what remains, then add that material back to earned revenue at cost, zero margin. It earns its margin when crews install it. Skip this and a big delivery makes the job look further along than it is.
Multiply each job's percent complete by its revised contract value. That is the revenue you have earned to date under percentage-of-completion, regardless of what you have billed.
Pull billed-to-date from your pay applications and subtract earned revenue. Positive is overbilled (a liability); negative is underbilled (an asset). Scan the column: large or growing overbillings and any underbilling that should have been invoiced are your action items for the month.
Most bad WIP schedules fail for the same handful of reasons.
Running percent complete against last quarter's cost estimate makes a job that is over budget look on track. Re-forecast estimated total cost every period, not just when it hurts.
Material received but not yet vouchered, or a sub's completed work not yet billed, is real cost incurred. Leave it out and your percent complete (and earned revenue) come in low.
A delivery billed as stored materials inflates cost to date without any work in place. Carve it out of the percent-complete math and recognize it at zero margin until installed, per ASC 606-10-55-189 through 55-191. Auditors look for this by name.
Approved change orders belong in the revised contract and, if they add cost, in the estimate. Tracking billings against the original contract while the scope has grown corrupts every downstream number.
Cost to date must be actual, source-document cost, never a prorated or estimated figure. Blending the two is how a WIP quietly stops tying to the general ledger.
A WIP built four times a year catches problems a quarter late. Monthly is the standard; the whole value is early warning, and early means monthly.
If cost to date exceeds your estimate, percent complete tops 100%: a sign the estimate is wrong, not that the job is 110% done. Cap it, and treat it as a signal to re-forecast the cost immediately.
Every step above is arithmetic, and every step is also a place a manual spreadsheet drifts. A pasted cost number that never got refreshed, a change order that made it into the contract column but not the estimate, a billed-to-date figure keyed by hand from a stack of pay apps. Any one of them quietly throws the whole schedule off, and you usually find out when the surety asks.
The fix is to build the WIP from the same data that runs the job. When your job costing is source-document accurate and your billings live in the same system, the WIP schedule computes itself: revised contract from approved change orders, cost to date from the ledger, billed to date from your pay applications, over/under billing falling out automatically, and a month-end snapshot you can hand to the bank. That is exactly what WIP schedule software is for.
Not accounting advice. This describes common practice. How these rules apply to your contracts, your revenue recognition policy, and your financial statements is a determination for your CPA.
See how SitewideOps computes over/under billing straight from your job costs and pay applications, with a month-end snapshot your surety can read.
Anyone interested gets a free 21-day demo account: the full product, every feature, no credit card.