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]
- 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.
- 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.
- 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.
- 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.
emailis required.first_name,last_nameandphonemap to built-in fields.- Every other column becomes a custom field. Names are lowercased with underscores for spaces, so a Klaviyo property called
Company Sizebecomescompany_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
statuscolumn. Pombo acceptssubscribed,unsubscribed,bouncedandcomplained, 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 assubscribed.
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 Klaviyo | In 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 trigger | Pombo sequence trigger |
|---|---|
| Event, such as a custom event from your app | Custom event, posted to POST /api/v1/events |
| Added to list | Tag added: import the list members with a tag |
| Added to segment | Entering a segment |
| Date property | Date 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
- 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.
- Send test emails from your two or three most important templates.
- Point production events at Pombo.
- Activate the sequences, then turn off the matching Klaviyo flows the same day.
- 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
- How to migrate off of Klaviyo, Klaviyo
- Migrate from Klaviyo to Bento - Step-by-Step Guide, Bento
- Importing contacts | Pombo, flypombo.com
- How Klaviyo Pricing Works: Active Profiles and Send Capacity - Klaviyo, klaviyo.com
- Message personalization reference | Klaviyo Help Center, help.klaviyo.com
- Message personalization reference | Klaviyo Help Center, help.klaviyo.com
- Merge tags and personalization | Pombo, flypombo.com
- Understanding flow triggers and filters | Klaviyo Help Center, help.klaviyo.com
- Building a sequence | Pombo, flypombo.com

