By Theo Brandt ยท Updated

Migration guide

Migrating Email Platforms: A Complete Guide for SaaS

Move consent first, billing and receipts second, lifecycle journeys third, and keep the old tool alive until the last one is proven.

To migrate a SaaS email platform safely, move things in this order: suppression and consent data, sending-domain authentication, billing and transactional mail, lifecycle journeys, and newsletters last. Run both tools side by side for at least as long as your longest sequence, send new signups only through the new one, and cancel the old account after its data retention window has passed. The sections below give the checklist, the vendor-specific traps found in their documentation, and a four-week schedule.

Prices checked 7 October 2026; each price links to the vendor page it came from. We compare tools by reading vendor docs and pricing pages and have not performed these migrations ourselves, so treat the schedule as a planning template.

First decide whether to move

A migration costs weeks of attention and a short period of double running, so it needs a reason you can state in one line. The common ones are a bill that jumps as the list grows, a missing capability, and a data model that does not match your product. Here are three bills that make people look. Klaviyo's Email plan reads $150 at 10,000 active profiles and $400 at 25,000. Mailchimp Standard reads $135 for 5,001 to 10,000 contacts and $310 for 20,001 to 25,000. HubSpot's feature table allows up to 10 automated actions on Starter and unlimited from Professional at $800 a month.

LeavingCurrent price at 10,000 peopleMoving toNew price at 10,000 people
Klaviyo Email$150Loops$99 (9,998 subscribers)
Mailchimp Standard$135Customer.io Essentials$145 (10,000 profiles)
Mailchimp Standard$135Resend marketing Pro$80 (10,000 contacts)

Price alone rarely justifies the move: Customer.io at $145 is above Mailchimp's $135 here, and you would be paying for behavior-driven journeys rather than a lower bill. If the case rests on features, read Mailchimp alternatives, Klaviyo alternatives or Customer.io vs Loops first, and see the pricing guide for the wider price list.

Inventory what you have

Before touching the new tool, list every object in the old one. This table is the minimum for a SaaS product, with the trap for each.

ObjectHow it leavesTrap
People and attributesCSV exportAttribute names that differ in the new tool; dates in another format
Unsubscribes, complaints, hard bouncesSeparate suppression exportsForgetting them and mailing opted-out people
Journeys and automationsRebuild by hand from a written specHidden waits and exit conditions
TemplatesCopy HTML and shared blocksMerge tags with different syntax
SegmentsRebuild as rulesSegments that depend on engagement data you cannot import
Webhooks and API calls in your codeSearch the repositoryA forgotten cron job still posting to the old API
Sending domain recordsDNSRemoving old DKIM records too early
Reports and event historyExport before cancellingRetention windows that expire

Vendor-specific traps from the docs

Customer.io. Its billing docs say a profile that exists at any point in the month counts toward that month's bill, even if you delete it. A trial import of your full list that you delete the next morning is therefore still billed, so test with a few hundred people. The pricing page also lists US and EU data centers, so decide the region before you import. Essentials is $100 a month at 5,000 profiles, and managed deliverability is not part of that plan.

Loops. According to its events docs, an event creates a contact if no contact matches, and addresses at @example.com or @test.com fire events without sending mail. That makes a replay of old signup events safe on staging. The free plan sends only to the 1,000 newest contacts, so a full-list test should wait for a paid plan.

HubSpot. The contacts API docs say lifecycle stage can only move forward unless the existing value is cleared first, that batch calls are limited to 100 records, and that enumeration properties need internal names, not labels. An import script that sets lifecycle stage on contacts that already have one will quietly fail for some of them.

Postmark. Its pricing page lists a 45-day default data retention, with custom retention available up to 365 days from $5 a month. If you are leaving Postmark, export message activity before the window closes.

Move Stripe webhooks without a gap

If your old platform receives billing events, the cleanest approach is to add a second endpoint rather than swap one. Stripe's webhook docs allow up to 16 event destinations, give each endpoint its own signing secret, and retry live-mode deliveries for up to three days. Register the new handler while the old one keeps running, and both receive the same events during the overlap.

Test it locally with the Stripe CLI listener before pointing it at production, and log event IDs, because Stripe says endpoints may receive the same event twice. The docs also say you can resend an event from the dashboard for up to 15 days and from the CLI for up to 30 days, which helps if the new endpoint was down during cutover. Delete the old endpoint only after the last journey that depended on it has moved.

Protecting deliverability

Authenticate the sending domain on the new platform before sending anything: SPF, DKIM and DMARC records as that vendor instructs, added alongside the old ones. Keep the old records until the old tool has sent its last message. Reputation belongs to your domain, so a clean history makes the move easy and a poor one follows you.

Warm-up applies only when you take a dedicated IP. Postmark lists them for customers sending 300,000 emails a month or more, from $50 a month per IP on Pro or higher; Mailgun lists extra IPs at $59 a month; Resend's pricing page lists dedicated IPs at $30 a month on Scale for customers above 3,000 emails a day; Amazon SES lists a standard dedicated IP at $24.95 a month. On shared pools, start by sending the most engaged segment first and watch bounces and complaints for a week before moving the rest. If your new sender is SES, set up bounce and complaint feedback first, since AWS says you must use either feedback notifications or event publishing to track them.

A four-week schedule

This is an example plan we wrote, not a measured result. Compress or stretch it to fit your number of journeys.

WeekDo thisDone when
1Inventory, written journey specs, domain authentication, suppression importA test send authenticates and every suppressed address is blocked
2Import people, rebuild receipts and resets, register the second Stripe endpointA test signup produces the same events in both tools
3Rebuild trial, failed-payment and onboarding journeys; route new signups to the new toolEach journey has run end to end for a test account
4Move newsletters, drain old in-flight sequences, remove the old webhookThe old tool sends nothing for seven days

For people already in the middle of a sequence, either let them finish in the old tool or enrol them at the equivalent step in the new one. Never do both. Pick one rule per journey and write it down.

Checks before you cancel

  • People counts match, within the suppressed addresses you deliberately left out.
  • An opt-out in the new tool blocks a receipt-adjacent marketing send, and a receipt still goes out to someone who opted out of marketing.
  • Every webhook in your code points at the new endpoint, found by searching the repository for the old vendor's domain.
  • Reports and event history you need are exported.
  • The old account's retention window has passed or its data is saved.
  • The integrations in your stack are reconnected, which the integrations guide walks through.

Mistakes that cause the most trouble

Importing everyone as subscribed. Import the suppressed list first and mark those addresses as unsubscribed, so a new-platform send cannot reach them.

Double sending in the overlap. If a trial reminder exists in both tools, someone gets it twice. Route new signups through one tool and disable the other's trigger the day you move it.

Judging the new tool by opens. Compare delivery, bounce and complaint figures between the tools, and the share who reach the key action, since open rates are counted differently by each vendor.

Cancelling too soon. Keep the old tool until the last export is saved. Not having an old export to compare against is the most common regret.

Verdict

Move consent first, billing and receipts second and journeys third, run two Stripe endpoints during the overlap, and keep the old account until its retention window passes. If the move is about price, read the numbers above before committing, because the cheapest tool at 10,000 people is not always the cheapest once you add rebuild time. Teams still choosing a destination can start with how to choose a SaaS email platform.

Frequently asked questions

How long does it take to migrate a SaaS email platform?

Plan around your longest-running sequence rather than your list size. Importing people is usually an afternoon, but rebuilding a trial journey, a failed-payment flow and an onboarding series, and then running them beside the old ones, is what takes weeks. A four-week schedule is a reasonable starting assumption if you have under ten live journeys; add time for each channel beyond email.

Do I need to warm up a new IP when I change platforms?

Usually not, because most SaaS teams send from a shared pool and keep their own sending domain, so the domain's history travels with you. Warm-up matters if you buy a dedicated IP. Postmark lists dedicated IPs for customers sending 300,000 emails a month or more, from $50 a month per IP on Pro or higher, and Amazon SES lists a standard dedicated IP at $24.95 a month.

What happens to unsubscribes and bounces when I switch?

They do not move on their own. Export the unsubscribe, complaint and hard-bounce lists from the old tool and import them as suppressed before you import anyone else, or the first send on the new platform may reach people who opted out. Keep the old account until its data retention window ends; Postmark's default is 45 days.

Which is the hardest part of leaving Mailchimp, Klaviyo or HubSpot?

Journeys, not contacts. Mailchimp and Klaviyo store automations in their own builders, and HubSpot workflows are tied to its contact properties, so each one has to be rebuilt by hand in the new tool. Contacts export as CSV. Write each automation down as trigger, wait, condition and exit before you start so that nothing relies on someone's memory.