List migration
Moving from one email provider to another — or keeping two in sync during a transition — usually means messy CSV exports and imports. OpenContact does it directly.
How it works
On the Connections page, pick a source list (on one connected provider) and a destination list (on another), and start the migration. OpenContact:
- Streams every contact out of the source list.
- Records each one in your canonical OpenContact contact store (tagged as a migration).
- Pushes it straight into the destination list.
It reports how many contacts were copied, excluded, skipped, and failed, so you have a clear result.
Check before you start
Once you’ve picked both lists, Check what will happen (or Check next to a list when moving a whole account) shows what the migration would do, without copying or creating anything:
- How many contacts the source list has.
- For the first 100 contacts, how many would be copied as subscribed, added as excluded, left out for never confirming, or fail as invalid addresses, with a few of the invalid ones as examples. A list of 100 or fewer is checked in full.
- Each custom field, and whether it already exists at the destination, will be created there, or can’t be copied.
- Whether tags arrive as tags or in a Tags field.
Who gets copied
A migration never makes someone mailable who wasn’t mailable at the source:
- Subscribed contacts are copied into the destination list.
- Unsubscribed, bounced, complained, or suppressed contacts are not added to the list. They are excluded at the destination instead (in Mailjet, excluded from campaigns), so a later import can’t bring them back by mistake. Their OpenContact status is updated to match.
- Contacts who never confirmed consent, such as Mailchimp’s pending (unconfirmed double opt-in) and transactional members, are skipped.
- Mailchimp, Mailjet, Brevo, MailerLite, Klaviyo, ActiveCampaign and Kit report each contact’s status. A source that doesn’t report one has its contacts copied as before.
- Klaviyo profiles that never subscribed but aren’t suppressed can still receive Klaviyo email, so they are copied.
Custom fields
When the source can describe its fields and the destination can create them, the migration copies every custom field, not just the name:
| Copies fields out | Creates fields in | |
|---|---|---|
| Mailchimp | Yes (merge fields) | Yes (text, number or date merge fields in the audience) |
| Mailjet | Yes (contact properties) | Yes (contact properties) |
| Brevo | Yes (plain attributes) | Yes |
| MailerLite | Yes | Yes |
| Kit | Yes | Yes (as text) |
| ActiveCampaign | Yes | Yes (text or date) |
| Klaviyo | Yes (profile details and properties) | Yes (profile properties) |
- Each source field becomes a destination field of a matching type. Fields that already exist at the destination, matched by name, are reused, and values are converted to their type.
- Mailchimp address fields are split into separate fields, such as
address_cityandaddress_country. - Mailchimp limits how many merge fields an audience can have. A field it refuses is left out, and the rest of the migration carries on.
- Klaviyo properties have no fixed list, so the migration learns them from the first few hundred profiles in the list. A property that only appears on later profiles isn’t copied.
- A value that doesn’t fit its field’s type (for example, text in a number field) is left out, so the contact is still copied.
For other pairs of tools, only the email address and name are copied.
Tags and groups
Tags travel with each contact:
- Read from Mailchimp (tags, plus each group a member picked, written as “Group: Option”) and ActiveCampaign (contact tags). Contacts moved from an OpenContact list keep their tags too.
- Added as tags in Mailchimp (on the audience member), ActiveCampaign and Kit. Missing tags are created, matched by name without regard to case.
- Everywhere else, such as Mailjet, Brevo, MailerLite and Klaviyo, the tags are copied into a text field called
tags(for example “VIP, Webinar 2026”), so you can build segments from it.
Saved segments aren’t copied. Rebuild them in the new tool from the tags or fields they use.
Moving a whole account
To switch tools completely, use Move a whole account on the Move contacts page:
- Choose the tool to move from and the tool to move to.
- Each list is matched to the destination list with the same name. Pick another list, or Don’t move, where that’s not right. Create any missing lists in the destination tool first, then refresh the connection so they show up.
- Check the total and confirm the destination plan can take it, then start the move.
The lists move one at a time, so the two tools’ rate limits are only shared by one list. Each list shows in the history as waiting until its turn. Pausing a list pauses the lists after it too, until you resume it. If one list fails, the next one still starts.
Someone who is in several lists is still one contact in OpenContact. In tools that keep one contact per person (Mailjet, Brevo, Klaviyo and others), that person is one contact there too, added to each list. That means the destination count can be lower than the total you see before the move. Someone who opted out of any list is excluded everywhere in tools with account-wide exclusion, such as Mailjet.
While it runs
Migration records contacts into OpenContact without firing your sync rules or verification — it’s a direct copy, not a re-processing event, so it won’t set off welcome flows or double-send.
When contacts fail
A contact the destination refuses doesn’t stop the migration. It’s counted as failed and kept with the reason, and so is an address that isn’t a valid email, which is never sent. When the migration finishes, its row in the history offers:
- Download failed contacts (CSV), with each email and the reason it failed.
- Retry failed contacts, which copies just those contacts again from what was saved when they failed, without reading the source again. Fix the cause first, for example by raising the destination’s contact limit. A contact that fails again stays on the list.
When to use it
- Switching providers — move your audience from, say, MailerLite to Mailjet without losing anyone.
- Consolidating — pull several lists into one place.
- Seeding a new tool — populate a freshly connected provider from an existing one.
After migrating, your sync rules keep both sides consistent going forward, and suppression stays honored across both.
Still stuck?
Send us your project ID and what you saw. Contact support.