What it is
General contractors require documents from each sub before and during the work. Common items are a signed subcontract, a certificate of insurance (COI), a W-9, and lien waivers with payments. Requirements vary by contractor, owner, and state.
Compliance can be measured per sub (all items met) or per requirement.
Why operators track it
- Risk transfer. An expired COI can leave the GC exposed if something happens on site.
- Payment control. Many contractors hold payment until a lien waiver or COI is received.
- Owner requirements. Owners and lenders may require lien waivers from subs with pay apps.
- Admin load. Tracking shows where the team spends time chasing paperwork.
How it is calculated
Compliance rate = active subs with all required items current ÷ active subs
- Active = has an open commitment or worked in the period.
- Current = received and not expired on the as-of date.
- Also report per requirement, and the dollars of open commitments with non-compliant subs.
Worked example
Of 24 active subs, 19 have everything current: 79%. Three COIs have expired, two lien waivers are missing, and one safety document is missing. The five subs with gaps hold $412,000 of open commitments.
How to read it
- Weight by dollars. A non-compliant sub with a large open commitment is a bigger risk.
- Expiring soon is as useful as expired. Show COIs expiring in the next 30 days.
- Per requirement shows where the process breaks.
- We do not publish a benchmark. Requirements differ by contractor.
Definitional choices and common pitfalls
- Requirement list. Define the list per contractor; it may vary by job or owner.
- Active definition. Open commitment, on site this period, or invoiced this period.
- Lien waivers. Conditional vs unconditional, and for which payment. Follow the contractor's process and state forms, with counsel.
- Grace period. Whether a document is late on the due date or after a grace period.
How different roles use it
| Role | How they use it |
|---|---|
| CFO / controller | Holds payments until required documents are in. |
| Project manager | Chases missing items from subs on their jobs. |
| Safety director | Tracks safety documents and training for subs. |
| Owner / CEO | Sees exposure to non-compliant subs. |
Questions it answers
- Which subs have expired insurance?
- Which payments are waiting on lien waivers?
- How much open work is with non-compliant subs?
- Which COIs expire in the next 30 days?
How to present it in a report
- KPI for compliance rate and dollars at risk.
- A list of subs with gaps, the item, and days overdue.
- COIs expiring in the next 30 days.
- Per-requirement bar.
| Sub | Gap | Since | Open commitment | Payment held |
|---|---|---|---|---|
| Ace Electric | COI expired | Oct 1 | $215,000 | Yes |
| North Mech | Lien waiver, pay app 4 | Oct 12 | $100,000 | Yes |
| Ridge Roofing | COI expired | Oct 20 | $52,000 | No |
Two more subs with gaps not shown.
Data you need
Fields
| Field | What it means | Example value |
|---|---|---|
| Subcontractor | Vendor and trade | Ace Electric, electrical |
| Requirement | Document type | Certificate of insurance |
| Received date | When received | Oct 1, 2025 |
| Expiration date | For COIs and licenses | Oct 1, 2026 |
| Payment and waiver | Payment and matching lien waiver | Pay app 4, waiver missing |
| Open commitment | Unbilled subcontract value | $215,000 |
What the raw data looks like
Example data A few rows as they might come out of the source system.
| Sub | Requirement | Received | Expires | Status | Open commitment |
|---|---|---|---|---|---|
| Ace Electric | COI | Oct 1, 2025 | Oct 1, 2026 | Expired | $215,000 |
| North Mech | Lien waiver, pay app 4 | Missing | $100,000 | ||
| Metro Drywall | COI | Mar 2, 2026 | Mar 2, 2027 | Current | $88,000 |
Where this data usually lives
- Compliance tracking, in a dedicated tool, the PM system, or the ERP vendor record, holds insurance certificates, lien waivers, and expiration dates.
- Project management often holds change orders, commitments, and project documents. For example: Procore.
- 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.
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
- Documents as files only. COIs may be PDFs with no structured expiration date.
- Separate compliance tool. Some contractors use a dedicated tool; link by vendor ID.
- Waivers not linked to payments. Hard to say which payment is missing a waiver.
- Inactive vendors still listed. Inflates the denominator.
Related metrics
- Committed cost: dollars with each sub.
- Retainage outstanding: waivers often gate release.
- Safety incident rate: sub safety records.
FAQ
- What documents are usually required from subs?
- Commonly a signed subcontract, certificate of insurance, W-9, and lien waivers. Requirements vary; follow the contract and counsel.
- Should expired COIs block payment?
- That is a contractor policy decision. The report should show which payments are affected.
- How do I count a sub on several jobs?
- Once for the company rate; per job for job views.
For your data teamFormula variants, tables, SQL sketch, and dashboard spec
Formula details
active_sub = has open commitment OR invoiced in :period
compliant = ALL(required items received AND (expires_at IS NULL OR expires_at >= :as_of))
rate = COUNT(compliant) / COUNT(active_sub)
at_risk_usd = SUM(open_commitment) WHERE NOT compliant
Worked example detail
| Item | Value |
|---|---|
| Active subs | 24 |
| Fully compliant | 19 |
| Rate | 79% |
| Open commitments with gaps | $412,000 |
Tables and fields
| Table | Fields | Notes |
|---|---|---|
vendors |
vendor_id, name, trade, active | |
compliance_docs |
vendor_id, job_id, doc_type, received_at, expires_at | |
requirements |
scope, doc_type, required | Scope is company or job |
SQL sketch
SELECT v.vendor_id,
BOOL_AND(d.received_at IS NOT NULL AND (d.expires_at IS NULL OR d.expires_at >= :as_of)) AS compliant
FROM vendors v CROSS JOIN requirements r
LEFT JOIN compliance_docs d ON d.vendor_id = v.vendor_id AND d.doc_type = r.doc_type
WHERE v.active AND r.required GROUP BY v.vendor_id;
Build spec
Copy this into a ticket. It lists the grain, inputs, logic, and edge cases.
metric: construction.subcontractor_compliance
grain: one row per sub per as-of date; one row per sub per requirement
inputs:
- required document list
- received date
- expiration date
- open commitment
logic:
- compliant if every required item received and not expired
- rate = compliant / active
edge_cases:
- no expiration on doc: treat as current
- requirement added mid-job: apply from its effective date
- sub on multiple jobs: company and job views
As a dashboard card
- KPI for rate and dollars at risk; table of gaps sorted by open commitment.
Common mistakes
- Counting inactive vendors.
- Missing the expires-soon view.
- Treating a document on file as current without checking expiration.