← All playbooks
Newsletter migration

Mailchimp → Ghost

Move a Mailchimp audience into Ghost members with the built-in migrator or a member CSV. Campaign content does not come across, and people who are already Ghost members keep their old newsletter preferences.

Typical timeline4 to 10 days8 to 16 hours active work
Statusneeds review
Source profileMailchimp audience export help reviewed 2026-11-04
Destination profileGhost Mailchimp migrator and member import help reviewed 2026-11-04
Documentation date
Review window
Evidence3 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

Mailchimp

Reasons to stay
  • A broad small-business marketing suite combines email, contacts, forms, and campaigns
  • Audience, campaigns, automations, and reporting live in one publishing system
Reasons to leave
  • Pricing, interface complexity, and audience-based billing can become frustrating
  • Automation logic, analytics history, and deliverability settings are not very portable
New platform

Ghost

What gets better
  • A focused publishing and membership platform is fast and pleasant for writers
  • Editors get a purpose-built publishing workflow instead of raw files
What gets worse
  • Its narrower ecosystem is less suitable for complex sites and custom application behavior
  • Themes, extensions, and content models add maintenance and portability constraints
Best of the move

Ghost: A focused publishing and membership platform is fast and pleasant for writers. This removes a major source-side concern: Pricing, interface complexity, and audience-based billing can become frustrating.

Worst of the move

What you lose: A broad small-business marketing suite combines email, contacts, forms, and campaigns. What you inherit: Its narrower ecosystem is less suitable for complex sites and custom application behavior.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome10 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 3, Manual rebuild: 3, Not transferred: 4.
Clean0
Partial3
Manual3
Lost4
Mapping route8 of 9 fields have a destination path

This timeline assumes

  • You are a Mailchimp Owner or Admin, because only those roles can export an audience. You can also sign in to Ghost Admin.
  • The move is subscribers into members. Ghost says Mailchimp content cannot be migrated with the built-in tool.
  • You will open Mailchimp's ZIP and import the subscribed file. You will not import unsubscribed or cleaned addresses as subscribers.
  • The site already documents Mailchimp → Kit and Mailchimp → Substack if the destination is another newsletter, and Ghost → Substack if you later leave Ghost.
02What transfers

What survives the move.

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

ItemOutcomeImpactWhat happensMitigation
Campaigns and automationslostcriticalGhost's Mailchimp guide says it is not currently possible to migrate Mailchimp content. The migrator imports members. Ghost(Pro) customers can ask Ghost's migrations team for content help. Self-hosted sites are pointed at Ghost's open-source migration tools.Export the campaigns you still need as your own archive. Rebuild posts and newsletters in Ghost.
Opens, clicks, and purchase historylosthighMailchimp says contact exports do not include email report data such as opens and clicks. The same page lists purchase history, predicted demographics, favorite email client, and social profile data as excluded. A GDPR request for one person is a different export, from that contact's profile.Download the email reports you still need before you close Mailchimp. Do not expect them inside the member CSV.
Unsubscribed and cleaned contactsmanualcriticalAn audience export can include subscribed, non-subscribed, unsubscribed, and cleaned contacts. Mailchimp often returns a ZIP of separate CSVs, one per contact type, and keeps that export for 30 days. Ghost's migrator asks you to export the audience and upload the download.Unzip the file. Upload the subscribed CSV. Keep the other files as a suppression archive, not as a subscriber import.
People already in GhostpartialcriticalGhost's member import says a new member with subscribed_to_emails true joins every newsletter that has Subscribe new members on signup turned on. An existing member with that value true keeps their current preferences, unless they were unsubscribed from all newsletters. False unsubscribes the member from all newsletters.Count members who already exist before you import. Plan a second step for the newsletter you want them on.
Labels and notespartialmediumMailchimp's export includes TAGS and NOTES, plus audience fields other than language. Ghost's CSV accepts labels in quotes, comma-separated, and a note column. The Mailchimp migrator confirms a subscriber count. It does not document a tag mapper.If tags matter, use Members, Import members, and map Mailchimp tags into the labels column.
Paid Stripe customersmanualhighGhost can import stripe_customer_id, or the value auto, which looks up a customer with the same email on the connected Stripe account. complimentary_plan marks a free subscription. Mailchimp's contact export is not a Stripe export.Add Stripe ids only when you have them from Stripe. Leave the column off for a free list.
Opt-in timestampspartialmediumMailchimp includes OPTIN_TIME, CONFIRM_TIME, CONFIRM_IP, and related geolocation fields when it has them. Ghost's created_at column wants ISO 8601, such as 2019-10-30T14:52:08.000Z. Email is the only required Ghost column.Convert CONFIRM_TIME when you build a CSV. Drop the import if the dates do not parse.
SMS contactslostmediumMailchimp puts SMS contacts in a separate folder in the export, with acquisition time, revocation time, and SMS subscription status. Ghost's member CSV is an email import. Email is required.Keep the SMS folder in the archive. Do not paste phone-only rows into the member file.
Multiple audiencesmanualhighMailchimp exports one audience, segment, tag, or group at a time. Owners and Admins export audiences. Ghost imports into the publication you are signed in to.Repeat the export per audience. Label each file with the audience name before you import.
Signup source and languagelostlowMailchimp says the audience export excludes email signup source and the language field. Ghost's documented columns do not include a language field.Record language somewhere else if a send depends on it.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Subscribed CSVGhost membersautomaticGhost Admin, Settings, Advanced, Import/Export, then the Mailchimp migrator. Or Members, Import members.
EmailemailautomaticRequired on the CSV path. The migrator reviews the subscriber count before you confirm.
First and last namenametransformGhost wants one name column if you use the CSV.
TAGSlabelstransformQuote the list and separate labels with commas, as in Ghost's template.
NOTESnotetransformUse the CSV path when notes must move.
Subscribed statussubscribed_to_emailsmanualTrue opts a new member into newsletters that subscribe new members on signup. False unsubscribes them from all.
CONFIRM_TIMEcreated_attransformISO 8601 only.
Stripe customerstripe_customer_id or automanualauto searches the connected Stripe account by email.
Unsubscribed and cleaned CSVsNo destinationunsupportedKeep them out of the subscriber import.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep Mailchimp's ZIP until Ghost's member count matches the subscribed file.

  1. Export the audience as an Owner or Admin.
  2. Download the ZIP from Export history before the 30 days end.
  3. Save the subscribed, unsubscribed, non-subscribed, and cleaned CSVs separately.
  4. Export any campaign reports you still need, because the contact file does not contain them.

Proof to capture: The ZIP, the four contact files, and the Ghost review count are in the migration folder.

Transformation · Mailchimp audience export and Ghost's Mailchimp migrator

Subscribed file only

Give Ghost the people you may email, and leave suppressions out.

  1. In Mailchimp, open the audience and export it.
  2. Unzip the download. Find the subscribed CSV.
  3. In Ghost, open Settings, Advanced, Import/Export. Sign in to Mailchimp when the migrator asks.
  4. Upload that file. Read the subscriber count. Import only if the count matches the subscribed file.

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

Transformation · Ghost member CSV

Member CSV for labels and existing members

Set labels, notes, and email subscription on purpose when the migrator is too coarse.

  1. Build a CSV with email and the optional columns Ghost lists.
  2. Set subscribed_to_emails true only for people who should receive newsletters.
  3. Turn Subscribe new members on signup on for each newsletter a new member should join.
  4. Import from Members. Then list members who already existed and were not added to the new newsletter.

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.

Pilot

The whole ZIP is uploaded

criticalpossible likelihood

The file contains unsubscribed or cleaned addresses.

Consequence
Ghost can treat those rows as members you might email.
Mitigation
Import the subscribed CSV only. Compare the review count with that file.

Stop if: You cannot tell which CSV is the subscribed file.

Cutover

Existing members miss the new newsletter

highlikely likelihood

Subscribe new members on signup is on, and some addresses are already members.

Consequence
Those people stay on their old newsletter settings. The new send is smaller than the Mailchimp list.
Mitigation
Diff the Mailchimp file against current Ghost members before the first send.

Stop if: The first issue must reach every existing member and you have no second step for them.

Pilot

False unsubscribes everyone

criticalunlikely likelihood

subscribed_to_emails is false on a row for someone who should still get mail.

Consequence
Ghost unsubscribes that member from all newsletters, including ones they already had.
Mitigation
Use false only for people who must be off every newsletter.

Stop if: You are reimporting the full audience with false as the default.

06Precise timeline

Do the work in this order.

Estimate forOne Mailchimp audience moving into an existing Ghost publication, with content rebuilt by hand
Total elapsed4 to 10 days
Active work8 to 16 hours
BufferAdd time when many imported people are already Ghost members and need a newsletter update after the import.
01
Days 1 to 2Count the audience1 to 2 days
02
Day 2Archive reports1 day
03
Days 3 to 5Import and read the count1 to 2 days
04
Days 5 to 7Fix existing members, then send1 to 2 days
05
Days 7 to 14Watch one real issue2 to 7 days
  1. Days 1 to 2 · inventory

    Count the audience

    2 to 4 hours active1 to 2 days elapsedMailchimp's export email waiting
    • Export the audience.
    • Count each CSV in the ZIP.
    • List Ghost newsletters and who already exists.

    Depends on: Owner or Admin on Mailchimp

    Stop / go checkpoint

    Which file is the import?

    Go when: The subscribed count is written down and the other files are archived.

    Stop when: The ZIP has not arrived or the files are mixed.

  2. Day 2 · backup

    Archive reports

    1 to 3 hours active1 day elapsedReport downloads waiting
    • Download campaign reports you still need.
    • Store the ZIP where it will last past 30 days.

    Depends on: Audience export

    Stop / go checkpoint

    Is the archive complete?

    Go when: Subscribed, suppressed, and report files are saved outside Mailchimp.

    Stop when: A report you need is still only inside Mailchimp.

  3. Days 3 to 5 · pilot

    Import and read the count

    2 to 4 hours active1 to 2 days elapsedGhost's import waiting
    • Upload the subscribed file.
    • Compare Ghost's review count with the CSV.
    • Spot-check labels if you used the CSV path.

    Depends on: Archived ZIP

    Stop / go checkpoint

    Import for real?

    Go when: The review count matches the subscribed file.

    Stop when: The count includes another contact type.

  4. Days 5 to 7 · cutover

    Fix existing members, then send

    2 to 4 hours active1 to 2 days elapsedA test send waiting
    • List members who already existed.
    • Subscribe them to the new newsletter on purpose.
    • Send a test to a small segment.

    Depends on: Finished import

    Stop / go checkpoint

    Send the newsletter?

    Go when: The recipient count matches the people who should get it.

    Stop when: Existing members are missing and the issue cannot wait.

  5. Days 7 to 14 · observe

    Watch one real issue

    1 to 3 hours active2 to 7 days elapsedOne publish waiting
    • Compare complaints with the suppression archive.
    • Keep Mailchimp read-only until that issue looks right.

    Depends on: Test send

    Stop / go checkpoint

    Close Mailchimp sending?

    Go when: One issue went to the expected members and not to the cleaned file.

    Stop when: Unsubscribed addresses received it.

07The point of change

Cut over with a way back.

Go live

Cutover

Send the next issue from Ghost to the subscribed list, including members who were already on the site.

Recommended window: A day when you can read the recipient count and cancel the send.

  1. Confirm the imported count against the subscribed CSV.
  2. Update newsletter membership for people who were already Ghost members.
  3. Send a test issue to a segment you can check by hand.
  4. Stop new campaigns in Mailchimp.
  5. Send the real issue from Ghost and read the recipient count before it goes out.

Proof to capture: The recipient count matches the subscribed file after the existing-member fix, and a cleaned address is absent.

Return to safety

Rollback

Keep sending from Mailchimp if Ghost's member list is short or includes suppressions.

Deadline: Before you delete the Mailchimp audience or pass the 30-day export window without a local ZIP.

  1. Do not delete the Mailchimp audience.
  2. Stop the Ghost send if the recipient count is wrong.
  3. Export the Ghost member list and diff it against the subscribed CSV.
  4. Send the issue from Mailchimp if Ghost is missing people who should get it.

Proof to capture: Mailchimp still has the audience, and no Ghost issue went to the cleaned file.

Rollback immediately when
  • The review count is higher than the subscribed file
  • Existing members are missing from the new newsletter
  • A cleaned address appears in Ghost as subscribed
  • subscribed_to_emails false was applied to current readers
  • The first issue's recipient count is short
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
V-01BlockingRole and file typeConfirm an Owner or Admin ran the audience export and the download is a ZIP or a single CSV.Subscribed contacts are in their own file.Export history.
V-02BlockingOther CSVs kept outCompare filenames with Mailchimp's contact types.Unsubscribed, cleaned, and non-subscribed files are archived and not uploaded.File list.
V-03BlockingReview stepRead Ghost's subscriber count before you confirm.It matches the subscribed CSV row count, minus a header.Ghost review screen.
V-04BlockingNewsletter membershipDiff imported emails against members who existed yesterday.Each existing member is on the newsletters you intended. True did not silently add them.Diff sheet.
V-05BlockingNo accidental unsubscribe-allSearch the CSV for subscribed_to_emails false.Every false row is a person who should leave every newsletter.CSV filter.
V-06Quoted labelsOpen a few imported members when you used the CSV.Labels match the quoted column.Member screen.
V-07Paid idsIf you used stripe_customer_id or auto, open a paid member.The Stripe customer is the one you expected.Member billing.
V-08BlockingRecipient countRead the count on the next issue before sending.It matches the people who should receive that newsletter.Send screen.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One Ghost issue went to the right members, and the Mailchimp ZIP is stored outside Mailchimp.

  1. Keep Mailchimp from sending new campaigns.
  2. Store the suppression CSVs with the migration notes.
  3. Download anything still only in Export history before day 30.
  4. Rebuild the posts you still need, because content did not import.
  5. Leave the Mailchimp login in place until the rollback window ends.
  6. Schedule a review of Ghost newsletter defaults for the next import.
10Experiences from the field

When the plan met reality.

First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.

First-person accountSandorWeisz · Ghost Forum

Imported Mailchimp subscribers missed a second Ghost newsletter2024

SandorWeisz moved about 1,400 Mailchimp subscribers into a Ghost site that was already two years old, as a second newsletter. About 400 of them were already members of the first newsletter. He turned on Subscribe new members on signup so the import would opt people into the new one. Existing members were not subscribed. The next send went to 1,000 people, not 1,400. He noted that Ghost's own import docs leave existing members' preferences alone. Replies pointed at the Admin API update-member call and at gctools, which can subscribe members who share a label. He said those options looked like what he needed. He did not report that he had finished the fix.

What they recommend
  • Diff the import against people who are already Ghost members before you rely on Subscribe new members on signup.
  • Plan a second step for existing members. The import will not change their newsletter choices when they remain subscribed.
Worth noticing
  • The new-member signup setting did not add 400 existing members to the second newsletter.
  • The shortfall showed up as a send to 1,000 recipients instead of the 1,400 he had imported.
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. Ghost: migrating from MailchimpAccessed 2026-11-04
  2. Ghost: import membersAccessed 2026-11-04
  3. Mailchimp: view or export your contactsAccessed 2026-11-04