← All playbooks
Newsletter migration

Ghost → Beehiiv

Move a Ghost publication to Beehiiv with the first-party Content Import and subscriber CSV. Temporarily un-paywall posts because Ghost's Content API only returns public content. Map paid Stripe subscriptions, then pause Ghost billing so nobody is charged twice.

Typical timeline8–16 business days22–44 hours active work
Statusneeds review
Source profileGhost export and integrations docs reviewed 2026-10-29
Destination profileBeehiiv Ghost migration and paid-import docs reviewed 2026-10-29
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

Ghost

Reasons to stay
  • A focused publishing and membership platform is fast and pleasant for writers
  • Editors get a purpose-built publishing workflow instead of raw files
Reasons to leave
  • Its narrower ecosystem is less suitable for complex sites and custom application behavior
  • Themes, extensions, and content models add maintenance and portability constraints
New platform

Beehiiv

What gets better
  • Newsletter publishing, growth, referrals, and monetization are tightly integrated
  • Audience, campaigns, automations, and reporting live in one publishing system
What gets worse
  • Complex lifecycle automation and broader marketing workflows are comparatively limited
  • Automation logic, analytics history, and deliverability settings are not very portable
Best of the move

Beehiiv: Newsletter publishing, growth, referrals, and monetization are tightly integrated. This removes a major source-side concern: Its narrower ecosystem is less suitable for complex sites and custom application behavior.

Worst of the move

What you lose: A focused publishing and membership platform is fast and pleasant for writers. What you inherit: Complex lifecycle automation and broader marketing workflows are comparatively limited.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 6, Manual rebuild: 4, Not transferred: 2.
Clean0
Partial6
Manual4
Lost2
Mapping route8 of 9 fields have a destination path

This timeline assumes

  • One Ghost site with posts, members, and at most one Stripe account you still control.
  • You can create a Ghost custom integration. Beehiiv says Starter plans cannot, and documents a data-key workaround from a published post.
  • You will set a default Beehiiv post style before import. After import, styling is per post.
  • Ghost remains recoverable. Paid content is set back to paid or the site is made private after the API import.
  • We pause Ghost or old Stripe billing after a paid import so Beehiiv is the only charger.
02What transfers

What survives the move.

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

ItemOutcomeImpactWhat happensMitigation
Public postspartialcriticalBeehiiv imports Ghost through Settings → Content Import using a Content API key and API URL. It says imports often take 5–15 minutes and reports a Complete count.Set the default post style first. Compare the Complete count to Ghost.
Paywalled postsmanualcriticalBeehiiv says the Content API only exposes public posts. You must set paid posts to Public, import, then restore paywalls in Beehiiv and in Ghost.Bulk-change access, import, restore Ghost access or make the site private, then recreate Beehiiv paywalls.
Authors and tagspartialmediumThe importer lets you toggle authors and tags off.Leave them on unless you have a reason to drop them, then check bylines.
Ghost theme and cardspartialhighA Handlebars theme does not run on Beehiiv. Cards and email-only sections need a visual pass.Open imported posts on web and in email preview.
Free memberspartialcriticalGhost can export members as CSV. Beehiiv imports free subscribers separately from paid ones.Export members, filter statuses, and import free readers first.
Paid members and StripepartialcriticalBeehiiv's paid import copies active subscriptions from an old Stripe account into the Stripe account connected to Beehiiv. It keeps price points. It does not cancel the old charges.Run the paid tool, reconcile customer ids, then pause or cancel billing on the Ghost Stripe account.
Ghost membership tiersmanualhighYou map each Ghost Stripe product to a Beehiiv tier. Unmapped products do not become access.Write the product-to-tier map before you import paid readers.
Community posts and commentslostmediumBeehiiv's community migration note says posts, discussions, and channels start empty.Tell members the forum starts fresh if you use that product.
Sending domainmanualcriticalGhost mail settings do not become Beehiiv authentication.Set SPF, DKIM, and DMARC on Beehiiv and send a seed before the list.
Ghost Admin API versus Content APImanualhighThe documented importer wants the Content API. Starter users may have to scrape data-key from a published post.Create a custom integration when the plan allows it. Treat the data-key path as a last resort and rotate it later.
Analytics and revisionslostmediumGhost stats and post history stay in Ghost.Export what you still need and keep the Ghost JSON export.
URLspartialhighBeehiiv web posts use /p/ paths. Ghost slugs need redirects.Map Ghost permalinks to Beehiiv URLs before DNS cutover.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Ghost Content APIBeehiiv Content ImportautomaticPaste Content API key and API URL.
Paid Ghost postTemporarily public Ghost post, then Beehiiv paywallmanualRestore Ghost access after import.
AuthorBeehiiv authortransformToggle is optional in the importer.
TagBeehiiv tagtransformToggle is optional in the importer.
Member emailBeehiiv subscribertransformImport free and paid on different paths.
Stripe subscriptionBeehiiv paid subscribertransformThen pause old Stripe billing.
Ghost Stripe productBeehiiv tiermanualMap every live price.
Ghost permalinkBeehiiv /p/ URL plus redirectmanualDo not assume the slug is enough.
Ghost JSON exportOffline archiveunsupportedKeep it even after a successful API import.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep Ghost JSON, members, and Stripe evidence before you un-paywall anything.

  1. Download the Ghost content export.
  2. Export members with status, labels, and Stripe ids.
  3. Record paid post counts and product ids.
  4. Create the Beehiiv publication and default post style.
  5. Connect the destination Stripe account.

Proof to capture: A dated manifest lists Ghost JSON, member CSV, paid counts, and the Stripe account pair.

Transformation · Beehiiv Settings → Content Import

Content API import

Move posts the way Beehiiv documents.

  1. Add a Ghost custom integration or use the documented Starter data-key path.
  2. Un-paywall paid posts.
  3. Import, wait for Complete, then restore Ghost access.

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

Transformation · Beehiiv paid subscriber import

Paid Stripe map

Keep prices and stop double charges.

  1. Map each Ghost Stripe product to a Beehiiv tier.
  2. Import active paid readers.
  3. Pause or cancel the old Stripe subscriptions Beehiiv just copied.

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

Paid posts stay public

criticalpossible likelihood

You un-paywalled Ghost for the API and forgot to lock it again.

Consequence
Paying readers' archive is free on the old host.
Mitigation
Restore paid access or make the Ghost site private as soon as the import reports Complete.

Stop if: A paid Ghost URL is still public after import.

Cutover

Old Stripe still charges

criticalpossible likelihood

Beehiiv copied subscriptions and the Ghost Stripe account is still live.

Consequence
Readers are billed twice.
Mitigation
Pause or cancel old subscriptions after a successful paid import.

Stop if: A seed paid reader is charged by both accounts.

Inventory

Starter API workaround

highpossible likelihood

The plan cannot add a custom integration and the scraped data-key is wrong.

Consequence
The import is empty or incomplete.
Mitigation
Upgrade enough to add an integration, or confirm the key against a known post count.

Stop if: The Complete count is far below Ghost.

06Precise timeline

Do the work in this order.

Estimate forOne Ghost publication with members and optional Stripe paid tiers
Total elapsed8–16 business days
Active work22–44 hours
BufferAdd time for a large paid archive, Starter API limits, or a messy Stripe map.
01
Days 1–2Inventory1–2 days
02
Days 2–3Export1 day
03
Days 3–8Import rehearsal3–5 days
04
Days 8–12Production import2–3 days
05
Days 12–16Watch billing and mail4–5 days
  1. Days 1–2 · inventory

    Inventory

    4–7 hours active1–2 days elapsedStripe access waiting
    • Count posts, members, and products.
    • Create the Beehiiv default style.
    • Decide the API key path.

    Depends on: Ghost, Beehiiv, and Stripe admin access

    Stop / go checkpoint

    Export?

    Go when: Paid posts and Stripe products have owners.

    Stop when: You cannot create an integration and have no fallback key.

  2. Days 2–3 · backup

    Export

    2–4 hours active1 day elapsedGhost export waiting
    • Download Ghost JSON and members.
    • Connect destination Stripe.

    Depends on: Approved inventory

    Stop / go checkpoint

    Import?

    Go when: Exports match Ghost totals.

    Stop when: The member export is missing status.

  3. Days 3–8 · pilot

    Import rehearsal

    8–16 hours active3–5 days elapsedContent Import waiting
    • Import posts on a staging publication if you can.
    • Un-paywall, import, restore access.
    • Test one paid Stripe map.

    Depends on: Verified export

    Stop / go checkpoint

    Cut over?

    Go when: Post counts, paywalls, and a paid seed pass.

    Stop when: Paid Ghost URLs stay public or Stripe map is wrong.

  4. Days 8–12 · cutover

    Production import

    5–10 hours active2–3 days elapsedImport and DNS waiting
    • Run Content Import.
    • Import free then paid subscribers.
    • Pause old Stripe. Replace forms and DNS.

    Depends on: Passed pilot

    Stop / go checkpoint

    Send?

    Go when: Beehiiv is the only sender and charger.

    Stop when: Ghost still bills or still sends.

  5. Days 12–16 · observe

    Watch billing and mail

    3–7 hours active4–5 days elapsedRenewals and first send waiting
    • Watch Stripe invoices.
    • Send a seed, then a cohort.

    Depends on: Successful cutover

    Stop / go checkpoint

    Close rollback?

    Go when: No double charge and one clean send.

    Stop when: A renewal hits the old account.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Beehiiv the only public archive, sender, and charger.

Recommended window: A weekday when you can watch Stripe for 24 hours after the paid import.

  1. Set the default post style and un-paywall Ghost posts.
  2. Run Content Import and restore Ghost access or privacy.
  3. Import free members, then paid Stripe subscribers.
  4. Pause old Stripe billing.
  5. Switch forms, redirects, and DNS. Send a seed.

Proof to capture: Beehiiv has the posts and members. Ghost is not public with paid posts. Only one Stripe account charges.

Return to safety

Rollback

Return publishing, sending, and billing to Ghost.

Deadline: Before the next Stripe renewal batch if you paused the old account.

  1. Stop Beehiiv sends and pause Beehiiv Stripe if it is charging.
  2. Restore Ghost public DNS, forms, and paid access.
  3. Resume Ghost Stripe only if you paused it and Beehiiv is no longer charging.
  4. Export Beehiiv-era signups and apply reviewed rows to Ghost.
  5. Send a Ghost seed.

Proof to capture: Ghost is public and charging at most once. Beehiiv is not sending.

Rollback immediately when
  • Paid Ghost URL still public
  • Double Stripe charge
  • Import count short
  • Missing paid tier map
  • Both systems send
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-01BlockingPost countCompare Ghost published posts to Beehiiv Complete count.Every scoped post is present or signed as skipped.Import table.
V-02BlockingGhost locked againOpen a paid Ghost URL while logged out.The post is not free on Ghost after import.Incognito screenshot.
V-03BlockingBeehiiv accessOpen the same post as free and as paid on Beehiiv.Gating matches the map.Access matrix.
V-04BlockingFree membersCompare approved Ghost free emails to Beehiiv.Counts match or exceptions are signed.Member sheet.
V-05BlockingStripe mapReconcile customer id, price, and status.Every active paid reader has one Beehiiv tier and one charger.Stripe export.
V-06BlockingNo double chargeInspect the old Stripe account for live subscriptions.Old account is paused or cancelled after import.Stripe screenshot.
V-07BlockingAuth and seedSend to a seed list and read headers.SPF and DKIM pass. Ghost did not also send.Headers.
V-08BlockingGhost exportConfirm Ghost JSON and the old host still boot.You can point DNS back.Rollback note.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One Beehiiv send, one Stripe renewal cycle with a single charger, and 14 days without a rollback trigger.

  1. Archive Ghost JSON, member CSV, and import reports.
  2. Revoke the Ghost integration key used for import.
  3. Keep Ghost private or read-only through retention.
  4. Remove leftover Ghost embeds.
  5. Document the Beehiiv publication and Stripe account.
  6. Schedule the next DNS and billing review.
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. Beehiiv: migrate from GhostAccessed 2026-10-29
  2. Beehiiv: import paid subscribersAccessed 2026-10-29
  3. Ghost: export content and dataAccessed 2026-10-29