Ghost to VeloCMS export and import
Ghost's JSON export contains everything — posts, members, tiers, and images. VeloCMS's web-based import wizard at Admin → Tools → Import handles the whole thing, no CLI or conversion script required.
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 VeloCMS's import wizard 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. Whether your images live on Ghost Pro's CDN (ghost.io) or self-hosted at /content/images/, the export references them by full public URL — as long as your Ghost site stays live during import, VeloCMS's importer follows those URLs directly and re-uploads each image to your Cloudflare R2 bucket automatically. There's no separate image archive step.
Step 2 — Import into VeloCMS
Log in to VeloCMS admin, go to Admin → Tools → Import, and upload the ghost-export.json file directly. VeloCMS maps Ghost's post fields to the VeloCMS post model — title, slug, HTML body, published_at, and tags all carry over cleanly. Ghost uses Mobiledoc format internally for post content; standard card types (image, markdown, html, embed, code, divider) convert automatically. Custom Ghost cards or theme-specific formatting may need manual cleanup after import — review a few posts with unusual layouts first.
Step 3 — Members migration
In Ghost admin, go to Members → Export members. You'll get a CSV with columns like email, name, subscribed_at, stripe_customer_id, labels, and complimentary_plan. In VeloCMS admin, go to Admin → Members → Import CSV. The importer expects email, name, subscribed_at as minimum columns. If you have paid members, reconnect the same Stripe account you used on Ghost first (Admin → Settings → Membership → Connect Stripe with your BYOK key) so VeloCMS can look up active subscribers by email and restore their paid status automatically during import.
If a member cancelled on Ghost, their Stripe subscription is inactive. VeloCMS imports them as free members regardless — you can't restore a cancelled subscription; they need to re-subscribe at your new VeloCMS price.
Post-migration checklist
Check that your Ghost custom integrations (Mailchimp, Zapier, analytics) are reconfigured in VeloCMS. Ghost's member portal links inside your post content will be broken — search your imported posts for /members/ or portal-related links and replace them with VeloCMS's /member/login URL. Click through a handful of posts to catch broken links before going live. See also 'VeloCMS migration checklist pre-launch' for a comprehensive pre-launch review.