New: Get 2 months free on any annual plan. Claim offer →

How to Migrate from Ghost to WordPress

A Ghost site with 200 posts usually moves to WordPress in two to four hours of hands-on work, and most of that time goes to images and redirects rather than the content itself. Learning how to migrate from Ghost to WordPress comes down to four things: exporting the JSON file, importing it with a converter, re-hosting your images, and matching your old URL structure. Get those right and your search traffic barely flinches.

Ghost is a clean publishing tool, but it gets restrictive once you want memberships, custom post types, WooCommerce, or a plugin someone built five years ago. WordPress powers roughly 43% of all websites according to W3Techs, so the ecosystem gap is real.

What transfers cleanly and what you rebuild by hand

Your Ghost export is a single JSON file containing posts, pages, tags, authors and publish dates. That part travels well. Everything sitting outside that file needs manual attention.

  • Moves automatically: post titles, body content, excerpts, slugs, tags, authors, draft/published status and timestamps.
  • Moves with extra steps: images (the JSON stores URLs, not files), internal links, code injection snippets and structured data.
  • Doesn’t move at all: your Ghost theme, member records with active Stripe subscriptions, newsletter settings, and any Ghost-specific cards like bookmarks or toggles.

Plan for the theme rebuild before you start. Nobody has ever ported a Handlebars theme to PHP in an afternoon, and pretending otherwise turns a calm migration into a stressful one.

Set up the destination before you touch the export

Install WordPress on your new host first, on a staging domain or subdomain, so you can break things freely. We’d rather see a client test three imports on staging than one panicked import on a live domain.

  1. Provision the WordPress install. If budget matters more than bells and whistles, a solid cheap WordPress hosting plan handles a typical blog with room to spare.
  2. Confirm PHP 8.1 or newer, at least 256 MB memory limit, and a 64 MB upload cap. Import failures are almost always memory or timeout related.
  3. Set your permalink structure now, before importing, under Settings then Permalinks.
  4. Take a full Ghost backup from the admin area, including the content export and the images folder if you’re self-hosting Ghost.
  5. Record your current organic traffic and top 20 landing pages so you have a baseline to compare against later.

Exporting content out of Ghost

In Ghost admin, go to Settings, then Labs (Migration on newer versions), and click Export your content. You’ll get a file named something like site.ghost.2026-03-14.json. Ghost’s own migration documentation confirms this JSON is the canonical content archive.

Open the file in a text editor and search for “mobiledoc” or “lexical”. Newer Ghost versions store content in Lexical format, older ones in Mobiledoc, and your converter needs to support whichever you have. If you’re on Ghost 5.x or later, assume Lexical.

Self-hosted Ghost users should also grab the /content/images directory over SFTP. Ghost(Pro) customers can’t do that, which is why the image step later relies on a URL scraper instead.

Converting and importing the JSON

WordPress can’t read Ghost JSON natively, so you convert it to WXR (WordPress eXtended RSS) first. There are two practical routes.

Route one: a Ghost to WordPress converter

Free browser-based converters take the JSON and hand back an XML file. Then install the official WordPress Importer plugin, go to Tools then Import, upload the XML, assign authors and tick the box to download and import file attachments.

Route two: a dedicated import plugin

Plugins that read Ghost JSON directly skip the conversion step and generally handle Lexical content better. They also tend to map Ghost tags to WordPress categories or tags depending on your preference, which saves a taxonomy cleanup later.

Either way, run the import on a site with zero existing posts. Importing twice creates duplicates with -2 slugs, and untangling 400 duplicate URLs is genuinely miserable work.

Getting the images onto your own server

After import, most images still point at your old Ghost domain. If that domain expires, every image breaks at once. Fix it with an auto-upload images plugin that scans post content, pulls remote files into the WordPress media library, and rewrites the URLs in the database.

Run it in batches of 50 to 100 posts on shared hosting. Then spot-check ten posts across different years, because Ghost’s responsive image srcset variants sometimes import as separate broken entries.

Matching URLs and setting up redirects

Ghost defaults to a flat structure, yoursite.com/post-slug, while WordPress often defaults to a dated structure. The cleanest approach is matching Ghost exactly: set permalinks to Custom Structure with /%postname%/.

Where URLs genuinely change (tag archives become /tag/ or /category/, author pages shift paths), use 301 redirects. Google’s guidance on site moves with URL changes is clear that permanent redirects pass ranking signals, but they need to point to the closest equivalent page, not the homepage.

  • Map every old URL to a new one in a spreadsheet before cutover.
  • Implement redirects at the server level where possible, since they’re faster than plugin-based rules.
  • Resubmit an updated XML sitemap in Search Console the same day you go live.
  • Watch Coverage and Page Indexing reports daily for the first two weeks.

Expect a mild ranking wobble for seven to fourteen days. Sites that keep slugs identical and redirect properly typically recover full traffic inside a month.

Moving members, newsletters and paid subscriptions

Ghost members export as a CSV containing email, name, subscription status and signup date. That CSV imports into most WordPress membership plugins, but Stripe subscriptions do not transfer automatically.

You’ll need Stripe’s subscription migration support or a manual re-authorisation flow, and you should email paying members before the switch. For the free list, exporting to a newsletter plugin or an ESP like MailerLite or ConvertKit is usually less painful than running email from your own server.

If memberships are central to the business, the hosting side matters too: logged-in traffic bypasses page caching, so plan for the extra load.

Rebuilding the front end

Don’t try to clone your Ghost theme pixel for pixel on day one. Pick a lightweight block theme, match typography and spacing roughly, then refine once the content is verified.

Keep the plugin count lean. Twelve to eighteen plugins covers almost any editorial site, and each extra one adds update and security surface. Teams running several sites should look at bulk plugin management workflows early rather than after the sprawl starts.

Developers who like version control can push theme changes through a Git-based WordPress hosting workflow instead of editing files over SFTP.

The first week after cutover

Once DNS points at WordPress, run through a short verification pass. Check that SSL is active on the new host, that no staging site is still indexable, and that your analytics tracking fires on the new templates.

Crawl the site with a tool like Screaming Frog and filter for 404s and broken images. WordPress is a bigger attack surface than Ghost, so confirm your host does server-level threat monitoring and daily backups before you relax.

Frequently Asked Questions

How long does a Ghost to WordPress migration take?

Most blogs under 300 posts take two to four hours of active work, plus 24 to 48 hours for DNS propagation and verification. Sites with memberships, custom themes or thousands of images should budget one to two full days.

Will I lose Google rankings when I switch?

Expect a temporary dip of 5% to 15% for one to two weeks if slugs stay the same and 301 redirects are in place. Sites that change URL structures without redirects can lose 40% or more, and recovery takes months.

Do images come across in the Ghost export?

No, the JSON export contains image URLs only, not the actual files. You either copy the /content/images folder from a self-hosted Ghost install or use an auto-upload plugin to pull remote images into the WordPress media library after import.

Can I move paid Ghost members to WordPress?

Member records move via CSV, but active Stripe subscriptions need a separate migration through Stripe or a fresh checkout from each subscriber. Contact paying members at least a week before cutover to explain what changes.

Is there a free way to migrate from Ghost to WordPress?

Yes. A free JSON to WXR converter plus the official WordPress Importer plugin costs nothing beyond your hosting, and handles posts, pages, tags and authors. Paid tools mainly save time on images and redirect mapping.

Should I keep Ghost running during the switch?

Keep the Ghost instance live for at least 30 days after cutover as a fallback and an image source. Cancelling immediately removes your ability to re-export if something in the import looks wrong.

Planning a move off Ghost?

Our team handles the export, conversion, image re-hosting and redirect mapping as part of a free WordPress migration, usually with under five minutes of downtime. Start a trial or talk to a specialist about your post count and member list, and we’ll tell you exactly what the move involves.

← Previous Shopify vs. WooCommerce: The Total Cost of Ownership in 2026

1 Comment

  1. Bulk Managing WordPress Plugins Across 50+ Client Sites

    […] We cover this topic in more depth in How to Migrate from Ghost to WordPress. […]

Leave a Comment

Your email address will not be published. Required fields are marked *