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 into VeloCMS while preserving paid subscriber relationships and avoiding GDPR pitfalls.

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. The VeloCMS migration CLI handles all three, mapping paid subscribers to VeloCMS Pro membership and free subscribers to the free tier.

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, and podcast/ (if applicable). Extract the archive to your local machine.

Step 2 — Convert posts

Run velocms-migrate substack-to-json --input ./substack-export/ --output posts.json. Substack exports posts as styled HTML, not a structured format — the converter parses the HTML, extracts heading structure, image tags, and block elements, and converts them to the VeloCMS block AST. Substack-specific elements like the subscription nag boxes and social sharing footers are automatically stripped.

Step 3 — Import subscribers

Substack's subscribers.csv includes email, subscribed_at, paid status, and the end date for paid subscriptions. In VeloCMS Admin Members Import CSV, upload the CSV. The importer creates blog_members records for each subscriber. Paid subscribers are flagged for VeloCMS membership invitation — they receive an email explaining the platform change and a link to reconnect their payment method via Stripe Checkout.

Do not silently migrate paid Substack subscribers to a paid VeloCMS membership without their consent. They subscribed to Substack's payment processing, not yours. The re-consent email is legally required under GDPR Article 13 when changing the data controller. VeloCMS generates this email automatically — don't skip it.

Step 4 — Handling paid subscriber cancellations

If a paid subscriber doesn't re-consent within your migration window (30 days recommended), Substack still charges them for the remainder of their subscription. You need to manually cancel their Substack subscription from your Substack dashboard and issue a prorated refund. VeloCMS's migration report flags which subscribers haven't re-consented after 7 days, giving you time to follow up before the 30-day window closes.