Guides

Moving from Substack, beehiiv, WordPress or Ghost

Bring your archive with you: every published post becomes an issue on your FlockStack website, on its original date, and the old links keep working. Nothing is emailed to your readers.

1. Download your posts

FromWhere to find it
SubstackIn Settings, under Import/Export, start a new one. Substack emails a ZIP: upload the whole ZIP as it is, where posts.csv lists the posts and the posts folder has their text.
beehiivIn Settings, open Export Data and start the one for posts. Its download link lasts 24 hours. Upload the CSV.
WordPressIn Tools, open Export, pick Posts and download the file. Upload the XML file.
GhostIn Settings, open Import/Export (Labs on older versions) and download your content. Upload the JSON file, and give your site's address so its pictures come along.

Files up to 40 MB are read. A ZIP with one of these files inside works too.

2. Import them

In the dashboard, open Settings, then Import posts, pick the file and press Read the file. You see how many published posts it has, how many are for paid subscribers and the newest titles. Nothing is imported until you press Import. It runs in the background: you can close the page, and we email you the report.

From the REST API or MCP, create_post_import reads the file (as base64 under 10 MB, or an https:// link) and answers with the preview, start_post_import starts it and get_post_import follows it.

Terminal
curl -X POST $FLOCKSTACK_URL/api/v1/post-imports \
  -H "Authorization: Bearer $FLOCKSTACK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/substack-export.zip"}'

curl -X POST $FLOCKSTACK_URL/api/v1/post-imports/<id>/start \
  -H "Authorization: Bearer $FLOCKSTACK_API_KEY"

What moves

  • Each published post becomes an issue already sent on its original date, listed on your website. No email goes out and nothing counts toward your month's emails; its stats stay at zero.
  • Its title, its subtitle or excerpt (the preview text), its address's slug and its author. Slugs are unique across FlockStack, so a slug someone else has gets a number at the end, and its old address redirects there. An author who isn't your newsletter's keeps their name on the issue.
  • The text, cleaned like the editor's: headings, paragraphs, lists, quotes, links, tables and pictures stay; the old platform's styles, scripts, signup forms and placeholders go.
  • Pictures are copied to FlockStack's CDN, 4 MB each at most and 10,000 per import. One that can't be fetched keeps its old address and is counted in the report.
  • Posts for paid subscribers become issues for your paid readers: the website shows a teaser. Set up your paid subscription so readers can subscribe to read them.

What doesn't

  • Subscribers: download them from the old platform and use the contact import on the Contacts page (or import_contacts), which reads Substack's, beehiiv's and Ghost's files as they are.
  • Paid subscriptions: moving them from your Stripe account is a separate feature, coming next.
  • Drafts, pages, podcasts and their audio, comments, tags, and embedded videos, polls and posts, which keep only their text or link.

Limits

On FlockStack Cloud each plan caps the new posts one import adds, the newest first, and what the pictures of all your imports may weigh together. Posts past the cap are counted in the report. A self-hosted server has no caps.

PlanPosts per importImported pictures
Starter5001 GB
Growth1,5003 GB
Pro3,0006 GB
Scale5,00010 GB
Max10,00025 GB

Importing the same file again is safe: posts you already imported are skipped, so it only adds what is missing.

Keep your old links

Each imported post gets a redirect from its old address (Substack: /p/<slug>; beehiiv: /p/<slug>; WordPress: the post's permalink, like /2023/05/12/hello-world/; Ghost: /<slug>/) to its new page. They work once the old address points at FlockStack:

  1. On the Domains page, add your domain, and as the website's address enter the one your old site used, like news.example.com.
  2. At your DNS provider, change that name's record to the CNAME the Domains page shows, in place of the one that pointed at Substack, beehiiv, WordPress or Ghost. Remove any A or AAAA records on the same name.
  3. Press Check on the Domains page. Once it's verified, your website answers on that address and every old link lands on its issue with a permanent redirect (301), which search engines follow.

Addresses the old platform owns, like yourname.substack.com, can't point anywhere else, and a site at the root of a domain (example.com) can't point at FlockStack: their old links stay with the old platform.

Add your own redirects in Settings, under Redirects, one at a time or as a CSV of from,to rows (1,000 a file), or with add_redirect and import_redirects. A path matches without case, query or trailing slash, and a redirect keeps the visitor's query string. Your website's own pages (/, /feed.xml, /shop, /subscribe) can't redirect. A website has 25,000 redirects at most, and a change shows within a minute.

redirects.csv
from,to
/p/old-post,/p/new-post
/2023/05/12/hello-world/,/p/hello-world
/about,https://example.com/about