Subcontractor Management: Track Insurance Expiry and Onboarding With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Subcontractor Management: Track Insurance Expiry and Onboarding With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Subcontractor Management: Track Insurance Expiry and Onboarding With AI.

Keep one tracker with a row per document, not per subcontractor: policy type, insurer, limit, expiry date and status. Have AI read each new certificate into those fields and draft reminders for 60, 30 and 7 days before expiry, while a named person approves every certificate. Nothing is approved, rejected or locked out automatically.

Per-document rows matter because a subcontractor is rarely simply "insured" or "not insured". Liability cover can be current while workers' cover lapsed last Friday, and a certificate that expires before the project ends is a problem on day one, not on day 200. The AI's job is reading and drafting. The approval, and the decision to let a crew onto site, stay with a person.

Follow me on Instagram@sagnikteaches

The document pack: what every subcontractor sends before day one

Start with the list, because the tracker is only as good as the pack behind it. Tailor it by trade: a roofer needs working-at-height method statements, a decorator probably does not need professional indemnity. This is the base version, with what a reviewer checks on each item.

Connect on LinkedInSagnik Bhattacharya
DocumentWhat the reviewer checksExpires?
Signed subcontractEntity name and signatory match the subcontractor; scope and price match the quoteNo
General or public liability certificateLimit against your minimum, policy period, named insured, activities covered, extra wording your contract asks forYes
Employer's liability or workers' compensation, whichever appliesIn force for the crew size, named insured, policy periodYes
Vehicle cover, if vehicles come on siteCovers business use; policy periodYes
Professional indemnity, design-responsible trades onlyLimit, period, and any retroactive date shownYes
Trade licence or registrationNumber, scope of work it covers, expiryYes
Safety policy and a method statement or risk assessment for this jobCurrent, and written for this work rather than genericPer project
Training and competency cards for the crewNames match the site list; expiry datesYes
Payment details formBank details confirmed by a call to a number you already hold, never by email aloneRe-check on any change
Site induction recordDate, who delivered it, who attendedPer project

Six of those ten items carry an expiry date, which is why the unit of tracking is the document. AI in contracting: a subcontractor paperwork chasing checklist covers the paperwork you chase beyond insurance, and can ChatGPT draft a subcontractor agreement is the place to settle the insurance minimums the tracker will test against.

Subscribe on YouTube@sagnikteaches

Build the tracker: a row per document, formulas that count days

Use a spreadsheet you already have. The columns are: subcontractor, project, document type, issuer, policy number, limit, start date, expiry date, project end date, days left, status, covers project end, limit check, approved by, approved on, link to the file, notes. The formulas below work in both Excel and Google Sheets. They assume expiry is in column H, project end in I and limit in F, with your minimum liability limit in cell $Q$1.

Days left (J2):        =IF(H2="","",H2-TODAY())
Status (K2):           =IF(H2="","Missing",IF(H2<TODAY(),"Expired",IF(H2-TODAY()<=30,"Due soon","Current")))
Covers project end (L2): =IF(OR(H2="",I2=""),"",IF(H2>=I2,"Yes","No"))
Limit check (M2):      =IF(F2="","n/a",IF(F2>=$Q$1,"Meets","Below"))

Colour the status cells red for Expired and No, amber for Due soon and Below, green for Current and Yes. Leave "approved by" and "approved on" as typed cells with no formula, so that only a person can fill them. Here is an illustrative slice as at 10 March, for a project ending 15 June with a $2,000,000 minimum liability limit:

SubcontractorDocumentLimitExpiryDays leftStatusCovers project endLimit check
ElectricalLiability$2,000,00030 Apr51CurrentNoMeets
ElectricalWorkers' covern/a12 Mar2Due soonNon/a
RoofingLiability$1,000,00018 Nov253CurrentYesBelow
RoofingVehiclen/a3 Mar-7ExpiredNon/a
PlumbingLiability$5,000,00022 Jun104CurrentYesMeets
PlumbingTrade licencen/ablankMissingn/a
DrywallLiability$2,000,0009 Apr30Due soonNoMeets
DrywallTraining cardsn/a1 Oct205CurrentYesn/a

Read what the sheet catches that a plain "current or expired" view would not. The electrical subcontractor's workers' cover lapses in two days, and its liability, though current, ends six weeks before the job does. The roofer's liability is current and covers the project, but the limit is half your minimum. The roofer's vehicle cover expired a week ago. The plumber's licence was never supplied. The drywall liability is thirty days out and also falls short of the project end. Six of the eight rows need a human action, and a status column alone would show Current against two of those six.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

Let AI read the certificate, then check its reading

Certificates arrive as PDFs, phone photos and scans of paper. Reading them into fields is the dull job AI does well enough to save time and badly enough to need a check. Use a prompt that forbids guessing and makes the tool show its assumptions:

Read the attached certificate of insurance and return one table row with these fields:
Policy type | Insurer | Policy number | Named insured | Limit each occurrence | Limit aggregate | Policy start | Policy expiry | Certificate holder | Additional wording shown (yes/no, quote it) | Certificate issue date

Rules
- Copy dates exactly as printed, then give the date in YYYY-MM-DD and state which day/month order you assumed and why.
- If a field is not shown, write NOT SHOWN. Never infer or fill in a likely value.
- List any text you could not read.
- Do not say whether the cover is adequate. Only report what the page says.

An illustrative output for a general liability certificate: named insured "[subcontractor name] Ltd"; limit $2,000,000 each occurrence and $4,000,000 aggregate; policy start printed 01/05/2026 and expiry 30/04/2027, read as day/month because 30 cannot be a month; additional wording NOT SHOWN; certificate issue date 14/02/2027; unreadable: last three digits of the policy number. That is a useful row, and it still needs a person to open the PDF beside it.

The reason is that mistakes are quiet. Picture a certificate that prints an expiry of 04/03/2027 in day/month order, meaning 4 March. A model that assumes month/day reads it as 3 April, and the tracker shows a month of cover that does not exist. Because the prompt demands a stated date order, the assumption is visible in the output, and an approver comparing the PDF with the row catches it in under a minute. Make that comparison the rule for every new entry:

  • Dates. Policy period against the row, in the order printed. An expiry earlier than the start, or a start in the future, is a red flag.
  • Named insured. Must match the entity that signed the subcontract. A sister company or a parent is not the same insured.
  • Limits. Each occurrence and aggregate are different numbers. Check the model has not swapped them.
  • Scans and photos. Image-only scans are the hardest case. The main assistants accept PDFs and photos, but OpenAI's file-upload FAQ does not say how well ChatGPT reads a scanned page with no text layer, and no vendor promises an accurate reading of a crooked or low-resolution scan. Test a handful of your own scans and compare each by eye before trusting the output.

The gap check: compare each certificate with your minimums

Keep your minimums on one small sheet, taken from your subcontract: liability limit per occurrence, workers' cover or employer's liability, vehicle cover where vehicles attend, any extra wording you require, and the number of days' notice of cancellation you ask for. Then ask the model to compare, with a three-way answer and no approval language:

Compare this extracted certificate row with our minimum requirements below.
For each requirement, answer one of: APPEARS TO MEET, APPEARS NOT TO MEET, CANNOT TELL.
Give the exact text or number you relied on. If the answer is CANNOT TELL, say what a person should check.
Do not use the words approved or compliant.

Requirements: liability $2,000,000 each occurrence; policy must run to [project end date]; named insured must be [subcontract entity]; ...

On the earlier sample, an illustrative result reads: limit APPEARS TO MEET; period APPEARS NOT TO MEET because expiry is 30 April and the project ends 15 June; named insured CANNOT TELL, because the certificate shows a trading name and the subcontract shows a registered name. Each result gives the approver a specific question, not a verdict.

A certificate is a summary issued by a broker or insurer. It does not show every exclusion or endorsement. For high-risk trades or large subcontracts, ask for the relevant policy pages or a written confirmation from the broker. Where the answer is "not yet", use a Conditional status with a date: approved to start only once the missing item arrives by the stated deadline, set by a person and logged. For the wider routine of handling this paperwork, carrier packet onboarding with AI is a close cousin, and its insurance checks transfer almost unchanged.

When the limit is short: three ways to settle it, and the log entry

Take the roofer from the sample: liability at $1,000,000 against a $2,000,000 minimum, with the project running to June. The gap check says APPEARS NOT TO MEET. Three outcomes are normal, and the decision belongs to a person:

  • Top up. The subcontractor asks the broker for an excess or umbrella policy, or raises the primary limit, and sends a new certificate. The status stays Conditional until it arrives, with a date.
  • Waive in writing. A named senior person accepts the lower limit for a low-risk scope, records why and sets an end date for the waiver. Do this rarely, and never let the tool propose it.
  • Decline. The subcontractor is not approved for this project, and the reason is logged in factual terms ("liability limit below project minimum; no top-up offered by [date]"), not as a judgement of the firm.

Whichever path you take, write the decision into a log the whole team can see. An illustrative entry: "Roofing, liability $1,000,000 against $2,000,000 minimum. Status: Conditional until 24 March. Condition: certificate showing excess cover that brings the total to $2,000,000 or more, naming [subcontract entity]. Decided by [approver], 10 March. If not received by 24 March: not approved for this project; project manager informed." That entry has a condition, a date, a named decider and a default outcome. Those four things are what make a later conversation short.

Reminder emails: 60 days, 30 days, 7 days and expired

Four short emails, each with one ask, one deadline and one place to send the certificate. Have AI draft them from your subcontract's insurance clause, then fix the tone and the consequences yourself. Use "[first name]" and "[your name]" placeholders, not real names. Here are illustrative versions:

60 days. Hi [first name], a quick heads-up that your liability certificate on file expires on [date]. No action today. When the renewal comes through, please send the new certificate to [shared inbox] so we can update our records. Thanks, [your name]

30 days. Hi [first name], your liability certificate expires on [date], 30 days from now. Please send the renewal to [shared inbox] by [date]. Our subcontract needs current cover on file before your crew is on site, so it is worth asking your broker now. [your name]

7 days. Hi [first name], your certificate expires in 7 days, on [date]. Under clause [number] of our subcontract we cannot have your crew on site after that date without a current certificate. If renewal is in progress, a written confirmation from your broker helps us. I will phone you tomorrow. [your name]

Expired. Hi [first name], our records show your liability cover expired on [date] and we have no renewal. Please send the current certificate to [shared inbox] today. Until it is received and approved, we cannot allow work on site. If there is a reason for the gap, call me on [number]. [your name]

The seven-day and expired emails state a consequence, so check that the consequence is the one your contract actually gives, and have a solicitor review that wording before it becomes standard. A model asked for a "firm" email tends to invent threats such as withholding payment or terminating the subcontract. Tell it to quote the clause and add nothing.

Draft four reminder emails (60 days, 30 days, 7 days, expired) for a subcontractor's liability certificate.
Facts: our inbox is [shared inbox]; the contract clause is pasted below; we phone at 7 days.
Rules: plain words, under 90 words each, one ask, one deadline, no threats beyond the clause, do not say anything is approved, use [first name] and [your name] placeholders.
Clause text: [paste clause]

The sum shows why this is worth doing. Say a general contractor has 24 active subcontractors with four expiring documents each: 96 documents. If each renews once a year and gets up to three reminders, that is up to 288 emails. Written by hand at four minutes each, that is about 19 hours a year. With four templates, a mail merge and one minute of review per email, it is about five hours. All of these numbers are illustrative, and the saving comes from the templates and the sheet, with AI mostly speeding up the first drafts.

Onboarding stages, with one status that only a person can change

Treat onboarding as a line of stages with one owner each. The tracker above covers insurance documents, and the same status column can run the whole pack.

StageWhoWhat happensTypical time (illustrative)
1. InvitedProject coordinatorSubcontractor receives the pack list and the shared inbox or folder link10 minutes
2. Pack receivedCoordinatorFiles logged, one tracker row per document15 minutes
3. AI pre-checkAI, run by coordinatorCertificates read into fields; gap check against minimums; list of questions produced2 minutes a certificate
4. Human reviewNamed approverOpens each PDF beside its row; answers the AI's questions; makes calls10 to 15 minutes a subcontractor
5. DecisionNamed approverTypes Approved, Conditional (with date) or Not approved, with name and date1 minute
6. InductionSite managerInduction recorded; crew list matched to training cardsPer site
7. ActiveSite managerSubcontractor appears on the site access listReviewed weekly

Two rules keep this honest. First, stage 5 is typed by a person and no formula, automation or AI can write it. Second, the site access list is a filter of subcontractors who are Approved and have every document Current, and the site manager reads it every Monday before anyone is turned away or let in. If a subcontractor drops off the list because a document lapsed, a person picks up the phone, not a script.

Where the tracker fails: six realistic breakdowns

  • The wrong company. The certificate belongs to a parent or sister company, while the subcontract was signed by a different one. The AI row looks perfect because the certificate is fine; the problem is who it covers. Fix: the named-insured check against the subcontract, every time.
  • The invisible gap. A renewal arrives with a start date a week after the previous policy ended. Read one at a time, both certificates look current. Fix: when you log a renewal, compare its start date with the old expiry and note any gap.
  • The poor scan. A crooked phone photo with a thumb over the limit. A model may fill the field with a plausible number. Fix: the NOT SHOWN rule in the prompt, plus the PDF-beside-the-row check.
  • The cancelled policy. A subcontractor changes insurer part-way through the term and the earlier policy ends, but the certificate on file does not change. No spreadsheet can see this. Fix: for long projects, ask for a broker's confirmation at set points, and put a spot check on the Monday routine.
  • Reminder fatigue. Three emails to the same general inbox are ignored. Fix: send to the named insurance contact, make each email a single ask, and phone at seven days.
  • One person holds the process. The coordinator is on leave and the tracker stops being read. Fix: write the Monday routine below on one page and name a deputy.

The Monday routine: fifteen minutes a week

  1. Open the tracker and filter the status column to anything other than Current. Also filter "covers project end" to No for active projects.
  2. For each row, check whether a reminder has already gone and whether the next one is due. Paste the contact and dates into your reminder prompt and review each draft before sending.
  3. Phone anyone at seven days or less with no renewal in hand. Log the call in the notes column.
  4. Read the site access list against the week's site plan. Anyone expected on site who is not Approved or has an Expired document goes to the site manager the same morning.
  5. Once a month, pick five approvals at random and compare each PDF with its row. Record what you found in a short log, including the cases where nothing was wrong.
  6. Once a year, revisit your minimums with your broker and update the requirements sheet, then let the tracker's limit check run against the new numbers.

On cost, the tracker is free if you already pay for a spreadsheet, and the AI part sits inside any chat plan you have. Certificates carry policy numbers and business addresses, so read them in a workspace on a business plan. ChatGPT Business, Claude Team and Microsoft 365 Copilot keep business content out of training by default; on a personal plan you would have to find and switch off the training setting yourself. ChatGPT Business and Claude Team each list at $20 a seat a month billed annually or $25 monthly, for two seats or more, so check whether a plan your office already holds covers this before adding seats.

Collecting the documents without friction

Pick one place where documents land. A dedicated inbox such as the shared address in the reminder emails keeps every certificate together, and a folder per subcontractor keeps the files tidy. If you collect through a form, Google's help page says a file-upload question requires respondents to sign in to a Google account, and that the files are stored in a folder in the form owner's Drive. Plenty of subcontractors will not or cannot sign in, so give them an email route as well.

Keep bank and tax details out of AI tools altogether. The insurance check needs only the certificate. The payment details form is verified by a phone call to a number you already hold, because a changed bank account in an email is a classic fraud route.

Once the tracker works, the same pattern extends to the front of the funnel: building and scoring a prequalification questionnaire decides who gets invited, and getting payroll and subcontractor records ready for a workers' comp audit shows the other time these certificates are asked for. If you are writing a policy for how your team uses AI on this paperwork, an AI policy for a construction company sets out what staff may paste where.

Questions contractors ask about tracking subcontractor cover

Can AI approve a certificate automatically?

It can pre-check one, but it should not approve. An approval says your business accepts the risk of that subcontractor being on site, and the tool cannot know your contract's exceptions, your project's risks or what the broker told you by phone. Let AI fill the fields and flag gaps, and have a named person type the approval and the date.

How far ahead should expiry reminders go?

Sixty, thirty and seven days before expiry works for most firms, because renewals often take a few weeks and brokers are slow in busy months. Add a fourth message the day after expiry. Send reminders to the person who handles insurance at the subcontractor, copy the broker if you hold the address, and phone at seven days if nothing has arrived.

What if the subcontractor's broker sends the certificate?

That is usually better, since the broker can issue it quickly and it comes from the party that holds the policy. Treat it exactly like any other certificate: log it in the tracker, check the named insured against the subcontract, and have your approver confirm. Ask the subcontractor to tell the broker your shared inbox address once, so renewals arrive without chasing.

How long should I keep expired certificates?

Keep them at least as long as your contract, your own insurer and any record-keeping rules that apply to you require, and ask your adviser for the exact period. Store them with the date approved and who approved them. A superseded certificate can matter years later if a claim relates to work done while it was in force.

Further reads

Sources: Google's help page on Forms file upload questions (read in early November 2026), OpenAI's file-uploads FAQ, and vendor privacy defaults recorded for ChatGPT Business, Claude Team and Microsoft 365 Copilot. The tracker formulas were written for this tutorial and work in both Excel and Google Sheets.

Want subcontractor onboarding run without the chasing?

On a 1:1 call we'll look at how subcontractor documents reach you today, set the fields and reminder timings worth tracking, and decide which steps a spreadsheet can handle before anything is automated.

Book a 1:1 call with me