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.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Ghost
- A focused publishing and membership platform is fast and pleasant for writers
- Editors get a purpose-built publishing workflow instead of raw files
- Its narrower ecosystem is less suitable for complex sites and custom application behavior
- Themes, extensions, and content models add maintenance and portability constraints
Beehiiv
- Newsletter publishing, growth, referrals, and monetization are tightly integrated
- Audience, campaigns, automations, and reporting live in one publishing system
- Complex lifecycle automation and broader marketing workflows are comparatively limited
- Automation logic, analytics history, and deliverability settings are not very portable
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.
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
Know the shape of the move.
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.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| Public posts | partial | critical | Beehiiv 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 posts | manual | critical | Beehiiv 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 tags | partial | medium | The 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 cards | partial | high | A 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 members | partial | critical | Ghost 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 Stripe | partial | critical | Beehiiv'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 tiers | manual | high | You 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 comments | lost | medium | Beehiiv's community migration note says posts, discussions, and channels start empty. | Tell members the forum starts fresh if you use that product. |
| Sending domain | manual | critical | Ghost 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 API | manual | high | The 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 revisions | lost | medium | Ghost stats and post history stay in Ghost. | Export what you still need and keep the Ghost JSON export. |
| URLs | partial | high | Beehiiv web posts use /p/ paths. Ghost slugs need redirects. | Map Ghost permalinks to Beehiiv URLs before DNS cutover. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Ghost Content API | Beehiiv Content Import | automatic | Paste Content API key and API URL. |
| Paid Ghost post | Temporarily public Ghost post, then Beehiiv paywall | manual | Restore Ghost access after import. |
| Author | Beehiiv author | transform | Toggle is optional in the importer. |
| Tag | Beehiiv tag | transform | Toggle is optional in the importer. |
| Member email | Beehiiv subscriber | transform | Import free and paid on different paths. |
| Stripe subscription | Beehiiv paid subscriber | transform | Then pause old Stripe billing. |
| Ghost Stripe product | Beehiiv tier | manual | Map every live price. |
| Ghost permalink | Beehiiv /p/ URL plus redirect | manual | Do not assume the slug is enough. |
| Ghost JSON export | Offline archive | unsupported | Keep it even after a successful API import. |
Make the move recoverable.
Create the source-of-truth backup
Keep Ghost JSON, members, and Stripe evidence before you un-paywall anything.
- Download the Ghost content export.
- Export members with status, labels, and Stripe ids.
- Record paid post counts and product ids.
- Create the Beehiiv publication and default post style.
- Connect the destination Stripe account.
Proof to capture: A dated manifest lists Ghost JSON, member CSV, paid counts, and the Stripe account pair.
Content API import
Move posts the way Beehiiv documents.
- Add a Ghost custom integration or use the documented Starter data-key path.
- Un-paywall paid posts.
- Import, wait for Complete, then restore Ghost access.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Paid Stripe map
Keep prices and stop double charges.
- Map each Ghost Stripe product to a Beehiiv tier.
- Import active paid readers.
- 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.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
Paid posts stay public
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.
Old Stripe still charges
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.
Starter API workaround
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.
Do the work in this order.
- 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 checkpointExport?
Go when: Paid posts and Stripe products have owners.
Stop when: You cannot create an integration and have no fallback key.
- 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 checkpointImport?
Go when: Exports match Ghost totals.
Stop when: The member export is missing status.
- 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 checkpointCut over?
Go when: Post counts, paywalls, and a paid seed pass.
Stop when: Paid Ghost URLs stay public or Stripe map is wrong.
- 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 checkpointSend?
Go when: Beehiiv is the only sender and charger.
Stop when: Ghost still bills or still sends.
- 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 checkpointClose rollback?
Go when: No double charge and one clean send.
Stop when: A renewal hits the old account.
Cut over with a way back.
Cutover
Make Beehiiv the only public archive, sender, and charger.
- Set the default post style and un-paywall Ghost posts.
- Run Content Import and restore Ghost access or privacy.
- Import free members, then paid Stripe subscribers.
- Pause old Stripe billing.
- 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.
Rollback
Return publishing, sending, and billing to Ghost.
- Stop Beehiiv sends and pause Beehiiv Stripe if it is charging.
- Restore Ghost public DNS, forms, and paid access.
- Resume Ghost Stripe only if you paused it and Beehiiv is no longer charging.
- Export Beehiiv-era signups and apply reviewed rows to Ghost.
- Send a Ghost seed.
Proof to capture: Ghost is public and charging at most once. Beehiiv is not sending.
- Paid Ghost URL still public
- Double Stripe charge
- Import count short
- Missing paid tier map
- Both systems send
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | Post count | Compare Ghost published posts to Beehiiv Complete count. | Every scoped post is present or signed as skipped. | Import table. | |
V-02Blocking | Ghost locked again | Open a paid Ghost URL while logged out. | The post is not free on Ghost after import. | Incognito screenshot. | |
V-03Blocking | Beehiiv access | Open the same post as free and as paid on Beehiiv. | Gating matches the map. | Access matrix. | |
V-04Blocking | Free members | Compare approved Ghost free emails to Beehiiv. | Counts match or exceptions are signed. | Member sheet. | |
V-05Blocking | Stripe map | Reconcile customer id, price, and status. | Every active paid reader has one Beehiiv tier and one charger. | Stripe export. | |
V-06Blocking | No double charge | Inspect the old Stripe account for live subscriptions. | Old account is paused or cancelled after import. | Stripe screenshot. | |
V-07Blocking | Auth and seed | Send to a seed list and read headers. | SPF and DKIM pass. Ghost did not also send. | Headers. | |
V-08Blocking | Ghost export | Confirm Ghost JSON and the old host still boot. | You can point DNS back. | Rollback note. |
Remove the scaffolding safely.
Safe after: One Beehiiv send, one Stripe renewal cycle with a single charger, and 14 days without a rollback trigger.
- Archive Ghost JSON, member CSV, and import reports.
- Revoke the Ghost integration key used for import.
- Keep Ghost private or read-only through retention.
- Remove leftover Ghost embeds.
- Document the Beehiiv publication and Stripe account.
- Schedule the next DNS and billing review.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Beehiiv: migrate from GhostAccessed 2026-10-29
- Beehiiv: import paid subscribersAccessed 2026-10-29
- Ghost: export content and dataAccessed 2026-10-29