Migrate from another platform
Bring a company's block list, contacts and templates over from Klaviyo, Mailchimp, Brevo, MailerLite, ActiveCampaign, Omnisend, SendGrid or Resend.
Moving a company onto Send & Retain takes two CSV exports and about an hour. The order matters more than the mechanics: the block list goes first, before a single send.
This is a one-shot copy, not a sync. Nothing is written back to your old platform, nothing keeps flowing in, and your old account keeps sending until you turn it off yourself.
What comes across
| Becomes | |
|---|---|
| Unsubscribes, bounces, spam complaints | Block list entries, enforced on every send |
| Contacts, names, custom fields | Contacts with attributes |
| Lists, audiences, groups, tags | Contact tags — target them with a segment |
| Email templates | Re-authored as React templates on your brand |
What doesn't
- Engagement history. Opens, clicks and send history stay on the old platform. A contact who last opened in 2019 is cold here, whatever their list membership says.
- Automation logic. Flows are rebuilt, not imported — usually a good thing, since the rebuild is where the dead branches get dropped.
- Images. They stay hosted on the old platform until you move them. Cancel that account and every image in a migrated template breaks.
1. Export two files, not one
The contact list and the suppression list are separate exports on every platform, and the second one is the one that protects your domain.
| Platform | Contacts | Suppressions |
|---|---|---|
| Mailchimp | Audience → Export Audience | Included in the audience export as cleaned / unsubscribed |
| Klaviyo | Profiles → Export | Profiles → Suppressed profiles → Export |
| Brevo | Contacts → Export | Contacts → Blocklisted, or the blacklisted column |
| MailerLite | Subscribers → Export | Filter by unsubscribed / bounced / junk |
| ActiveCampaign | Contacts → Export | Filter by Unsubscribed and Bounced |
| Omnisend | Audience → Export | Filter by unsubscribed / nonSubscribed |
| SendGrid | Marketing → Contacts → Export | Suppressions → each of bounces, blocks, spam reports, global unsubscribes |
| Resend | Audiences → Export | The unsubscribed column |
2. Import the block list first
Block list → Import CSV. The file needs an email column; a reason or
status column is read if present.
Most platforms don't give you a separate suppression file — Mailchimp's
cleaned and unsubscribed members sit in the same audience export as its
subscribed ones. That's fine: the importer reads the status column per row and
leaves still-subscribed people alone, telling you how many it skipped. If
your file has no status column at all, every row is treated as a suppression —
so only feed it a file you know is a block list.
Do this before importing contacts. Re-mailing the addresses your previous platform had already given up on is the fastest way to burn a brand-new sending domain — those addresses are, by definition, the ones most likely to bounce or report spam.
Bounces and spam complaints from another platform are imported as manual blocks. They stop exactly the same sends as a bounce or complaint recorded here, but they stay removable — a complaint recorded natively never can be, and we won't create permanently unmailable addresses on the strength of a column in someone else's export. If a migrated contact genuinely complains once you start sending, the webhook records it properly then.
Plain unsubscribes are imported as opt-outs, not blocks, so a migrated customer still receives receipts and password resets — they opted out of marketing, not out of being a customer.
3. Import contacts
Contacts → Import CSV. An email column is required, external_id maps to
your app's own ids, and every other column becomes a contact attribute.
Drop the platform's bookkeeping columns before importing — Mailchimp's
MEMBER_RATING, OPTIN_IP, LATITUDE, LONGITUDE and friends become junk
attributes on every contact. Keep names, plan or tier, signup date and locale:
if an attribute wouldn't be used in a template or a segment, it's noise.
Import your unsubscribed and bounced people too. Step 2 already blocks them, and keeping them makes your numbers honest and stops a later re-import quietly re-mailing them.
Pause any automation with a segment-entry trigger before a bulk import. An import evaluates segment membership per contact, so a live segment-entry flow will enroll everyone you just imported and start mailing them.
4. Rebuild templates and flows
Take the copy, the merge fields and the image URLs from the old templates; leave the HTML behind. Drag-and-drop builders emit nested-table markup that converts badly and defeats brand tokens — starting from a starter template on your brand gives a better result faster. See Create a template.
Translate merge tags as you go: Mailchimp's *|FNAME|* and Klaviyo's
{{ first_name }} become {{firstName}}, declared in the template's variables
with a fallback. Delete the old platform's unsubscribe footer — Send & Retain
generates its own, and the old one is a live link back to their platform.
5. Warm up before volume
A migrated list on a fresh domain is the riskiest combination there is: a large, engaged-looking list and no sending reputation. Ramp over about two weeks, transactional first, and enable lifecycle sequences one at a time. A daily send cap is a useful hard ceiling during the ramp. See Manage suppressions and Connect a provider.
Getting your data back out
Both lists export to CSV from the same pages, in the same shape the importer reads. There's no lock-in here and no export request to file.