Guides

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 complaintsBlock list entries, enforced on every send
Contacts, names, custom fieldsContacts with attributes
Lists, audiences, groups, tagsContact tags — target them with a segment
Email templatesRe-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.

PlatformContactsSuppressions
MailchimpAudience → Export AudienceIncluded in the audience export as cleaned / unsubscribed
KlaviyoProfiles → ExportProfiles → Suppressed profiles → Export
BrevoContacts → ExportContacts → Blocklisted, or the blacklisted column
MailerLiteSubscribers → ExportFilter by unsubscribed / bounced / junk
ActiveCampaignContacts → ExportFilter by Unsubscribed and Bounced
OmnisendAudience → ExportFilter by unsubscribed / nonSubscribed
SendGridMarketing → Contacts → ExportSuppressions → each of bounces, blocks, spam reports, global unsubscribes
ResendAudiences → ExportThe 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.

On this page