← All playbooks
Newsletter migration

Customer.io → Klaviyo

Export Customer.io people, import consented profiles into a Klaviyo list, and load suppressions separately. Turn list-triggered flows to manual first, because a CSV upload does not ask for double opt-in.

Typical timeline4 to 6 days8 to 12 hours active work
Statusneeds review
Source profileCustomer.io export and unsubscribe docs reviewed 2026-11-06
Destination profileKlaviyo subscriber migration and list export docs reviewed 2026-11-06
Documentation date
Review window
Evidence5 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

Customer.io

Reasons to stay
  • People, attributes, and events drive campaigns without a separate list for every segment
  • Audience, campaigns, automations, and reporting live in one publishing system
Reasons to leave
  • Journeys, Liquid, and event history have to be rebuilt, and a CSV import can fire automations while it runs
  • Automation logic, analytics history, and deliverability settings are not very portable
New platform

Klaviyo

What gets better
  • Commerce-native segmentation, behavioral automation, and revenue attribution are exceptionally strong
  • Audience, campaigns, automations, and reporting live in one publishing system
What gets worse
  • Data-model complexity and profile-based pricing can become expensive and difficult to unwind
  • Automation logic, analytics history, and deliverability settings are not very portable
Best of the move

Klaviyo: Commerce-native segmentation, behavioral automation, and revenue attribution are exceptionally strong. This removes a major source-side concern: Journeys, Liquid, and event history have to be rebuilt, and a CSV import can fire automations while it runs.

Worst of the move

What you lose: People, attributes, and events drive campaigns without a separate list for every segment. What you inherit: Data-model complexity and profile-based pricing can become expensive and difficult to unwind.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome11 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 4, Manual rebuild: 4, Not transferred: 3.
Clean0
Partial4
Manual4
Lost3
Mapping route6 of 9 fields have a destination path

This timeline assumes

  • One Customer.io workspace and one Klaviyo account. The Klaviyo user can import contacts and export profiles.
  • Each subscriber CSV is 50 MB or smaller. Klaviyo says to split anything larger. An export can include at most 700 columns.
  • You have consent for every address in the subscriber file. Klaviyo's upload does not run double opt-in.
  • The site already documents Customer.io → Mailchimp. Pick one destination and pause the other.
  • List-triggered flows are manual before the upload. No live flow sends until the seed check passes.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Consented peoplepartialcriticalKlaviyo's migration article says to put email in a column named Email or Email Address, keep unsubscribes out of that file, and import from the list's Manage list menu. The first column should be the email.Export only people you may mail. Map Email. Choose Apply bulk consent only when every row has that consent.
UnsubscribespartialcriticalCustomer.io uses one unsubscribed boolean for email, SMS, WhatsApp, and push. Klaviyo wants unsubscribed and bounced addresses out of the subscriber CSV and imported as suppressions.Export unsubscribed true on its own. Import suppressions before you send. Do not apply email bulk consent to that file.
AttributespartialhighA Customer.io people export can be all attributes or a chosen set. Klaviyo maps columns to profile properties. A new property replaces the old value. Blank cells do not clear an existing property.Export only the properties you will segment on. Check data types while mapping.
EventslosthighThe people CSV is not event history. Klaviyo's list export also cannot include full event history. Old Customer.io events will not drive Klaviyo flows.Start events from the site or store after cutover. Archive a few person JSON exports if you must audit someone.
Campaigns and LiquidlostcriticalCustomer.io campaigns do not become Klaviyo flows. You rebuild the messages.Rebuild the flows you will run this month. Leave them manual until the seed send.
SegmentsmanualhighExporting a Customer.io segment gives you the people and a membership time. Klaviyo will not recreate the segment definition.Rebuild the definition from profile properties, or import that file to a list if the segment is really a static list.
List-triggered flowsmanualcriticalKlaviyo says to turn off flows triggered by the list unless you want them to send to every imported contact. Uploads do not trigger double opt-in.Set those flows to manual before Upload. Read the consent step. Use Only import the consent in my file when the CSV already has it.
File size and columnsmanualhighSubscriber CSV uploads must be 50 MB or less. A later Klaviyo export of the list allows 700 columns and keeps downloads for 30 days.Split the Customer.io export. Drop columns you will not map.
Push deviceslostmediumCustomer.io can export devices. This Klaviyo list import does not register them.Keep push on Customer.io or plan a separate push tool.
Duplicate emailsmanualhighCustomer.io can store one email on more than one id. Klaviyo folds an import into one profile per email.Export Customer.io duplicates first and choose which attributes win.
Predictive analytics and consent columnspartialmediumA Klaviyo list export can include consent timestamps and, when the account qualifies, predictive fields. Those do not exist on day one of an import.Do not compare predictive fields to Customer.io. Check email consent status instead.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Customer.io emailKlaviyo EmailautomaticName the column Email or Email Address. Put it first.
Consented peopleList profiles with email consenttransformApply bulk consent only if every row agreed.
unsubscribed trueSuppression, not the subscriber listtransformKlaviyo's migration article says to keep these out of the subscriber CSV.
Chosen attributesProfile propertiestransformNew values replace old ones. Blanks do not clear them.
idA custom propertymanualUseful for support. Klaviyo still keys the profile on email.
Segment exportA list or a rebuilt segmentmanualThe membership timestamp is not a definition.
CampaignsNo destinationunsupportedRebuild flows and leave them manual during import.
EventsNo destinationunsupportedNeither CSV carries full event history.
DevicesNo destinationunsupportedPush stays where it is until you move it on purpose.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep Customer.io people, opt-outs, and a list of live campaigns before Klaviyo uploads anything.

  1. Export consented people and unsubscribed people as separate CSVs.
  2. Export duplicate people.
  3. List Klaviyo flows triggered by the destination list and set them to manual.
  4. Download the Customer.io files. They leave the workspace after 60 days.
  5. Store checksums.

Proof to capture: Row counts, the flow list with manual mode, and checksums.

Transformation · Customer.io Export to CSV

Build a subscriber CSV and a suppression CSV

Follow Klaviyo's split between people you can mail and people you cannot.

  1. Export unsubscribed true with email and the id.
  2. Export everyone you have email consent for. Name the email column Email.
  3. Split any file over 50 MB.
  4. Remove duplicate emails after you pick a winning id.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Klaviyo list, Manage list, Import contacts

Import into a quiet Klaviyo list

Add profiles without sending a flow to the whole file.

  1. Set flows triggered by this list to manual.
  2. Import suppressions first, using the path in Klaviyo's migration article.
  3. Import the subscriber CSV. Map columns. Apply bulk email consent only when the whole file has it.
  4. Wait for the import to finish. Then sample consent before you set any flow live.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Import

The list upload sends a flow

criticallikely likelihood

Klaviyo tells you to turn off list-triggered flows unless you want them to mail every imported contact.

Consequence
The whole file gets a welcome or a browse flow.
Mitigation
Manual mode first. Import suppressions before subscribers.

Stop if: Any flow on that list is still live.

Consent

Bulk consent overstates permission

criticalpossible likelihood

Apply bulk consent marks the file as consented. Uploads do not run double opt-in.

Consequence
You mail people who never opted in.
Mitigation
Use the consent already in the file when you are unsure. Keep unsubscribes out of this CSV.

Stop if: You cannot point at a consent source for every row.

Cutover

Customer.io keeps sending

criticalpossible likelihood

Importing to Klaviyo does not stop Customer.io campaigns.

Consequence
People get both.
Mitigation
Stop Customer.io campaigns before Klaviyo flows go live.

Stop if: A Customer.io campaign is still scheduled.

06Precise timeline

Do the work in this order.

Estimate forOne workspace, CSVs at or under 50 MB, one Klaviyo list
Total elapsed4 to 6 days
Active work8 to 12 hours
BufferSplit files and a second suppression pass if the first export is huge.
01
Day 1Export consented people and opt-outs1 day
02
Day 2Make the Klaviyo list quiet1 day
03
Day 3Import suppressions, then subscribers1 day
04
Day 4Rebuild one flow and seed it1 day
05
Day 5Turn on one flow1 day
  1. Day 1 · export

    Export consented people and opt-outs

    2 hours active1 day elapsedCustomer.io export email waiting
    • Export both filters.
    • Export duplicates.
    • List Customer.io campaigns that are live.
    Stop / go checkpoint

    Do you have two clean files?

    Go when: Opt-outs and consented people are separate, and both are downloaded.

    Stop when: The files are mixed or still over 50 MB.

  2. Day 2 · quiet

    Make the Klaviyo list quiet

    1 hour active1 day elapsedNone waiting
    • Create or open the destination list.
    • Set list-triggered flows to manual.
    • Confirm you can import contacts.

    Depends on: export

    Stop / go checkpoint

    Can you upload without sending?

    Go when: Every flow on that list is manual.

    Stop when: A flow is still live.

  3. Day 3 · import

    Import suppressions, then subscribers

    2 to 4 hours active1 day elapsedKlaviyo import waiting
    • Import the suppression file.
    • Import subscribers and map properties.
    • Sample consent on both sides.

    Depends on: quiet

    Stop / go checkpoint

    Did consent land?

    Go when: Opt-outs are suppressed and subscribed counts match.

    Stop when: An opt-out can receive email marketing.

  4. Day 4 · rebuild

    Rebuild one flow and seed it

    3 hours active1 day elapsedNone waiting
    • Rebuild the next flow, still manual.
    • Stop Customer.io sends.
    • Send a seed.

    Depends on: import

    Stop / go checkpoint

    Is the seed the only mail?

    Go when: Seeds get one message and Customer.io sent nothing.

    Stop when: A flow mailed the imported list.

  5. Day 5 · cutover

    Turn on one flow

    1 hour active1 day elapsedThe first live sends waiting
    • Import the last delta, suppressions first.
    • Set one flow live.
    • Check suppressions again the next day.

    Depends on: rebuild

    Stop / go checkpoint

    Leave the flow live?

    Go when: One flow is live, Customer.io is stopped, and opt-outs stayed suppressed.

    Stop when: Consent or a double send fails.

07The point of change

Cut over with a way back.

Go live

Cutover

Let one Klaviyo flow send, with Customer.io quiet and opt-outs suppressed.

Recommended window: A weekday with both owners watching, after list-triggered flows have been manual for the whole import.

  1. Stop Customer.io campaigns. Record the time.
  2. Re-export new opt-outs and import suppressions.
  3. Import new consented profiles.
  4. Turn on a single Klaviyo flow.
  5. Watch the first hour for sends to suppressed profiles.

Proof to capture: Stop time, both import results, and the one live flow.

Return to safety

Rollback

Put sends back on Customer.io if Klaviyo consent or a flow mis-fires.

Deadline: Before that flow has mailed the full list. Keep both datasets.

  1. Set the Klaviyo flow back to manual.
  2. Do not delete Customer.io people.
  3. Write any new Klaviyo unsubscribes back to Customer.io as unsubscribed true.
  4. Restart a Customer.io campaign only when you know it will not replay old triggers.
  5. Name the single sender.

Proof to capture: Klaviyo flows are manual and Customer.io is the only scheduled sender.

Rollback immediately when
  • A Customer.io opt-out received Klaviyo mail.
  • A list-triggered flow sent during the upload.
  • Bulk consent was applied to a file you cannot defend.
  • Customer.io still has a campaign scheduled.
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
FIL-01BlockingSize and splitCheck each subscriber CSV is 50 MB or under and starts with Email.Every file passes those two rules.File sizes and the header row.
SUP-01BlockingOpt-outs are suppressedSample 20 unsubscribed emails in Klaviyo.They cannot receive email marketing.The sample and profile consent panels.
SUB-01BlockingSubscriber countCompare the consented CSV with the list count.Counts match, or each gap is logged.Both numbers.
FLO-01BlockingManual during importRead flow status for the list at import time.None were live while the CSV uploaded.Flow status notes with times.
DUP-01BlockingOne email eachScan the subscriber file for duplicate emails.No duplicates.The scan result.
CIO-01BlockingCustomer.io is quietOpen campaigns and broadcasts.Nothing is scheduled.Screenshots.
SEED-01BlockingSeedSend the rebuilt flow to seed profiles only.One message, working unsubscribe, no Customer.io copy.Headers.
PROP-01A mapped attributeOpen one imported profile and compare a property to the CSV.The value matches. A blank in the file did not wipe an older value you meant to keep.The profile panel.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One live Klaviyo flow has run, opt-out samples still hold, and Customer.io has stayed quiet for a day.

  1. Archive the Customer.io CSVs outside the workspace.
  2. Leave Customer.io campaigns stopped.
  3. Keep unused Klaviyo flows manual or delete the drafts you will not use.
  4. Remove export-only users.
  5. Write the next review date.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. Customer.io: export people dataAccessed 2026-11-06
  2. Customer.io: global unsubscribesAccessed 2026-11-06
  3. Klaviyo: migrate subscribers and unsubscribesAccessed 2026-11-06
  4. Klaviyo: import subscribers to a listAccessed 2026-11-06
  5. Klaviyo: export a list or segmentAccessed 2026-11-06