Importing contacts
There are three ways to get contacts into a list. CSV import is the one people re-run over time — worth knowing exactly what happens the second time you upload the same file.
On this page
Creating a list
A list is just a name — 2 to 120 characters. Creating one from the Lists page's Import CSV button or from quick-add takes you straight to that list, whether or not you attached a file.
CSV import
The importer parses your file entirely in the browser (nothing is uploaded until you click Import) and tries to auto-map columns to Email, First Name, Last Name, and Company based on common header spellings.
Import CSV
Upload and map contacts
Match CSV headers to core fields. Unmapped columns are preserved as custom fields.
Map headers
First Name
Last Name
Company
- Mapping an Email column is mandatory — Import is blocked without it.
- Any column you leave as "Do not map" is saved on each contact as a custom field, keyed by its original CSV header.
- Before importing, choose how to handle contacts already in this list: Update existing contacts (the default) merges the row's fields onto the existing contact — see Re-importing: what actually happens below. Skip existing contacts instead leaves them completely untouched; only emails genuinely new to this list get written.
- A row is skipped rather than imported for any of six reasons, each counted in the import summary and listed with its email in a "Skipped rows" panel: "Missing email" (blank in the mapped column), "Invalid email format", "Duplicate in file" (the same email appears more than once in this upload), "Suppressed" (the email is on this workspace's suppression list), "Already exists" (only possible when Skip existing contacts is selected), and "Contact is deleted" (the email matches a previously deleted contact, which is never silently restored by an import).
- Import runs as one call, capped at 5,000 rows; a larger file only imports the first 5,000.
Re-importing: what actually happens
Every contact is identified by workspace + email — importing a CSV finds or creates that contact, then merges the row's fields onto it rather than overwriting wholesale. This is what happens under the Update existing contacts setting (the default). Choosing Skip existing contacts bypasses this merge entirely for any email already in the list — that row is skipped with reason "Already exists," and nothing about the existing contact changes.
Re-importing is safe: a field only changes if the new row actually has a value for it. If a column is unmapped, or a specific row's cell is blank, ForgeSend leaves whatever is already on the contact untouched — it doesn't get blanked out just because this import didn't mention it. This applies to first name, last name, company, and custom fields alike, so a previous import's or Lead Finder's data survives a later, less-complete CSV re-import.
The single-contact Add contact form works the same safe way — it only ever writes email, first name, last name, and company, and even those only update when you actually type a value, so it's safe to use on an already-enriched contact without wiping anything.
Manual add and quick-add
Two entry points add one contact at a time, both requiring only an email:
- Add contact on a list's own page — a simple modal, adds directly to that list
- Add contact on the Lists page (quick-add) — a 2-step flow: choose an existing list or name a new one first, then enter the contact, then it navigates you straight into that list
Choose a list
Select which list to add the contact to.
Editing a contact
Clicking a contact's email (or "+ Add email" if it has none) opens an edit modal for name, company, and email. Saving is not purely cosmetic:
- Changing the email resets verification status — it's cleared back to unverified, since the old verdict no longer applies to the new address.
- A duplicate email within the same list is rejected outright: "A contact with this email already exists in this list."
- Two non-blocking warnings can appear after a successful save: "This email is suppressed in your workspace. Future sends will be skipped." and/or "This contact is in N active campaign(s). Future queued sends will use the new email." Both are informational — the save has already gone through by the time you see them, and the modal only auto-closes when there are none.
- The same modal has a Verify email action — see Verification.
Related docs
Next: Tags and custom fields