Skip to content

How to migrate from WordPress to Ghost

How do you migrate a WordPress site to Ghost?

ModerateEstimated time: 4-8 hoursLow data-loss riskFrom: wordpress To: ghost

Why migrate from WordPress to Ghost?

Most WordPress-to-Ghost moves are driven by editorial workflow, not performance. WordPress's block editor (Gutenberg) is powerful but heavy; Ghost's editor is minimal and shaped around long-form prose. Ghost ships with a native newsletter + member-paywall layer that on WordPress typically requires Mailchimp ($30+/mo) plus a paid membership plugin (MemberPress, Paid Memberships Pro). For a publication that's primarily articles + email, Ghost is a single license that replaces three WordPress integrations.

Performance is a secondary win. Ghost's default theme is server- rendered Handlebars with no PHP-plugin sprawl, so default Lighthouse scores tend to be higher out of the box than a typical WooCommerce-or-Yoast WordPress install -- though a well-tuned WordPress site with caching can match or beat it.

The trade is tooling and ecosystem. WordPress has a plugin for everything; Ghost is opinionated and gives you Handlebars + a content API + Zapier. If your site depends on form builders, custom post types, or a marketplace plugin (Easy Digital Downloads, WooCommerce), Ghost is not a replacement.

Before you start

  • Current WordPress version. Admin -> Tools -> Site Health -> Info. The exporter requires WP 4.7+ for the REST API.
  • Pick a Ghost host. Ghost(Pro) Starter is $9/mo and the fastest path. Self-hosted requires Node 18+, a Postgres or MySQL database, and an SMTP relay (Mailgun, Postmark) for email.
  • Backup. Full WordPress DB dump + the entire wp-content/uploads directory. The exporter does not transfer files; you'll re-upload.
  • Block out a quiet window. Image re-upload to Ghost takes measurable time on >500-post sites and runs serially.

Step-by-step migration

1. Export WordPress content

Install the official Ghost exporter plugin:

wp plugin install ghost --activate
wp ghost export --output=/tmp/ghost-export.json

If you don't use WP-CLI, install via Plugins -> Add New -> search "Ghost" -> Install -> Activate, then Tools -> Export to Ghost -> Download Ghost File.

The output is a single JSON file containing posts, pages, tags, authors, and metadata. Images are referenced by their original WordPress URLs.

2. Import into Ghost

In Ghost Admin: Settings -> Labs -> Import content -> Choose File -> upload the JSON. Ghost downloads referenced images from your WordPress origin during import. Keep WordPress online until the import completes, otherwise images will be missing.

WordPress's default permalink is /2024/04/my-post/; Ghost's is /my-post/. Without a redirect, every existing inbound link 404s and you lose the ranking equity those links carry.

In nginx (front of Ghost):

location ~ ^/(\d{4})/(\d{2})/(.+?)/?$ {
    return 301 /$3/;
}

If you used a non-default WordPress permalink structure, mirror the same pattern. Test with curl -I https://your-domain.com/old-url/ and confirm a 301 to the new path.

4. Migrate subscribers

Ghost's member system imports CSV directly. Export your existing list (Mailchimp, ConvertKit, etc.) as CSV with at least an email column. In Ghost Admin: Members -> Import -> CSV. Existing Mailchimp subscribers do NOT receive a re-confirmation email, so double-check your privacy policy + unsubscribe history before mass import.

5. Pick a Ghost theme

Ghost themes use Handlebars, not PHP. Unless you need a pixel-exact re-creation of your WordPress design, pick a pre-built theme from the Ghost marketplace. Casper (the default) is a sensible starting point.

For a custom theme, fork an existing one and edit default.hbs, index.hbs, post.hbs. The Ghost theme docs are short enough to read in one sitting.

What doesn't migrate automatically

  • WooCommerce products + orders. Ghost has no e-commerce primitive. If you sell physical goods, stay on WordPress or move to Shopify.
  • Comments. Ghost intentionally has no native commenting; use Disqus, Cusdis, or Ghost's own Tip & Comment beta.
  • Custom post types (CPTs). Collapse to Ghost's post + tag model. A CPT like "case-study" becomes a post tagged case-study.
  • ACF / Meta Box custom fields. Lost on import. Move critical metadata into the post body before exporting.
  • Form submissions. Forms themselves don't transfer; use Ghost's native signup forms + Zapier or Make to route data.

Common pitfalls

  • Underestimating image re-upload time. Ghost downloads every referenced image from your WordPress origin during import. For a 1000-post site with media-heavy posts, this can take 30+ minutes. Don't take WordPress offline until it finishes.
  • Custom URL structures break. If you used /category/post/ on WordPress, the simple two-segment redirect above won't catch it. Map the full set of WordPress permalink rules to nginx rewrites before cutover.
  • Missing tags vs categories. Ghost has only tags. Decide which WordPress categories to merge into tags + which to drop before importing.
  • Email deliverability dip. New Ghost installs send from a new IP. Warm the IP via Postmark / Mailgun's onboarding before blasting your full subscriber list.

How BeaverCheck measures the difference

Avg performance: wordpress vs ghostAvg performance: wordpress vs ghost0255075100wordpressghost

We've audited 713 WordPress sites and 3 Ghost sites. Average Lighthouse performance: WordPress 45 / 100, Ghost 57 / 100, a difference of +12 points.

Want to see your current WordPress audit before migrating? Run a free audit on BeaverCheck -- the report shows your Core Web Vitals + every issue Ghost would inherit.

Further reading

Related migrations

Send Feedback