Migration·8 min read·

Substack newsletter import (members + posts)

Substack's export includes your posts as HTML and your subscriber list as a CSV. Here's how to import both through VeloCMS's web-based import wizard — no CLI, no conversion script.

Substack's export includes your posts as HTML files, your subscriber list as a CSV with email and paid status, and your podcast episodes if you have any. VeloCMS's import wizard at Admin → Tools → Import → Substack handles the posts and free subscribers directly; paid subscribers need a manual reconnection step since their billing lives on Substack's Stripe account, not yours.

Step 1 — Request your Substack export

In Substack, go to Settings Exports and click Start new export. Substack emails you a download link within a few minutes (large publications may take up to 30 minutes). Download the zip archive — it contains posts/ (HTML), subscribers.csv, a metadata JSON with post dates and slugs, and paid_subscribers.csv if applicable.

Step 2 — Import posts

In VeloCMS admin, go to Admin → Tools → Import → Substack and upload the .zip file directly — no conversion step needed. VeloCMS reads the metadata JSON for slugs and publish dates, then imports each HTML post into the editor. Formatting carries over reasonably well: headers, bold, links, and images (as URL references). Substack footnotes and custom embeds (Spotify, Twitter cards) may not render and need manual cleanup.

Step 3 — Import free subscribers

The subscribers.csv has at minimum: email, first_name, last_name, and created_at. In VeloCMS Admin → Members → Import CSV, upload it and map columns to VeloCMS fields. Free subscriber status carries over for everyone in this CSV who isn't in paid_subscribers.csv.

Do not silently migrate paid Substack subscribers to a paid VeloCMS membership without their consent. They agreed to pay Substack's payment processing, not yours — you were never the merchant on their subscription. Export paid_subscribers.csv from Substack, import them as members with a 'paid' flag set manually, and send a transparent migration email inviting them to resubscribe at your new VeloCMS membership page.

Step 4 — Reconnect paid subscribers through your own Stripe

Go to Admin → Settings → Membership → Connect Stripe and paste your own Stripe secret key (not Substack's). Set up your paid membership tiers, then share the link to your new /member/subscribe page with your migrated audience. Many paid subscribers will follow if you make the ask clear — offering a short free period as a thank-you helps.