Skip to main content
Skip to main content

Subcontractor Compliance Tracker Template

What this isโ€‹

One spreadsheet, one row per subcontractor, one column group per document that expires. It tells you at a glance who is compliant, who is about to lapse, and who you should not be paying this week.

It is the manual version of what compliance software does. It works, it costs nothing, and it is honest about where it stops working.

When you use itโ€‹

  • Every month, as a standing review before the pay application cycle
  • Before releasing any progress payment to a sub
  • Before a sub mobilizes on a new job
  • When an incident happens and you need to know what was in force on that date
  • At annual requalification, to see who has been chronically late with documents

How to fill it inโ€‹

One row per subcontractor, not per job. A sub on four of your jobs has one insurance policy. Track the policy once and list the active jobs in a column, so you know who to call when it lapses.

Use dates, not "current". The whole value of the sheet is arithmetic on expiry dates. A column that says "OK" with no date behind it is a column you cannot sort or automate.

Status should be computed from the date, not typed. In a spreadsheet, a formula comparing the expiry date to today produces OK, EXPIRING, EXPIRED or MISSING. Typed statuses go stale the day after somebody types them.

Never use color alone. Conditional formatting is useful, but the text marker is what survives printing, screenshots, color blindness and pasting into an email. Color on top of text, never instead of it.

Record the date you last requested a document. Two rows that both say EXPIRED are different problems if one was chased yesterday and the other has been ignored for six weeks.

Rule of thumb

If a sub is EXPIRED on any required document, they do not get paid and they do not mobilize. Enforcing that once, early, on a small sub, is what makes it work on a big one later.

Watch out

The most dangerous state is not EXPIRED. It is OK on a certificate that was never checked for the required endorsements. An in-date certificate for a policy without a completed operations additional insured endorsement passes this tracker and leaves you uncovered. Verify endorsements at collection; the tracker only manages dates.

The templateโ€‹

Build it in a spreadsheet. The tables below are the column specification.

Column specification โ€” identity and statusโ€‹

#ColumnWhat goes in it
1Sub nameLegal name, matching the subcontract and the W-9
2TradePrimary trade, for filtering
3Overall statusComputed: worst status across all document columns
4Active jobsJob numbers where the sub is currently on site or under contract
5On site nowYes / No โ€” drives urgency
6Prequal dateDate the current prequalification was approved
7Prequal expiresUsually prequal date plus twelve months
8Approval tierApproved / Conditional / Limited / Do not use
9Award limitDollar ceiling from the approval, if any

Column specification โ€” documentsโ€‹

Each document gets three columns: expiry date, status, and the date you last asked for it.

#DocumentColumnsNotes
10โ€“12General liabilityExpiry, status, last requestedAlso flag whether both additional insured endorsements are on file
13โ€“15Automobile liabilityExpiry, status, last requested
16โ€“18Workers' compensationExpiry, status, last requestedThe one that most often lapses, because it is billed monthly
19โ€“21Umbrella / excessExpiry, status, last requested
22โ€“24Contractor licenseExpiry, status, last requestedCheck the state board, do not trust the copy
25โ€“27License bondExpiry, status, last requestedWhere the state requires one
28โ€“30W-9Date on file, status, last requestedDoes not expire, but changes when the entity changes
31โ€“33Safety programDate of the version on file, status, last requestedTreat anything over three years old as stale
34Endorsements verifiedDate you last checked the actual endorsement forms
35NotesWhat was said, to whom, when

Optional columns worth adding if they apply to your work: certified payroll status, OCIP or CCIP enrolment, prevailing wage registration, drug testing program, and any owner-specific requirement on a particular job.

Worked exampleโ€‹

Five subs, mid-month, before the pay cycle. All names are fictional.

Sub nameTradeStatusActive jobsPrequal expiresGL expGLWC expWCAuto expAutoLicense expLicenseW-9Last requestedNotes
Ridgeline MechanicalHVACOK24-118, 25-1022027-02-142027-01-01OK2026-12-01OK2027-01-01OK2027-06-30OKOK2026-02-14Clean file
Kestrel ElectricElectricalEXPIRING25-1022026-11-302026-09-12EXPIRING2026-09-12EXPIRING2026-09-12EXPIRING2028-03-31OKOK2026-08-12Whole program renews 9/12, broker confirmed renewal in process
Two Rivers DrywallDrywallEXPIRED25-1072026-10-042026-08-01EXPIRED2026-08-01EXPIRED2026-08-01EXPIRED2027-09-30OKOK2026-08-05Third request sent. On site now. Payment held.
Alder Creek ConcreteConcreteMISSING25-1192027-04-222027-03-15OK2027-03-15OKโ€”MISSING2029-01-31OKOK2026-08-18No auto policy on file; sub says hired and non-owned only, needs proof
Harbor Glass & GlazingGlazingOKnone2026-09-012026-12-31OK2026-12-31OK2026-12-31OK2027-05-31OKOK2026-06-01Prequal expires in two weeks; not on site, low urgency

Read the sheet in this order. Two Rivers is the problem: expired coverage, on site, working today. That is a phone call this morning and a payment hold, not an email. Kestrel is fine โ€” one renewal date, already in motion, diary it for the 13th. Alder Creek is a missing document, not an expired one, which usually means a misunderstanding rather than a lapse. Harbor Glass is an administrative task with no exposure attached because they are not on site.

Status definitionsโ€‹

MarkerMeaningRule
OKIn force, more than 30 days to expiryNo action
EXPIRINGIn force, 30 days or fewer to expiryRequest renewal
EXPIREDPast the expiry date, no renewal on fileHold payment, stop work if on site
MISSINGNever receivedDo not allow mobilization
N/AGenuinely does not apply, with a reason in notesRequires a note, or it reads as a gap

N/A should be rare and always explained. A sub with no vehicles still needs hired and non-owned auto coverage, so N/A on the auto row is usually wrong.

Reminder cadenceโ€‹

Set the reminders off the expiry date, not off a monthly sweep. Five touches:

Days before expiryAction
60First request by email to the sub and copied to their broker
30Second request, status moves to EXPIRING
14Third request, phone call to the sub's office manager
7Notice that payment will be held and that mobilization is blocked
0Status moves to EXPIRED. Payment held. If on site, notify the PM and the superintendent

Copying the broker on the first request is the highest-value habit in the whole cadence. Brokers issue certificates in minutes and subs forward emails in weeks.

The monthly routineโ€‹

Thirty to sixty minutes, on the same day every month, before pay applications are processed.

  1. Refresh the computed status column and sort by status, worst first.
  2. Deal with every EXPIRED row on an active job first. Phone, not email.
  3. Send the 60- and 30-day requests as one batch.
  4. Check the prequal expiry column and start requalification for anything within 60 days.
  5. Spot-check three certificates against the insurance requirements exhibit โ€” endorsements, not just dates.
  6. Update the notes column with what you did, so next month starts from a real position.

Request everything missing in one passโ€‹

When you contact a sub, ask for every document you need from them, not the one that triggered the reminder. A sub whose general liability expired next week probably has an auto policy expiring the same day, a license renewal due, and a safety program from 2021.

Three consequences of doing it this way:

  • One email instead of four spreads over four weeks
  • The sub's broker can issue one certificate covering everything
  • You stop being the GC who emails constantly, which is why subs start ignoring you

Keep a saved template for the request. Name the documents, name the expiry dates, name the date you need them, and say plainly what happens if they are late.

Keeping historical certificatesโ€‹

This is the part most people get wrong, and it is the part that costs money.

Never overwrite a certificate when a renewal arrives. File the new one alongside the old one. The tracker holds the current expiry date; the file holds every certificate you have ever received, each labelled with its effective and expiry dates.

The reason is simple. When a claim is made, the policy that responds is the one in force on the date of the occurrence, not the one in force today. If a fall happened on 14 March 2024, you need the certificate and the endorsements that covered 14 March 2024 โ€” and if you overwrote them with the 2025 renewal, you cannot prove the sub had coverage, cannot prove you were an additional insured, and cannot tender the claim. Your own carrier then pays, and your loss history carries it for years.

The same applies at audit. Your general liability audit will assess premium on payments to uninsured subcontractors. Producing a certificate covering the period in which you paid the sub is what keeps those payments out of the audit. A current certificate does not prove anything about the year being audited.

Practical filing rules:

  • One folder per sub, one subfolder per policy year
  • File names carry the coverage, the effective date and the expiry date
  • Store endorsement forms with the certificate they belong to, not separately
  • Keep certificates for at least the length of your state's statute of repose for construction defect claims, which is often longer than you expect
  • Never delete a certificate because a sub is inactive; inactive subs are exactly who claims arrive about
Watch out

Systems that let a renewal overwrite the previous record are common, including some document management setups. Check what yours does before you rely on it.

Notes and common mistakesโ€‹

Tracking dates and not endorsements. The tracker manages expiry. It does not tell you the coverage was ever right. Verify endorsements when the certificate arrives and record the date you did it.

Letting the sheet live on one person's laptop. It should be on a shared drive, and a second person should know how it works. Compliance tracking that depends on one employee is one resignation away from a gap.

Chasing by email only. Email is the first two touches. After that it is a phone call, and after that it is a payment hold. Subs respond to payment holds.

Not enforcing it. A tracker whose EXPIRED rows still get paid trains everyone that the sheet is decorative. Enforce it the first time and you rarely have to enforce it again.

Starting from scratch instead of from your current subs. Load your active list first, then backfill. A tracker covering the fifteen subs on site now is more useful today than a perfect one covering ninety subs next quarter.

Where this stops workingโ€‹

Be honest about the ceiling. This sheet works well up to roughly 25 to 30 active subcontractors. Past that, the arithmetic still works, but the chasing does not โ€” you are sending fifty reminder emails a month, tracking who replied, re-reading certificates, and doing it around a job that also needs running.

At that point the failure mode changes from "we do not have a system" to "we have a system and nobody has time to run it", which is harder to see and more expensive. Software that emails subs directly, collects the documents, and reads the dates off them pays for itself somewhere in that range, and the cost is usually less than the hours you are already spending.

Use this template until it hurts. Then stop doing it by hand.

For the collection process behind the sheet, see the COI collection workflow. For what to check on each certificate, see subcontractor insurance requirements.


Was this page helpful?