Migration·7 min read·

Ghost to VeloCMS export and import

Ghost's JSON export contains everything — posts, members, tiers, and images. The VeloCMS migration CLI converts Ghost's format to VeloCMS's block AST in one command.

Ghost exports all your content in a single JSON file via Settings Labs Export your content. This file contains posts, pages, tags, members, and image references — everything the VeloCMS migration CLI needs to do a complete migration. For most Ghost blogs, the migration takes under 30 minutes.

Step 1 — Export from Ghost

In your Ghost admin, navigate to Settings Labs and click Export your content. Ghost downloads a ghost-export-YYYY-MM-DD.json file. If your blog has images stored in Ghost Pro's image CDN (ghost.io), the export includes the full image URLs — the migration CLI downloads and re-uploads them to your VeloCMS R2 bucket. For Ghost self-hosted, images are in /content/images/ — export that directory separately using the same tar archive method described in the self-hosted WordPress guide.

Step 2 — Convert and import

Run velocms-migrate ghost-to-json --input ghost-export.json --output posts.json. Ghost uses Mobiledoc format for post content (an older JSON format similar to VeloCMS's block AST but with different node types). The converter handles all standard Mobiledoc card types: image, markdown, html, embed, code, and hr. Custom Ghost cards are converted to raw HTML callout blocks with a warning comment — review those manually after import.

Ghost's member tier system maps to VeloCMS's membership tiers. Free members import as free-tier blog_members. Ghost's Complimentary and Paid members import as the closest matching VeloCMS tier (Pro by default). You can bulk reassign tiers in Admin Members after import.

Step 3 — Members migration

Ghost exports member email addresses, subscription status, and signup dates. After importing posts, go to Admin Members Import CSV and upload the members CSV from the migration output directory. VeloCMS sends each imported member a re-consent email (required by GDPR when changing data controllers). Members who click the confirm link are migrated to active VeloCMS membership; those who don't are quarantined for 30 days then auto-deleted.

Post-migration checklist

Check that your Ghost custom integrations (Mailchimp, Zapier, analytics) are reconfigured in VeloCMS. Ghost's member portal links in your content will be broken — the migration CLI flags them in a report, and you'll need to replace them with VeloCMS's /member/login URL. Run the verification step to catch broken links before going live. See also 'VeloCMS migration checklist pre-launch' for a comprehensive pre-launch review.