What it is
Backlog is signed contract value that has not yet been earned. It includes jobs in progress and jobs signed but not started.
Some contractors also report months of backlog: backlog divided by a recent monthly pace of earned revenue.
Why operators track it
- Visibility. It shows how much revenue is already secured for the coming months.
- Capacity. Too little backlog can mean idle crews. Too much can strain people and cash.
- Bonding and credit. Sureties and lenders often ask for backlog alongside the WIP schedule.
- Sales planning. It shows how much new work needs to be won, and when.
How it is calculated
Backlog = revised contract value − earned revenue to date
- Summed across open jobs and signed jobs that have not started.
- Earned revenue usually comes from the WIP schedule (cost-to-cost percent complete × revised contract value).
- Months of backlog = backlog ÷ average monthly earned revenue over a recent period.
Worked example
Three jobs are in progress and one is signed but not started. Together they have $2,593,964 of work remaining. At an example pace of $420,000 earned per month, that is about 6.2 months of work.
How to read it
- Watch the trend. Backlog that falls for several months means work is being finished faster than it is being won.
- Look at the mix. Backlog concentrated in one large job or one customer is riskier than the same total spread out.
- Pair it with margin. A large backlog at thin projected margins is weaker than it looks.
- Months of backlog depends on the pace you pick. State the period used.
- Healthy levels vary by company size and market, so we do not publish a benchmark.
Definitional choices and common pitfalls
- Signed only, or also awarded. Decide whether jobs awarded but not yet under contract count. If they do, show them separately.
- Approved change orders. Include approved changes in contract value. Label pending ones if included.
- Revenue or margin. Some companies also track gross profit in backlog. Say which one a report shows.
- Same earned revenue as WIP. Use the WIP schedule's earned revenue so the two reports agree.
- Pace period. Months of backlog using the last 3 months can differ a lot from using the last 12.
How different roles use it
| Role | How they use it |
|---|---|
| Owner / CEO | Watches total backlog and months of backlog to plan hiring and bidding. |
| CFO / controller | Reports backlog to sureties and lenders and ties it to the WIP schedule. |
| Project manager | Sees remaining work on their jobs and plans crews. |
| Business development | Uses the trend to see how much new work is needed. |
Questions it answers
- How much signed work is left?
- How many months will it keep current crews busy?
- Which PMs and divisions carry the most backlog?
- Is backlog growing or shrinking?
How to present it in a report
- A headline number for total backlog, with months of backlog next to it.
- A bar per job or per division showing earned to date and remaining.
- A monthly trend line of total backlog.
- Show signed-not-started jobs as their own group.
Data you need
Fields
| Field | What it means | Example value |
|---|---|---|
| Job | The project, with its PM and division | Job 2440, PM: J. Moore |
| Job status | Signed not started, in progress, or complete | Signed, not started |
| Original contract value | Contract amount at award | $1,200,000 |
| Approved change order revenue | Contract value added by approved changes | $0 |
| Cost to date | All posted job cost | $0 |
| Estimated cost to complete | The PM's forecast of remaining cost | $1,020,000 |
| Contract signed date | When the job went under contract | Oct 6 |
What the raw data looks like
Example data A few rows as they might come out of the source system.
| Job | Status | Contract | Approved CO revenue | Cost to date | Cost to complete | Signed |
|---|---|---|---|---|---|---|
| 2417 | In progress | $1,400,000 | $100,000 | $910,000 | $420,000 | Mar 2 |
| 2420 | In progress | $860,000 | $0 | $240,000 | $470,000 | Jul 14 |
| 2431 | In progress | $2,150,000 | $35,000 | $1,620,000 | $310,000 | Jan 9 |
| 2440 | Signed, not started | $1,200,000 | $0 | $0 | $1,020,000 | Oct 6 |
Where this data usually lives
- Construction ERP and accounting holds budgets, job cost, change orders, billing, and retainage. For example: Sage 300 Construction and Real Estate, Viewpoint Vista (Trimble).
- Project management often holds change orders and their status, and sometimes budgets and forecasts. For example: Procore.
- Estimating produces the original budget by cost code before the job starts.
- Payroll and time tracking feed labor cost and hours to job cost.
- Spreadsheets often hold the PM's cost-to-complete forecast or the WIP schedule itself.
The same field can live in more than one system. Agree with the customer which one is the source of truth.
Common data gaps and traps
- Signed jobs not yet set up. A job may be signed but not created in the ERP until it starts. Ask where new contracts are tracked first.
- Closed jobs still open. Finished jobs left open add small leftover amounts to backlog.
- Awarded vs signed. A CRM or preconstruction tool may mark jobs as won before the contract is signed.
- Different earned revenue than WIP. If backlog is calculated separately, it can disagree with the WIP schedule.
Related metrics
- Gross margin by job: the margin inside the backlog.
- WIP over/under billing: the source of earned revenue.
- Job cost variance: the EAC that drives percent complete.
FAQ
- Does backlog include jobs not yet started?
- Yes, once they are signed. Show awarded but unsigned work separately if you include it.
- What is months of backlog?
- Backlog divided by recent average monthly earned revenue. It is a rough measure of how long current work will last.
- Why does backlog not match the sales pipeline?
- The pipeline includes work not yet won. Backlog is signed work only.
For your data teamFormula variants, tables, SQL sketch, and dashboard spec
Formula details
revised_contract_value = original_contract + approved_co_revenue
percent_complete = cost_to_date / (cost_to_date + estimated_cost_to_complete)
earned_revenue = percent_complete * revised_contract_value
backlog = revised_contract_value - earned_revenue
months_of_backlog = SUM(backlog) / AVG(monthly_earned_revenue over :pace_months)
Include jobs with status in ('signed_not_started', 'in_progress').
Worked example detail
| Job | Revised contract | % complete | Earned | Backlog |
|---|---|---|---|---|
| 2417 | $1,500,000 | 68.4% | $1,026,316 | $473,684 |
| 2420 | $860,000 | 33.8% | $290,704 | $569,296 |
| 2431 | $2,185,000 | 83.9% | $1,834,041 | $350,959 |
| 2440 | $1,200,000 | 0.0% | $0 | $1,200,000 |
| Total | $2,593,939 |
Months of backlog at an example pace of $420,000 a month: 2,593,939 / 420,000 = 6.2.
Tables and fields
| Table | Fields | Notes |
|---|---|---|
jobs |
job_id, pm_id, division, status, original_contract, signed_at | Include signed, not started |
change_orders |
job_id, revenue_amount, status, approved_at | |
job_costs |
job_id, amount, posted_at | |
cost_forecasts |
job_id, period, estimated_cost_to_complete |
SQL sketch
WITH wip AS ( -- reuse the WIP schedule query for earned revenue
SELECT job_id, pm_id, division, revised_contract_value, earned_revenue FROM wip_schedule
WHERE period = :period
)
SELECT pm_id, division,
SUM(revised_contract_value - COALESCE(earned_revenue, 0)) AS backlog
FROM wip
JOIN jobs USING (job_id)
WHERE jobs.status IN ('signed_not_started', 'in_progress')
GROUP BY ROLLUP (pm_id, division);
As a dashboard card
- Card type: KPI for total backlog and months of backlog, a stacked bar per job (earned vs remaining), and a monthly trend line.
- Measures:
backlog,months_of_backlog,earned_revenue. - Dimensions: job, PM, division, status, period.
Common mistakes
- Leaving out signed jobs that have not started.
- Calculating earned revenue differently from the WIP schedule.
- Not saying which pace period months of backlog uses.