What it is
When a contractor signs a subcontract or issues a purchase order, the cost is committed even though it has not been invoiced. Open commitments are the remaining unbilled value of those contracts.
Early in a job, comparing committed cost with budget shows how buyout is going: whether subs and suppliers came in at or under budget.
Why operators track it
- Buyout. Commitments below budget create savings early; above budget, a problem is already locked in.
- Forecast floor. Cost to complete should not be less than open commitments.
- Cash planning. Open commitments are future payments.
- Visibility. Cost to date lags; commitments show cost before invoices arrive.
How it is calculated
Committed cost = cost to date + open commitments
- Open commitments = subcontract and PO value (including approved change orders) − amounts invoiced against them.
- Uncommitted budget = revised budget − committed cost.
- Compare uncommitted budget with the forecast cost of scope not yet bought.
Worked example
Job 2420 has $240,000 of cost to date and $355,000 of open subcontracts and POs, so $595,000 is committed against a $718,000 budget. $123,000 of budget is uncommitted; the PM forecasts $115,000 to buy the rest.
How to read it
- Buyout early in the job is the key read. Compare each committed cost code with its budget.
- Commitments without cost codes cannot be compared. Make sure lines are coded.
- Cost to complete below open commitments is a red flag.
- We do not publish a benchmark.
Definitional choices and common pitfalls
- Include labor. Labor is not committed by contract. Many reports show commitments for subs and materials only.
- Pending change orders. Include approved sub change orders. Show pending separately.
- Retainage. Invoiced amounts include retainage held from subs.
- Closed commitments. A commitment closed short frees the remainder.
How different roles use it
| Role | How they use it |
|---|---|
| Project manager | Tracks buyout against budget by cost code. |
| CFO / controller | Checks cost to complete covers open commitments. |
| Owner / CEO | Sees buyout savings or losses early. |
| Operations / superintendent | Confirms subs and materials are ordered before they are needed. |
Questions it answers
- How much of the budget is under contract?
- Did buyout come in under budget?
- Is the forecast at least as large as open commitments?
- What payments are still ahead?
How to present it in a report
- One row per cost code: budget, committed, uncommitted, and forecast to buy.
- A buyout summary at job level.
- Flag codes where committed exceeds budget.
| Cost code | Budget | Cost to date | Open commitments | Committed | Uncommitted |
|---|---|---|---|---|---|
| 26-000 Electrical | $330,000 | $95,000 | $215,000 | $310,000 | $20,000 |
| 23-000 Mechanical | $175,000 | $60,000 | $100,000 | $160,000 | $15,000 |
| 03-300 Concrete | $213,000 | $85,000 | $40,000 | $125,000 | $88,000 |
Data you need
Fields
| Field | What it means | Example value |
|---|---|---|
| Commitment | Subcontract or PO, vendor, cost code | SC-2420-04, Ace Electric, 26-000 |
| Commitment value | Original plus approved changes | $310,000 |
| Invoiced to date | Billed against it | $95,000 |
| Status | Open or closed | Open |
| Revised budget | By cost code | $330,000 |
| Cost to date | Posted cost | $240,000 |
What the raw data looks like
Example data A few rows as they might come out of the source system.
| Commitment | Type | Vendor | Cost code | Value | Invoiced | Open |
|---|---|---|---|---|---|---|
| SC-2420-04 | Subcontract | Ace Electric | 26-000 | $310,000 | $95,000 | $215,000 |
| SC-2420-05 | Subcontract | North Mech | 23-000 | $160,000 | $60,000 | $100,000 |
| PO-8812 | PO | Metro Supply | 03-300 | $70,000 | $30,000 | $40,000 |
Where this data usually lives
- Construction ERP and accounting holds job cost, budgets, billing, AP, and AR. For example: Sage 300 Construction and Real Estate, Viewpoint Vista (Trimble), and Foundation. Some smaller contractors use general accounting software such as QuickBooks with jobs set up as projects.
- Project management often holds change orders, commitments, and project documents. For example: Procore.
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
- Commitments in a PM tool, invoices in the ERP. Join on commitment number.
- Uncoded lines. Lump-sum commitments without cost codes cannot be compared to budget.
- Closed short not recorded. Old open balances inflate commitments.
- Sub change orders not entered. Commitments understated.
Related metrics
- Cost to complete: should cover open commitments.
- Job cost variance: budget vs estimate at completion.
- Subcontractor compliance: the subs behind the commitments.
FAQ
- Is committed cost on the income statement?
- No. Only incurred cost is. Committed cost is a management view.
- Does committed cost include labor?
- Usually not, since labor is not contracted ahead. Some teams add scheduled labor as a forecast.
- What is buyout?
- Signing subcontracts and POs for the job, ideally at or under budget.
For your data teamFormula variants, tables, SQL sketch, and dashboard spec
Formula details
open_commitments = SUM(commitment_value) - SUM(invoiced_against_commitment) -- open only
committed_cost = cost_to_date + open_commitments
uncommitted = revised_budget - committed_cost
Worked example detail
| Item | Job 2420 |
|---|---|
| Cost to date | $240,000 |
| Open commitments | $355,000 |
| Committed cost | $595,000 |
| Revised budget | $718,000 |
| Uncommitted budget | $123,000 |
Tables and fields
| Table | Fields | Notes |
|---|---|---|
commitments |
commitment_id, job_id, cost_code, vendor_id, type, value, status | |
commitment_invoices |
commitment_id, amount, invoiced_at | |
job_costs |
job_id, cost_code, amount |
SQL sketch
SELECT c.job_id, c.cost_code, SUM(c.value - COALESCE(i.inv,0)) AS open_commitments
FROM commitments c LEFT JOIN (SELECT commitment_id, SUM(amount) inv FROM commitment_invoices GROUP BY 1) i USING (commitment_id)
WHERE c.status = 'open' GROUP BY c.job_id, c.cost_code;
Build spec
Copy this into a ticket. It lists the grain, inputs, logic, and edge cases.
metric: construction.committed_cost
grain: one row per job per cost code
inputs:
- commitment value
- invoiced against commitment
- cost to date
- revised budget
logic:
- open = value - invoiced (open commitments only)
- committed = cost_to_date + open
- uncommitted = budget - committed
edge_cases:
- invoiced > value: open = 0 and flag
- uncoded commitment: assign to an 'uncoded' bucket
- closed commitment: open = 0
As a dashboard card
- Stacked bar of cost to date, open commitments, and uncommitted forecast per job; table by cost code.
Common mistakes
- Double counting invoiced commitments in both cost to date and commitments.
- Leaving closed-short commitments open.
- Comparing uncoded commitments to coded budgets.