← All playbooks
Newsletter migration

Customer.io → Mailchimp

Export Customer.io people to CSV, load unsubscribes into Mailchimp first, then import the people you still mail. Campaigns, events, and Liquid stay behind.

Typical timeline4 to 6 days8 to 12 hours active work
Statusneeds review
Source profileCustomer.io people export and unsubscribe docs reviewed 2026-11-06
Destination profileMailchimp export and suppression-import docs reviewed 2026-11-06
Documentation date
Review window
Evidence4 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

Mailchimp

What gets better
  • A broad small-business marketing suite combines email, contacts, forms, and campaigns
  • Audience, campaigns, automations, and reporting live in one publishing system
What gets worse
  • Pricing, interface complexity, and audience-based billing can become frustrating
  • Automation logic, analytics history, and deliverability settings are not very portable
Best of the move

Mailchimp: A broad small-business marketing suite combines email, contacts, forms, and campaigns. 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: Pricing, interface complexity, and audience-based billing can become frustrating.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome11 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 2, Manual rebuild: 4, Not transferred: 5.
Clean0
Partial2
Manual4
Lost5
Mapping route7 of 9 fields have a destination path

This timeline assumes

  • One Customer.io workspace and one Mailchimp audience. You are the owner or an admin on both.
  • You filter the People page by conditions, not by the email-address filter. Customer.io only exports the condition filter.
  • Mailchimp suppression is per audience. It does not cover every audience in the account.
  • The suppression import cannot mark someone who is already subscribed in that audience as unsubscribed. Load opt-outs first.
  • The site already has Customer.io → Klaviyo if you want profiles and events instead of a Mailchimp audience. No Mailchimp campaign 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
People and attributespartialcriticalFrom the People page you can export all attributes, the displayed columns, or a chosen set. id, city, state, and created_at come along with displayed attributes. The file is a CSV of people, not their history.Export the attributes you still segment on. Map them to Mailchimp merge fields. Drop the rest.
Global unsubscribepartialcriticalCustomer.io unsubscribed true covers email, SMS, WhatsApp, and push. Mailchimp's suppression import sets email marketing status to Unsubscribed for that one audience.Filter People where unsubscribed is true and export that file. Import it as Unsubscribed before you import anyone else.
Subscription-center topicslosthighTopic preferences are not Mailchimp groups. A global unsubscribe already removes every topic. Someone subscribed to one topic and not another needs a decision.If you mail more than one topic, make a Mailchimp group per topic from an export of those preferences. Do not flatten them into one subscribed flag without looking.
Campaigns and LiquidlostcriticalCampaigns, broadcasts, and Liquid do not import into Mailchimp. You rebuild the next emails in Mailchimp's editor.Rebuild the next two campaigns and the one journey you cannot pause. Archive the rest as screenshots.
Events and deliverieslosthighA people CSV is not event history. A single person's JSON export includes events, devices, relationships, and deliveries. That is one person at a time.Export JSON only for accounts you must audit. Accept that Mailchimp segments cannot use old Customer.io events.
SegmentsmanualhighYou can export a segment's people list from the segment page. Membership is a timestamp column, not a Mailchimp segment.Export each segment you still send to. Tag those rows on import, or save a Mailchimp segment from the tag.
Devices and pushlostmediumDevice export is a separate Customer.io option. Mailchimp email will not register those devices.Keep push on Customer.io until you have another push tool. Do not expect the email move to cover it.
Duplicate emailsmanualhighCustomer.io can hold more than one person with the same email when they have different ids. Mailchimp keeps one contact per email in an audience.Export duplicate people from Customer.io first. Decide which id wins before the Mailchimp import.
Export lifetimemanualmediumCustomer.io emails you when the export is ready and deletes it from the workspace after 60 days.Download it the day it arrives and store a copy with a checksum.
Already-subscribed Mailchimp contactsmanualcriticalMailchimp's suppression import does not change someone who is already subscribed or cleaned. The article says to use bulk unsubscribe for that case.Import the suppression file into an empty audience, or bulk-unsubscribe the overlap before you treat the audience as safe.
SMS consentlostmediumCustomer.io's global flag covers SMS. This Mailchimp path sets email status. SMS consent is a separate Mailchimp state.If you text from Mailchimp, treat SMS as its own import. Do not infer it from unsubscribed.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Customer.io emailMailchimp Email AddressautomaticOne row per email after you resolve duplicate ids.
unsubscribed trueEmail marketing status UnsubscribedtransformImport this file first, with the status dropdown set to Unsubscribed.
unsubscribed false or absentSubscribed contacttransformOnly rows you have consent to mail.
idA merge fieldmanualMailchimp will not use it as the key. Email is the key.
Attributes you still segment onMerge fieldstransformChoose attributes on export so the file stays small.
Segment membershipTag or groupmanualExport the segment, then tag those emails on import.
Campaigns and LiquidNo destinationunsupportedRebuild the messages you will send next.
Events and deliveriesNo destinationunsupportedPer-person JSON is an archive, not a Mailchimp import.
Workspace suppressionsThe same Unsubscribed importmanualExport suppressions separately and include them before subscribers.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep a full people export, an unsubscribe export, and a copy of live campaigns before Mailchimp can send.

  1. Export all people with the attributes you need. Download it before the 60-day deletion.
  2. Export the unsubscribed condition as its own CSV.
  3. Export duplicate people and note which email you will keep.
  4. Screenshot or export the campaigns that are live this month.
  5. Store checksums. Work on copies.

Proof to capture: Checksums, row counts for all people and for unsubscribed, and the campaign list.

Transformation · Customer.io People, Conditions, Export to CSV

Export two people files

Separate opt-outs from everyone else before Mailchimp sees them.

  1. Filter with conditions, unsubscribed equals true. Export the attributes you need.
  2. Export everyone else you have consent to mail as a second file.
  3. Download both from the export email or the Exports page.
  4. Resolve duplicate emails down to one row per address.

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

Transformation · Mailchimp Audience, Add contacts, Import contacts

Load Mailchimp in the safe order

Use the suppression import while it can still set status.

  1. Start from an audience that does not already contain these people as subscribed.
  2. Import the unsubscribed CSV. Set email marketing status to Unsubscribed.
  3. Import the consented CSV as subscribed. Map email and the merge fields you kept.
  4. If someone was already subscribed, use Mailchimp's bulk unsubscribe. The suppression file will not change them.

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.

Consent

Suppression import skips current subscribers

criticallikely likelihood

Mailchimp documents that a suppression import cannot mark an existing subscribed contact as unsubscribed.

Consequence
Opt-outs stay mailable.
Mitigation
Import opt-outs into a fresh audience first, or bulk-unsubscribe the overlap.

Stop if: Any sampled Customer.io opt-out is still subscribed in Mailchimp.

People

One email hides two people

highpossible likelihood

Customer.io allows the same email on different ids. Mailchimp keeps one contact.

Consequence
You keep the wrong attributes and drop a second relationship.
Mitigation
Run the duplicate-people export and pick a winner first.

Stop if: Duplicate emails are still in the file you upload.

Cutover

Both products send

criticalpossible likelihood

Campaigns keep running in Customer.io until you stop them.

Consequence
The list gets two emails.
Mitigation
Stop Customer.io campaigns before the Mailchimp audience is allowed to send.

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

06Precise timeline

Do the work in this order.

Estimate forOne workspace, one Mailchimp audience, attributes you choose rather than every column
Total elapsed4 to 6 days
Active work8 to 12 hours
BufferLarge exports can sit until Customer.io emails you. Do not build the Mailchimp import from a half-downloaded file.
01
Day 1Export people, opt-outs, and duplicates1 day
02
Day 2One row per email1 day
03
Day 3Import opt-outs, then subscribers1 day
04
Day 4Rebuild the next campaign and seed it1 day
05
Day 5Send once and watch1 day
  1. Day 1 · export

    Export people, opt-outs, and duplicates

    2 hours active1 day elapsedCustomer.io export email waiting
    • Export unsubscribed people and the consented set.
    • Export duplicates.
    • List live campaigns.
    Stop / go checkpoint

    Are both CSVs complete?

    Go when: Row counts match the People filters and the files are downloaded.

    Stop when: The export expired or the condition filter was the email search.

  2. Day 2 · clean

    One row per email

    2 to 3 hours active1 day elapsedNone waiting
    • Pick a winning id when emails repeat.
    • Map attributes to merge fields.
    • Create the Mailchimp audience if you need an empty one.

    Depends on: export

    Stop / go checkpoint

    Is the file safe to upload?

    Go when: No duplicate emails remain, and opt-outs are in their own file.

    Stop when: You cannot tell which duplicate to keep.

  3. Day 3 · import

    Import opt-outs, then subscribers

    2 hours active1 day elapsedMailchimp import notice waiting
    • Import unsubscribed with status Unsubscribed.
    • Import consented contacts as subscribed.
    • Sample both groups.

    Depends on: clean

    Stop / go checkpoint

    Did consent survive?

    Go when: Every sampled opt-out is unsubscribed and subscribed counts match.

    Stop when: An opt-out is subscribed.

  4. Day 4 · rebuild

    Rebuild the next campaign and seed it

    3 hours active1 day elapsedNone waiting
    • Recreate the next email.
    • Stop Customer.io sends.
    • Seed-send from Mailchimp only.

    Depends on: import

    Stop / go checkpoint

    Can Mailchimp own the next send?

    Go when: The seed arrives once and Customer.io has nothing scheduled.

    Stop when: Both products can still send.

  5. Day 5 · cutover

    Send once and watch

    1 hour active1 day elapsedThe send window waiting
    • Import the last-day delta.
    • Send the Mailchimp campaign.
    • Check bounces and unsubscribes the next morning.

    Depends on: rebuild

    Stop / go checkpoint

    Stay on Mailchimp?

    Go when: One send completed and opt-out samples still hold.

    Stop when: Complaints or a double send show up.

07The point of change

Cut over with a way back.

Go live

Cutover

Let Mailchimp send the next campaign without Customer.io sending too, and without mailing opt-outs.

Recommended window: A weekday with both account owners available, not the hour a broadcast is already queued.

  1. Stop Customer.io campaigns and broadcasts. Record the time.
  2. Export the unsubscribe filter again and import any new opt-outs first.
  3. Import new consented people.
  4. Confirm Mailchimp is the only scheduled send.
  5. Send, then check a sample of opt-outs again.

Proof to capture: Stop time, both import notices, and the single scheduled campaign.

Return to safety

Rollback

Return the next send to Customer.io if Mailchimp consent is wrong.

Deadline: Before the first full Mailchimp campaign. Keep Customer.io people in place either way.

  1. Unschedule the Mailchimp campaign.
  2. Do not delete the Customer.io workspace.
  3. Turn the Customer.io campaign back on only after you know it will not replay the import.
  4. Export any Mailchimp unsubscribes that happened and set unsubscribed true in Customer.io.
  5. Name one sender before anyone leaves.

Proof to capture: Customer.io is the only scheduled sender and new Mailchimp opt-outs were written back.

Rollback immediately when
  • A Customer.io opt-out is subscribed in Mailchimp.
  • Both products show a scheduled send.
  • Duplicate emails were imported as the wrong person.
  • The subscribed count is off and the gap is unexplained.
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
EXP-01BlockingPeople export matches the filterCompare the CSV row count with the People page condition.The counts match after you remove the header.The export email and the row count.
UNS-01BlockingOpt-outs are unsubscribedSample 20 unsubscribed emails in the Mailchimp audience.Each shows email marketing status Unsubscribed.The sample list.
SUB-01BlockingSubscribed countCompare the consented CSV with the Mailchimp subscribed total.Counts match, or each gap is an invalid address you logged.Both counts.
DUP-01BlockingDuplicate emailsSearch the upload file for repeated emails.No email appears twice.The duplicate check output.
SEG-01A live segment became a tagCompare one exported segment count with the Mailchimp tag.The counts match.The segment export and the tag count.
CAM-01BlockingCustomer.io is stoppedOpen campaigns and broadcasts.Nothing is scheduled or running.Screenshots of both lists.
SEED-01BlockingSeed messageSend the Mailchimp campaign to seed addresses only.One message each. Unsubscribe works. Customer.io sent nothing.Seed headers.
SMS-01SMS was not inferredIf the audience has SMS, compare consent with the email file.SMS status was set on purpose, or SMS is off.A note of the decision.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One Mailchimp campaign, a day of delivery checks, and opt-out samples that still hold.

  1. Store the Customer.io CSVs outside the workspace before the 60-day deletion.
  2. Leave Customer.io campaigns stopped.
  3. Remove workspace users who only exported data.
  4. Keep the workspace readable until the retention date you wrote down.
  5. Update 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. Mailchimp: import a suppression listAccessed 2026-11-06
  4. Mailchimp: view or export contactsAccessed 2026-11-06