Construction · Risk and compliance

Subcontractor compliance

The share of active subcontractors with every required document current: signed subcontract, current certificate of insurance, tax forms, lien waivers, and any safety or license items the contractor requires.

Plan your metrics

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.

24 active subcontractors, requirement by requirementCompliantMissing or expiredSigned subcontract24100%Certificate of insurance current2188% (3 gaps)W-9 on file24100%Lien waiver for last payment2292% (2 gaps)Safety documents2396% (1 gaps)Fully compliant (every requirement met) = 19 of 24 = 79%. Five subs have at least one gap.Those five hold $412,000 of open commitments.
Example data A sub counts as compliant only if every required item is current on the as-of date. Requirements here are an example list.

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.
Customer report mockupExample data
Subcontractor complianceAs of Oct 31, 2026
Fully compliant79%19 of 24 subs
Open work with gaps$412,0005 subs
COIs expiring in 30 days2
SubGapSinceOpen commitmentPayment held
Ace ElectricCOI expiredOct 1$215,000Yes
North MechLien waiver, pay app 4Oct 12$100,000Yes
Ridge RoofingCOI expiredOct 20$52,000No

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.

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.

Version 1.0 · Last reviewed 2026-10-20 · Machine-readable definition