All posts

How to Build a WIP Report for Contractors (With Example)

10 min read

The short answer: A work in progress (WIP) report lists every open job and compares what you have earned to what you have billed. For each job you need the contract value, total estimated cost, cost incurred to date, and amount billed to date. Percent complete is cost to date divided by estimated total cost. Earned revenue is that percentage times the contract value. If earned revenue is higher than billed, you are underbilled and financing the job out of your own pocket. If billed is higher, you are overbilled and holding cash you have not earned yet. CRMb supplies the cost-to-date side from punched crew hours and average-cost materials, so the report reflects what actually happened on site.

Most contractors run their business on a bank balance. The balance looks healthy right up until three jobs finish at once, the deposits stop arriving, and the cash disappears. A WIP report is the instrument that would have shown it coming weeks earlier.


What a WIP report actually tells you

A profit and loss statement tells you what happened last month. A WIP report tells you where you stand right now on work that is not finished, which for most contractors is where nearly all the money is.

It answers three questions at once:

  • Are my open jobs going to make money? Cost to date against estimated cost exposes an overrun while you can still respond.
  • Is my cash real, or borrowed from future work? Overbilled cash gets spent on payroll and then owed back in labor.
  • Am I funding my customers? Underbilling is an interest-free loan you did not agree to make.

Bankers, bonding agents, and sureties ask for a WIP schedule for exactly these reasons. Producing one on request is the difference between a credit line and a polite decline.


The four numbers every WIP row needs

You cannot fake these. Each open job contributes one row, and each row needs four inputs.

Contract value. The approved price, including signed change orders. Verbal extras do not count until they are approved in writing, see how to handle change orders on a job.

Estimated total cost. Your current best estimate of what the job will cost to complete, not the original bid. If the crew is already 30 hours over, the estimate updates. A stale estimate makes every downstream number wrong.

Cost incurred to date. Labor at a loaded rate, materials at what you paid, subs, equipment, and other direct costs, all booked to the job as of the report date. This is the number that takes contractors an afternoon to assemble by hand, see how to calculate labor cost per job.

Billed to date. Total invoiced on the job so far, including deposits and progress draws, whether or not the customer has paid yet.


The percent complete calculation

The standard approach is the cost-to-cost method, and it is arithmetic, not accounting theory.

Percent complete = cost to date ÷ estimated total cost

Earned revenue = percent complete × contract value

Over/underbilling = billed to date − earned revenue

A positive result is overbilled. A negative result is underbilled. That single column is the point of the entire report.

The method assumes cost accrues roughly in step with progress, which holds on labor-heavy work and breaks when a large material delivery lands early. A job that just took delivery of $40,000 of material will read as further along than it is. Some contractors exclude uninstalled material from the cost-to-date figure for exactly this reason.


A worked example

Three open jobs, one report date, one page.

JobContractEst. costCost to date% completeEarnedBilledOver/(under)
Riverside remodel$120,000$90,000$45,00050.0%$60,000$72,000$12,000
Maple St. reroof$48,000$36,000$27,00075.0%$36,000$24,000($12,000)
Hillcrest patio$15,000$13,500$10,80080.0%$12,000$15,000$3,000
Total$183,000$139,500$82,800$108,000$111,000$3,000

The totals look calm. Three thousand dollars overbilled across a $183,000 backlog is nothing. Read the rows and the picture changes completely.

Riverside is billed $12,000 ahead of the work. That cash is in the account today and will be consumed by labor over the next few weeks. It is not profit and it should not be treated as spendable.

Maple St. is the opposite. The crew has done $36,000 of work and the customer has been asked for $24,000. The company is financing $12,000 of someone else's roof. Nine times out of ten the cause is a draw schedule nobody invoiced against, see progress billing for contractors.

Hillcrest was bid at $10,500 of cost and now estimates $13,500. Margin has fallen from 30% to 10% and the job is 80% done, so there is very little left to recover it. The job was also billed in full up front, which is why nobody noticed.

The two $12,000 swings cancel in the total. That is the argument for reading a WIP report by row and never by summary.


Overbilling is not a win

Overbilling feels like good cash management, and in moderation it is. Front-loaded draws fund materials and payroll before the customer pays, which is the whole reason deposits exist, see how to collect a deposit before work.

The danger is what it does to your read on the business. Overbilled cash is a liability wearing a bank balance costume. Spend it on overhead and the remaining work still has to be performed, now with no funding attached. Contractors who grow fast and fail suddenly usually fail this way: every new job's deposit paid the last job's labor, and the day new work slowed, the whole structure stopped.

Underbilling is the quieter problem. It rarely means you are losing money, it means you are lending it. Chronic underbilling across a portfolio is almost always a billing process failure, not a customer problem. Jobs progress, nobody raises the draw, and the company carries the float.


How often to run it

Monthly is the standard. Quarterly is too slow to act on, weekly is more precision than the inputs justify.

Run it on the same day each month, on every open job over a threshold you set, and keep the prior months. The trend matters more than any single report:

  • Percent complete climbing while margin falls means the estimate is being revised upward and the job is slipping.
  • Underbilling growing month over month means your billing cadence is behind your production cadence.
  • A job whose estimated cost never changes is usually a job nobody is actually tracking.

Close each job out of the report when it is finished and follow it with a post-job profitability review, which turns the final variance into a better bid next time.


What makes the report wrong

The math is trivial. Every WIP report that misleads someone does it through bad inputs.

Reconstructed labor hours. Hours written down on Friday from memory, or split across jobs by guess, produce a cost-to-date figure that is fiction. Percent complete inherits the error and so does everything after it. Real clock-in and clock-out data tied to the job is the fix.

Last-price materials. Valuing stock pulled from a truck at the most recent invoice price instead of average cost swings job cost with every supplier price change, see average cost inventory for job materials.

Optimistic estimates at completion. The most common failure of all. A project manager who does not want to report an overrun leaves the estimated total cost where it was at bid. Percent complete then reads too high, earned revenue reads too high, and the job looks profitable until the day it closes.

Unapproved change orders in contract value. Work the customer has not signed for is not revenue. Keep it out until it is approved.


FAQ

Do small contractors need a WIP report? If you have more than two jobs running at once and any of them span more than a few weeks, yes. The size threshold that matters is duration, not revenue. Same-day jobs settle before a WIP report could tell you anything; a six-week job can hide an overrun for a month.

What is the difference between a WIP report and a job cost report? A job cost report shows what a job has cost. A WIP report adds the billing side and compares earned revenue to billed revenue across every open job at once. Job costing is an input to the WIP report.

Is percent complete based on cost or on physical progress? Cost-to-cost is the common method because cost data already exists and is objective. Physical progress, units installed or a supervisor's judgment, is more accurate when material timing distorts cost, and more prone to wishful thinking. Many contractors run cost-to-cost and sanity-check it against the field.

Should I include retainage in billed to date? Include the full billed amount and track retainage separately as a receivable. It is billed revenue you have earned and cannot collect yet, which is a cash timing question rather than an earnings question, see how retainage works in construction.

What if a job's estimated cost is now higher than the contract value? That job is a forecast loss and the loss is recognized immediately, not spread across the remaining months. Flag it, decide whether scope or a change order can recover any of it, and make sure the same mistake is not sitting in your open quotes.

Can I build a WIP report in a spreadsheet? Yes, and many contractors do. The spreadsheet is not the hard part. Getting an accurate cost-to-date figure for every open job on the same day each month is the hard part, and that is a data problem, not a formula problem.


Getting started with CRMb

A WIP report is only as good as the cost-to-date column, and that column is where the afternoon goes.

CRMb builds it as the work happens. Crew hours punched in Punch flow onto the job as labor cost on the same shared org and data, so cost to date reflects real clocked time rather than a reconstruction. Materials pulled from warehouse or truck stock land on the job at average cost. Quotes, change orders, and invoices live on the same job record, so billed-to-date is a fact and not a search through an email thread. Reports then show margin per job against real punched hours.

Start a 14-day free trial at crmb.io and open your three largest open jobs. Compare what each has earned to what each has been billed. One of the three is usually not where you thought it was.

More from the blog