You do not need a developer to build a COI processing workflow that automatically parses certificates, checks compliance, and sends rejection notices with specific failure details. Zapier connects the pieces with point-and-click configuration, and with the right step structure you can have a working workflow in an afternoon.
This guide walks through the full Zapier workflow design - trigger, parse, compliance check, routing, notification - with specific field mappings and step configurations. By the end, you will have a working no-code COI automation pipeline.
Before building: the ROI analysis for automation shows this is worth doing at almost any volume above 100 COIs per year. If you have not done that math yet, start there.
Workflow Architecture Overview
The full workflow has five logical stages:
- Trigger: A new COI arrives (email attachment, Google Drive upload, or form submission)
- Parse: Send the document to the COI ParseAPI and receive structured JSON
- Compliance check: Run logic against the parsed data to determine pass/fail
- Route: Split the workflow based on compliance status
- Act: Update your database, send notifications, trigger follow-ups
This is a single Zap with branching paths. Zapier's Paths feature (available on Professional and above plans) handles the conditional routing. The total step count is 8-12 steps depending on how many notification channels you configure.
Step 1: Choose Your Trigger
The trigger determines what starts the workflow. Three options work well for COI intake:
Option A: Gmail - New Attachment
If vendors email COIs to a designated address (e.g., [email protected]), use Gmail's "New Attachment" trigger. Configure it to watch a specific label or inbox. Set a filter for filename contains .pdf to avoid triggering on other attachments.
Configuration in Zapier:
- App: Gmail
- Trigger: New Attachment
- Label: (your COI intake label, e.g., "COI Submissions")
- Important: Gmail returns the attachment as a base64-encoded file - you will need to handle this in the webhook step.
Option B: Google Drive - New File in Folder
If vendors upload to a shared Google Drive folder, use the "New File in Folder" trigger. This works well for organizations that have a vendor portal that drops files into Drive.
Option C: Typeform / JotForm - New Submission
If you use a form for vendor onboarding with a file upload field, trigger on form submission. The file URL is typically available directly as a field in the Zapier trigger output. This is often the cleanest trigger because you also capture vendor metadata (name, email, project) in the same submission.
Step 2: Send to COI ParseAPI (Webhooks by Zapier)
Webhooks by Zapier lets you make HTTP requests to any API. This is the step that sends the COI document to COI ParseAPI for parsing.
Webhooks by Zapier - POST
- URL:
https://api.coiparseapi.com/v1/parse - Payload Type: Form (multipart/form-data)
- Data - file: Map to the attachment/file URL from your trigger step
- Data - vendor_id: Map to vendor ID or email from trigger metadata
- Data - requirements_profile: Your requirement profile ID (e.g.,
standard_contractor) - Headers - Authorization:
Bearer YOUR_API_KEY
If your trigger provides a file URL rather than binary content, use the URL field in the request body and let the API fetch the document directly. The parse endpoint accepts both file uploads and URLs to publicly accessible documents.
The API response will be a JSON object. Here is a representative structure:
{
"parse_id": "parse_abc123",
"vendor_id": "vendor_456",
"status": "completed",
"compliance_score": 72,
"compliance_status": "NON_COMPLIANT",
"fields": {
"certificate_holder": "Your Company LLC",
"cgl_per_occurrence": 1000000,
"cgl_aggregate": 2000000,
"umbrella_per_occurrence": 2000000,
"wc_statutory": true,
"additional_insured": true,
"waiver_of_subrogation": false,
"policy_expiration": "2026-12-31"
},
"failures": [
{
"field": "cgl_per_occurrence",
"required": 2000000,
"found": 1000000,
"message": "CGL per occurrence limit is $1,000,000. Required: $2,000,000."
},
{
"field": "waiver_of_subrogation",
"required": true,
"found": false,
"message": "Waiver of subrogation endorsement not found."
}
]
}
Step 3: Map the Response Fields
Zapier automatically parses JSON responses from webhook steps. In subsequent steps, you can reference fields using dot notation: Parse COI > compliance_status, Parse COI > fields > cgl_per_occurrence, Parse COI > failures > 0 > message.
The failures array is the key output. Each item in the array contains the specific field that failed, what was found, what was required, and a human-readable message. You will use these messages directly in rejection emails.
Handling the failures array in Zapier: Zapier maps array items as numbered fields. failures__0__message, failures__1__message, etc. For the rejection email, concatenate up to 5 failure messages using a Formatter step (Utilities - Line Itemizer) or a Code step.
Step 4: Format Failure Messages (Formatter by Zapier)
Before branching, clean up the failure messages into a readable block for the rejection email. Add a Formatter step:
Formatter by Zapier - Utilities - Line Itemizer
- Line Item Values: Map each failure message field:
failures__0__message,failures__1__message,failures__2__message(add as many as your maximum expected failures) - Separator: Line break (\\n) or bullet character
- Output: A single string with all failure messages joined, blank items omitted
Alternatively, use a Code by Zapier step (JavaScript) for more control:
const failures = inputData.failures_json
? JSON.parse(inputData.failures_json)
: [];
const failureList = failures
.map(f => `- ${f.message}`)
.join('\n');
return {
failure_count: failures.length,
failure_summary: failureList || 'No specific failures identified.'
};
Step 5: Paths - Route Based on Compliance Status
Add a Paths step. Create two paths:
Path A - Compliant: Filter condition: compliance_status exactly matches COMPLIANT
Path B - Non-Compliant: Filter condition: compliance_status does not exactly match COMPLIANT
You can also add a third path for NEEDS_REVIEW status if you want to flag ambiguous certificates separately from clear failures.
Step 6A: Compliant Path Actions
When a COI passes compliance, you want to:
Google Sheets - Update Spreadsheet Row (or Create Row)
- Spreadsheet: Your COI tracking sheet
- Row identifier: Vendor ID or email
- Fields to update: Compliance Status = "Compliant", Last COI Date = today, Expiration Date =
fields__policy_expiration, CGL Limit =fields__cgl_per_occurrence, Umbrella =fields__umbrella_per_occurrence
Gmail - Send Email
- To: Vendor email (from trigger metadata)
- Subject: COI Approved - [Vendor Name]
- Body: "Your certificate of insurance has been reviewed and meets our requirements. Your records have been updated. No further action is needed at this time. Your policy expiration on file is [expiration date] - please submit a renewal certificate before that date."
Step 6B: Non-Compliant Path Actions
This is where the specific, fast rejection notices get sent - the key to driving down resubmission cycles. See our non-compliance reduction guide for why fast, specific feedback matters.
Gmail - Send Email (Rejection Notice)
- To: Vendor email
- Subject: Action Required: COI Does Not Meet Requirements - [Vendor Name]
- Body (template):
Subject: Action Required: Your Certificate of Insurance Needs Updates
We have reviewed your certificate of insurance submission and found the following items that do not meet our requirements:
[failure_summary from Step 4]
Please contact your insurance broker to address these items and resubmit an updated certificate. If you have questions about our requirements, reply to this email and we will clarify.
Google Sheets - Update Row
- Compliance Status: "Non-Compliant - Action Required"
- Failure Summary:
failure_summary - Last Review Date: today
- Rejection Count: increment (use a formula in the sheet, or use a Code step)
Slack - Send Channel Message
- Channel: #coi-compliance or #operations
- Message: "COI rejected for [vendor name]. [failure_count] issues: [failure_summary]. Rejection notice sent automatically."
Step 7: Expiration Date Alerts
After the main workflow, set up a separate Zap for expiration monitoring. Zapier's Schedule trigger fires daily and you can query your tracking spreadsheet for upcoming expirations.
Architecture
- Trigger: Schedule by Zapier - Every day at 8am
- Step 1: Google Sheets - Get Many Spreadsheet Rows (filter: expiration date within 45 days, compliance status = "Compliant")
- Step 2: Looping by Zapier (Professional plan) - iterate over each expiring row
- Step 3: Gmail - Send renewal reminder to vendor with specific expiration date and instructions
- Step 4: Google Sheets - Update row: "Renewal Reminder Sent" date = today
This handles the expiration tracking that manual spreadsheet management always eventually fails at - especially when the person who maintains it takes a vacation or changes jobs. See the full automatic expiration tracking guide for additional approaches.
Using Airtable Instead of Google Sheets
Airtable offers better relational structure for COI tracking than Google Sheets. If you use Airtable:
- Create a Vendors table and a COI Submissions table linked by vendor ID.
- Each parse creates a new record in COI Submissions with the full parsed data.
- The Vendors table shows the most recent compliant COI status via a rollup field.
- Airtable's built-in views give you a "Expiring within 30 days" filtered view without any additional Zap setup.
Zapier has native Airtable actions - use "Create Record" for new submissions and "Update Record" to update vendor compliance status.
Make.com (Integromat) as an Alternative
Make.com offers more powerful workflow logic than Zapier for complex routing scenarios, and is generally cheaper at higher operation counts. The architecture is identical - trigger, webhook, parse response, route, act - but Make.com's visual flow editor handles branching more intuitively than Zapier's linear step model.
Key Make.com advantages for this workflow:
- Native JSON parsing with array iteration - no Code step needed for failure message formatting
- Iterator module handles the
failuresarray elegantly - Aggregator module reassembles array items into a formatted string
- Lower cost at higher volumes (operations pricing vs task pricing)
Make.com is the better choice if you are processing more than 2,000 COIs per year through the automation, or if you need more complex conditional logic than Zapier's Paths can handle.
n8n: The Self-Hosted Option
For organizations with data sovereignty requirements or very high volumes, n8n is an open-source workflow automation platform you can self-host. The workflow logic is identical - n8n has HTTP Request nodes (equivalent to Webhooks by Zapier), conditional routing, email sending, and spreadsheet integrations.
Self-hosting n8n on a $10-20/month VPS eliminates per-task pricing entirely. For a compliance-sensitive organization that processes thousands of COIs and wants full control over where the data flows, n8n is worth the setup investment. The learning curve is steeper than Zapier but the flexibility ceiling is much higher.
What No-Code Cannot Do
Be honest about the limitations of this approach before you invest in building it.
Complex endorsement language review: The parsing API can detect whether an additional insured endorsement exists and what form it uses. It cannot read a manuscript endorsement with unusual carve-outs and determine whether it satisfies your specific requirements. Those edge cases still need a human.
Multi-document correlation: Some vendor situations require correlating data across multiple documents - the certificate, a separate endorsement page, a state WC exemption certificate. No-code workflows handle single-document flows well. Multi-document correlation is harder and usually requires a custom integration.
Stateful vendor logic: "This vendor has been non-compliant for more than 30 days and has a $50K open work order - escalate to the project manager." That kind of stateful, context-aware routing requires more than a simple Zapier flow. It requires a database with vendor history and a more sophisticated decision layer.
The Zapier workflow described above handles the 80-85% of COI processing that is routine and repetitive. It eliminates the labor cost for those cases and gets failures back to vendors the same day instead of three days later. That alone, per the ROI analysis, pays for the workflow setup many times over within the first year.
For teams that have outgrown no-code and need a full custom integration, see our technical guide to COI PDF API integration. For teams that also use Procore, the same parsed data can be pushed programmatically into Procore - see our Procore vs. API-first comparison for how that integration works.