CSV Import
You can import contacts in bulk by uploading a CSV file. A CSV (comma-separated values) file is a simple spreadsheet format that you can create and edit in Microsoft Excel, Google Sheets, or any spreadsheet application. The import creates new contacts and updates existing ones, assigns tags, records subscription consent, and validates data — all in a single operation.
Example: You collected business cards at a tradeshow. Download the blank CSV template, enter the contact info into the spreadsheet, add "Tradeshow 2026" in the tag column, save as CSV, and import it into Gordon CRM. Every contact is created with the tag applied, and you can optionally mark them all as subscribed.
How to Import
- Navigate to Contacts in the sidebar.
- Click the Import CSV button.
- Click Download blank template to get a CSV file with the correct column headers. Open it in Excel or Google Sheets to fill in your contact data.
- Fill in your contact data, save the file, and upload it.
- Configure import options (see below).
- Review the preview and click Import.
[SCREENSHOT PLACEHOLDER: CSV import dialog showing file upload, template download link, global tag field, and "Mark as Subscribed" toggle]
CSV Format
Your CSV file should include column headers in the first row. The only required column
is email — all others are optional.
| Column | Required | Description |
|---|---|---|
email | Yes | The contact's email address. Rows without a valid email are skipped |
first_name | No | First name |
last_name | No | Last name |
phone | No | Phone number |
birth_month | No | Birthday month (1–12). Must be paired with birth_day |
birth_day | No | Birthday day (1–31). Must be paired with birth_month |
tag1 | No | A tag to assign to this contact |
tag2 | No | A second tag |
tag3 | No | A third tag |
note1 | No | A note to attach to the contact |
note2 | No | A second note |
note3 | No | A third note |
Example CSV
email,first_name,last_name,phone,birth_month,birth_day,tag1,tag2,note1
jane@example.com,Jane,Doe,555-0101,3,15,VIP,Newsletter,Met at conference 2024
john@example.com,John,Smith,555-0102,,,Lead,,Referred by Jane
admin@acme.com,Admin,User,,,,Enterprise,Key Account,Import Options
When starting an import, you can configure two options:
| Option | What It Does |
|---|---|
| Global Tag | Assigns a single tag to every contact in the batch. Useful for labeling the source of an import (e.g., "Tradeshow 2026") |
| Mark as Subscribed | Subscribes all imported contacts to marketing emails with full consent proof. See Subscriptions & Consent for what this means |
How Existing Contacts Are Handled
The import matches contacts by email address within your workspace:
- New contacts (email doesn't exist) are created with all provided fields.
- Existing contacts (email already exists) are updated — but only non-empty CSV columns overwrite existing data. Blank columns are ignored, so you won't accidentally erase information.
Subscription Behavior
- If "Mark as Subscribed" is enabled and the contact is already subscribed, their original consent proof is preserved (not overwritten).
- If "Mark as Subscribed" is enabled and the contact is not yet subscribed, new consent proof is recorded.
- If "Mark as Subscribed" is disabled, subscription status is never changed.
Birthday Validation
Gordon CRM requires both birth_month and birth_day to be provided together:
- If you provide one without the other, the birthday is skipped and an error is logged for that row.
- Valid ranges: month 1–12, day 1–31.
- Invalid values (non-numeric, out of range) are skipped with an error — the rest of the contact's data is still imported.
Tag Handling
- Tags that don't already exist are created automatically.
- Tag matching is case-insensitive — importing "vip" when "VIP" already exists links to the existing tag.
- The first-seen casing is used for new tags created during import.
- Up to 3 per-row tags plus 1 global tag can be assigned per contact.
Error Handling
The import does not fail on individual row errors:
- Invalid rows (missing email, bad email format, invalid birthday) are skipped.
- A detailed error report is returned listing the row number and reason for each skip.
- All valid rows are still processed.
If a critical error occurs (database failure), the entire import rolls back — no partial data is saved.
Related
- Contacts — The main contacts page
- Tags — How tags work, including creation during import
- Subscriptions & Consent — How consent proof is recorded during import
- Technical Reference: Contacts — Upsert strategy, atomic transactions, and validation architecture