Before you start
Prepare a.csv file with a header row and one column holding the email address. Other columns are optional. In the dialog you choose what each column is, so the headers can be named however you like.
The dialog suggests a mapping from each header:
email, Email Address and E-mail map to Email, first_name and First Name to First Name, last_name and Last Name to Last Name, status to Status, source to Source, and a header matching a custom field’s key or name maps to that field. Everything else starts as Skip.
Import a file
1
Upload
Click Import Contacts. Drop your file on Drop your CSV file here, or click to browse, or click to choose it. Only
.csv files are accepted. The dialog shows an approximate row count. Click Next.2
Review the columns
Check the Column Header, Maps To and Sample Value table and change any suggestion that’s wrong. Make sure a column is mapped to Email (required); the import won’t start otherwise.To put the contacts on a list, choose it under Add imported contacts to a list. Leave Don’t add to a list to import without one.
3
Record consent
Under Consent, answer Why are you allowed to email these contacts?:
- They opted in — signed up, ticked a box, or asked to hear from us
- Existing customers, similar products, opt-out offered every time
- Legitimate interest — business contacts in a relevant role
- Necessary to perform a contract with them
4
Import
Click Import. The results show how many contacts were imported or updated and how many were skipped (invalid email or duplicate).
What happens to existing contacts
Contacts are matched by email address (case-insensitive).- New address: a contact is created with the mapped name, source, status and custom fields.
- Existing address: the contact is kept. Mapped names and custom fields are updated; an empty cell leaves the current value alone. The source is not changed.
- Duplicate rows in the same file: the last row wins.
Status column
A column mapped to Status is read as follows (case doesn’t matter):
Any other value, or an empty cell, leaves the status alone. New contacts without a status are Active.
For contacts you already have, an import only ever stops mail: it can mark an Active or Pending contact as unsubscribed, bounced or complained, but it never makes an unsubscribed, bounced or complained contact Active again. A contact marked unsubscribed is unsubscribed from every list. Status changes appear in the contact’s status history with the source “import”.
Custom fields
Create the field under Settings → Custom Fields before importing; the dialog lists your custom fields under Custom Fields in each Maps To menu. Each cell is checked against the field’s type. A cell that doesn’t fit is skipped, and the rest of the row is still imported:- Number: must be a number.
- Boolean:
true,yes,y,1orfalse,no,n,0. - Date: must be a recognisable date, such as
2026-09-24. - Select: must be one of the field’s options (case doesn’t matter).
- JSON: must be valid JSON.
Put imported contacts on a list
Choose a list under Add imported contacts to a list in the column step. Every contact in the file is added to it, including contacts you already had:- Contacts already on the list keep their subscription on it. An import never re-subscribes someone who unsubscribed from the list.
- Contacts imported with the status pending join the list as pending.
- Contacts imported as unsubscribed are unsubscribed from every list, this one included.
Limits
To import programmatically, use the public API. See the API reference.
Troubleshooting
"CSV must have a column mapped to Email"
"CSV must have a column mapped to Email"
No column is mapped to Email (required). Go back to the column table and pick Email for the address column.
A column didn't import
A column didn't import
Check that the column is mapped to something other than Skip. For a custom field, check that the cells fit the field’s type; cells that don’t fit are skipped.
"Too many imports. Please wait before importing again."
"Too many imports. Please wait before importing again."
Your workspace has made two import attempts in the last hour, including any that were refused. Wait and try again, or combine your files into one.