Migrating From Klaviyo to a SaaS-First Email Tool

The export that matters most when you leave Klaviyo is the suppressed list. Here is the full move in the order that keeps opt-outs safe.

The Pombo team ·

The contacts are the easy part. When a SaaS team starts migrating from Klaviyo, the export that matters most is the one people tend to forget: every profile Klaviyo has suppressed, from people who unsubscribed to addresses that stopped accepting mail. Bring those across wrong and the first email from the new tool goes to people who opted out, or to addresses that will bounce. This guide is for the founder or developer who wants to migrate from Klaviyo with a software product's email intact, and it walks the move in the order that keeps that from happening. (Coming from Mailchimp instead? The Mailchimp migration guide covers its exports.)

What to export before migrating from Klaviyo

Do every export before you touch the new tool, and keep the files. Klaviyo's Settings, Other, Downloads page only lists exports from the last 30 days.[1]

  1. Profiles. Open each list or segment you want to keep under Audience, Lists and segments, choose Manage list or Manage segment, then Export to CSV.[1] Klaviyo's guide names Email Marketing Consent Timestamp as a property to include.[1] Add the consent status itself and any custom properties you use.
  2. Suppressed profiles. Go to Audience, Profiles and choose View suppressed profiles.[1] Clear any suppression reason filters so you get the full list,[1] then export it. This is the file you cannot skip.
  3. Templates. Export each template's HTML and save it for the new tool.[1] You only need the ones in active flows or recent campaigns.
  4. Flows. Write each flow down: its trigger, its delays, its filters and which email goes at each step. Set old flows to draft rather than deleting them, because a deleted flow and its data cannot be recovered.[1]

Send history does not travel with a profile export,[2] so if you want past campaign results, export those reports now.

Map Klaviyo profile properties to Pombo fields

Pombo matches CSV columns to fields when you import contacts and upserts by email, so re-running an import updates people rather than duplicating them.

  • email is required. first_name, last_name and phone map to built-in fields.
  • Every other column becomes a custom field. Names are lowercased with underscores for spaces, so a Klaviyo property called Company Size becomes company_size.[3]
  • Create your custom fields before the import, and pick the right type for each one: a renewal date as a date, a seat count as a number.
  • Turn Klaviyo's consent column into a Pombo status column. Pombo accepts subscribed, unsubscribed, bounced and complained, written exactly like that in lowercase. A blank status means subscribed, and any other value fails the row, so convert every Klaviyo consent value before you import. Anyone Klaviyo does not show as subscribed to email marketing should not arrive as subscribed.

Merge suppressions into the same file

Do not import the suppressed profiles as a separate, later file. A Pombo CSV import only sets the status of contacts it is creating; for someone already in your audience it leaves the status alone, so a re-import can never re-subscribe anyone. That protection works against you if the profile file goes first: a person who bounced in Klaviyo but still shows as consented would arrive as subscribed, and the suppressed file could not change them.

So combine the two files before importing. For every address on the suppressed list, set the status that matches why Klaviyo suppressed it, unsubscribed, bounced or complained, whatever its consent column says. Add any suppressed addresses that are not in your profile export as rows of their own. Then import once. Those people stay in your Pombo audience as a record and are never sent marketing email, and a bounced or complained contact gets no transactional email either. Klaviyo does not bill for suppressed contacts,[4] which is partly why the list gets ignored, but it is the most important file in the move. See unsubscribes and suppression for how Pombo applies each status.

Rewrite Klaviyo merge tags

Klaviyo's profile tags generally start with person, with first_name and last_name as exceptions,[5] and a property name with spaces uses a lookup form.[6] Pombo uses Liquid with contact fields at the top level.[7] A tag copied across unchanged renders as literal text in the inbox, so rewrite every one.

In KlaviyoIn Pombo
{{ first_name }}[5]{{ first_name }}
{{ first_name|default:'friend' }}[6]{{ first_name | default: "friend" }}
{{ person.plan }}[5]{{ plan }}
{{ person|lookup:'Company Size' }}[6]{{ company_size }}
{% unsubscribe_link %}[6]{{ unsubscribe_url }}

In Pombo, {{ event.* }} reads the properties of the event that started the send, and {{ unsubscribe_url }} is filled in per contact; the footer on marketing email includes it automatically.[7] Klaviyo's event tags only work in flows triggered by that event,[6] so check each one maps to a property your Pombo event actually carries. The merge tags docs cover the rest.

While you are in the HTML, check where each image is hosted. If any still point at Klaviyo, upload them to Pombo and repoint the links, so nothing in your templates depends on the old account.

Turn Klaviyo flows into Pombo sequences

A Klaviyo flow starts from an event, a list, a segment or a date property.[8] Pombo's sequence triggers are a custom event, a tag being added, entering a segment, a date field, or manual enrollment.[9] Here is how we would rebuild each kind of flow.

Klaviyo flow triggerPombo sequence trigger
Event, such as a custom event from your appCustom event, posted to POST /api/v1/events
Added to listTag added: import the list members with a tag
Added to segmentEntering a segment
Date propertyDate field

For a SaaS product, most flows worth keeping are built on your own events: signup, trial started, plan upgraded. Point your backend at Pombo's events endpoint with the same event names and the sequences pick them up. Flows built on store events like a placed order are the ones to drop, not rebuild.

Recreate each flow with the same delays and emails, then add a goal so the sequence ends when someone converts. Run it in simulation mode against your real contacts to see who would enrol and what each would get, without sending anything.

Or let an AI agent do the move

Every step above can be done by an AI agent connected to Pombo over MCP: custom fields, contacts with their suppression statuses, templates with merge tags rewritten, then flows rebuilt as draft sequences. The pombo-migrate Agent Skill gives Claude that order. Nothing sends during a migration, and the agent cannot switch a sequence on by itself. We walk through the whole thing in migrating with an AI agent.

Cut over without a gap

  1. Verify your sending domain and add your mailing address. Pombo reviews new accounts within 2 business hours of that and emails the owners when sending is approved.
  2. Send test emails from your two or three most important templates.
  3. Point production events at Pombo.
  4. Activate the sequences, then turn off the matching Klaviyo flows the same day.
  5. Keep Klaviyo read-only for a few weeks. Before you cancel, remove your ecommerce integration, which Klaviyo recommends doing first.[1]

For the full Pombo side of the move, read the migration guide.

Sources

  1. How to migrate off of Klaviyo, Klaviyo
  2. Migrate from Klaviyo to Bento - Step-by-Step Guide, Bento
  3. Importing contacts | Pombo, flypombo.com
  4. How Klaviyo Pricing Works: Active Profiles and Send Capacity - Klaviyo, klaviyo.com
  5. Message personalization reference | Klaviyo Help Center, help.klaviyo.com
  6. Message personalization reference | Klaviyo Help Center, help.klaviyo.com
  7. Merge tags and personalization | Pombo, flypombo.com
  8. Understanding flow triggers and filters | Klaviyo Help Center, help.klaviyo.com
  9. Building a sequence | Pombo, flypombo.com