> ## Documentation Index
> Fetch the complete documentation index at: https://watchmycover.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Importing from CSV

> Bring in the subcontractors you already track from Excel or Google Sheets: the template, every column, accepted formats, limits and common mistakes.

If you already keep subcontractors in a spreadsheet, importing it is the fastest way in. Each row becomes a vendor, and a row with an expiry date and at least one limit also gets a certificate record, so it is checked against your requirements as soon as the import finishes.

<Card title="Download the CSV template" icon="file-csv" href="https://watchmycover.com/templates/watchmycover-subcontractors-template.csv">
  The 17 column headings the importer reads without any correcting, with three example rows. Delete the example rows before you import.
</Card>

## How to import

<Steps>
  <Step title="Save your spreadsheet as CSV">
    In Excel: **File → Save As → CSV**. In Google Sheets: **File → Download → Comma-separated values**. Title rows above your headings are fine: the importer looks for the heading row in the first 15 rows.
  </Step>

  <Step title="Open the importer">
    Go to **Vendors** and choose **Import**, or use step 3 of onboarding. The dialog is **Import vendors from a spreadsheet**. Choose **Choose a CSV file**.
  </Step>

  <Step title="Check what was read">
    Nothing is saved yet. The preview shows counts for **Rows read**, **No email**, **No expiry date**, **No limits** and **Need checking**, a sample of the first 20 rows with any notes, and rows further down the file that need checking.

    Under **What each column was read as**, each field WatchMyCover imports shows the heading it was read from. If one is wrong, choose the right heading, or **Not imported**. The preview is read again with your correction.
  </Step>

  <Step title="Choose a project and requirements">
    **Assign to a project** is optional. Without it, every imported vendor has to be assigned by hand. The project is chosen here, not in the file.

    **Insurance requirements to apply** starts on your default template. Every imported vendor is checked against it.
  </Step>

  <Step title="Import">
    Choose **Import *n* vendors**. The confirmation says how many vendors were added and updated. Any row that could not be written stays on screen with the reason.
  </Step>
</Steps>

Importing sends no email. Subcontractors are only emailed once you [switch chasing on](/docs/chasing/how-chasing-works).

## Column reference

These are the headings in the template, in order. Only **Company Name** is strictly required; **Email** is needed for chasing. Leave any other cell blank when you do not know it.

| Column                         | Required          | What it becomes                          | Format and notes                                                                                                                                                 |
| ------------------------------ | ----------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Company Name**               | Yes               | Vendor name                              | A row with no company name is skipped, as are rows named Total, Totals, Subtotal or Grand total. Cut to 160 characters. Used to match existing vendors.          |
| **Trade**                      | No                | Trade                                    | Cut to 80 characters.                                                                                                                                            |
| **Contact Name**               | No                | Contact name                             | Cut to 120 characters.                                                                                                                                           |
| **Email**                      | For chasing       | Contact email                            | If a cell holds several addresses, the first valid one is used. A row with no usable email is imported, but nobody can be asked for a renewal until you add one. |
| **Phone**                      | No                | Contact phone                            | Not used for chasing.                                                                                                                                            |
| **Insurer**                    | No                | The certificate's insurer                | Blank is recorded as "Not stated in spreadsheet".                                                                                                                |
| **Policy Number**              | No                | The certificate's number                 | One number per row.                                                                                                                                              |
| **Expiration Date**            | For a certificate | Expiry date of every coverage in the row | Month first, as `12/31/2027`, or `2027-12-31`. See [Dates](#dates).                                                                                              |
| **GL Each Occurrence**         | No                | General Liability each-occurrence limit  | See [Amounts](#amounts).                                                                                                                                         |
| **GL Aggregate**               | No                | General Liability aggregate limit        |                                                                                                                                                                  |
| **Workers Comp Each Accident** | No                | Workers' Compensation limit              | The employers' liability each-accident figure. "Statutory" is not an amount and is not recorded.                                                                 |
| **Auto Combined Single Limit** | No                | Automobile Liability limit               |                                                                                                                                                                  |
| **Umbrella Each Occurrence**   | No                | Umbrella / Excess each-occurrence limit  |                                                                                                                                                                  |
| **Umbrella Aggregate**         | No                | Umbrella / Excess aggregate limit        |                                                                                                                                                                  |
| **Additional Insured**         | No                | Evidence for every coverage in the row   | See [Endorsement columns](#endorsement-columns).                                                                                                                 |
| **Waiver of Subrogation**      | No                | Evidence for every coverage in the row   |                                                                                                                                                                  |
| **Primary & Non-Contributory** | No                | Evidence for every coverage in the row   |                                                                                                                                                                  |

Your own headings are recognized too, for example Vendor, Subcontractor, Carrier, Exp Date, GL Each Occ, WC, Excess, AI, WOS or PNC, and you can correct any column in the preview.

## What an imported certificate looks like

A certificate is created for a row only when it has an **Expiration Date** and at least one limit. Then:

* Every coverage with a limit in the row is recorded, with the row's single expiry date.
* The effective date is taken as 365 days before the expiry date, or the import day if that is later.
* The issue date is the import day.
* The certificate is noted "Imported from a spreadsheet (row *n*)".

A row with no expiry date or no limits adds the vendor with no certificate, so it shows as **No certificate** (or, if its template is missing, **Non-compliant**) until you record one.

<Note>
  The spreadsheet can only say so much. Check the imported figures against the actual certificates when they come in, and [record each certificate](/docs/certificates/recording) properly: it gives each coverage its own dates and records endorsement forms you hold.
</Note>

## Amounts

Accepted: `$1,000,000`, `1000000`, `1M`, `1.5M`, `1MM`, `500K`. Also Excel's scientific notation (`1E+06`) and space- or dot-grouped thousands (`1 000 000`, `1.000.000`).

* Words such as `Statutory`, `N/A`, `None`, `TBD`, `See attached`, `Per contract` or `See COI` are not an amount. No limit is recorded for that coverage, and the row is flagged if the cell had text.
* A cell holding two amounts, such as `$1,000,000 / $2,000,000`, uses the first and is flagged. Put the aggregate in its own column.
* An amount under \$1,000 is flagged as not a realistic limit.
* An amount over \$1,000,000,000 is not recorded.
* A date in a money column is not read as money.

## Dates

* Month first: `12/31/2027`, `12-31-2027`, `12.31.2027`, or with a two-digit year, `12/31/27` (years 00–69 are read as 2000s).
* ISO: `2027-12-31`.
* Written months: `31-Dec-2027`, `Dec 31, 2027`.
* Excel date serial numbers.

A cell that cannot be read as a single date, such as a policy period `3/15/26 - 3/15/27`, is flagged "Could not read … as a date", and the row gets no certificate. If a row has several expiry columns (GL Exp, WC Exp), the earliest date is used for the whole row, because that is the one that decides compliance. Columns about licenses, contracts, bonds, permits, experience mods, effective dates or issue dates are not treated as expiry dates.

<Warning>
  Dates must be month first. A day-first date such as `31/12/2027` is rejected because there is no month 31, but `03/04/2027` is read as March 4, not April 3. If your spreadsheet uses day-first dates, reformat the column as `2027-12-31` before exporting.
</Warning>

## Endorsement columns

The three endorsement columns apply to every coverage in the row.

| Cell                                                     | Recorded as               |
| -------------------------------------------------------- | ------------------------- |
| `Yes`, `Y`, `X`, `True`, `1`, `✓`, `Included`, `On file` | **Stated on certificate** |
| `No`, `N`, `False`, `0`, `-`, `None`, `Missing`          | **Not on certificate**    |
| Blank, or anything else                                  | **Stated on certificate** |

An import never records **Endorsement form on file**, even when the cell says "On file": a spreadsheet is not the endorsement. So a vendor whose template requires an endorsement will show **Needs review** after import until you record the endorsement form. Write `No` when the endorsement is missing; a blank cell is recorded as stated. See [Endorsements and evidence levels](/docs/requirements/endorsements).

## Re-importing and matching

* Vendors are matched by company name, ignoring capitalization. A matching row updates the vendor's trade, contact name, email and phone (blank cells change nothing) and applies the template you chose, rather than creating a duplicate.
* A row whose policy is already on file, with the same expiry date for a coverage in the row, adds no new certificate. Re-importing the same sheet does not replace certificates you have recorded by hand.
* A row with a newer expiry date adds a new certificate. An older certificate is set aside only if the new one fully replaces it; see [Renewals and several certificates](/docs/certificates/renewals).
* A row matching an archived vendor is not imported: "Matches an archived vendor. Restore it first to update it from a spreadsheet."

## Limits

* Up to **500 rows per file**. For a longer file the preview says only the first 500 will be imported; split the file and import each part.
* Files up to 4 MB.
* Your plan's vendor limit applies row by row. Rows past the limit are listed as "Your plan's vendor limit was reached".

## Common mistakes

<AccordionGroup>
  <Accordion title="Every vendor shows Needs review after import">
    The template requires endorsements and the spreadsheet can only record them as stated on the certificate. This is expected. Record the endorsement forms as they arrive, or let chasing ask the brokers for them.
  </Accordion>

  <Accordion title="Workers' comp shows as missing">
    The cell said "Statutory" or "Per statute", which is not an amount. Enter the employers' liability each-accident figure (for example `$1,000,000`) in **Workers Comp Each Accident**.
  </Accordion>

  <Accordion title="Vendors show as expired on the wrong day, or far in the future">
    Dates were day first. Reformat the column as `YYYY-MM-DD` and import again; rows already on file with the right expiry are left alone.
  </Accordion>

  <Accordion title="The limit column read an expiry date or a policy number">
    A heading such as "WC Exp" or "WC Policy #" is never read as a limit, but an unusual heading might be mapped to the wrong column. Correct the column in the preview before importing.
  </Accordion>

  <Accordion title="Rows were imported with no email">
    They show **No email on file** and are not chased. Open each vendor, choose **Edit**, and add the address, or fix the sheet and import again.
  </Accordion>

  <Accordion title="Duplicates after re-importing">
    The company name changed between sheets ("Acme Electric" and "Acme Electric LLC" are different names). Keep names identical, or archive the duplicate.
  </Accordion>
</AccordionGroup>
