8 min read

How to Migrate From WordPress to Ghost (Without Losing Your Mind or Your Traffic)

Ghost Theme
Ghost Theme June 30, 2026
How to Migrate From WordPress to Ghost (Without Losing Your Mind or Your Traffic)

I'll be honest about why most people end up here. It's rarely because they hate WordPress. WordPress is fine. It runs a huge chunk of the internet and it'll probably outlive us all. The reason people switch is quieter than that: they're tired. Tired of the plugin that needs updating every Tuesday, the theme that breaks when PHP bumps a version, the dashboard that has somehow grown four upsell banners since last month. They want to write, and the tool keeps asking to be maintained.

Ghost scratches that itch. It's lean, fast, has a genuinely lovely editor, and ships with memberships and a newsletter built in instead of bolted on. So if you've decided to make the jump, good news: the move is more straightforward than it used to be. Ghost rebuilt its WordPress importer, and for a normal blog it really is a few clicks. The catch is everything around the content — images, URLs, subscribers, SEO — and that's where people get burned. So let's do this properly.

First, set your expectations honestly

The migrator handles your posts and pages. Titles, body content, tags, authors, publish dates, most standard formatting. That part is genuinely easy.

What it does not do is pick up the entire shape of your old site. WordPress categories get folded into Ghost tags (the first category on a post becomes its primary tag). Custom post types don't survive. Most oddball shortcodes from page builders don't render. Yoast's carefully written meta titles and descriptions don't come across. And — this is the big one people forget — your actual image files aren't bundled into the export at all. The text comes over with links pointing back at your old wp-content/uploads folder.

None of this is a dealbreaker. It just means the migration is two jobs, not one: moving the words, and then cleaning up the rest. If you go in expecting "click a button, done," you'll panic halfway through. If you go in expecting "click a button, then spend an afternoon tidying," you'll be fine.

Back everything up before you touch anything

This is the boring step everyone skips and then regrets. Take a full WordPress backup first — database and files both. UpdraftPlus is the easy route if you don't want to mess with phpMyAdmin. Separately, grab a copy of your wp-content/uploads directory and put it somewhere safe; you're going to want those image files later regardless of which migration path you take.

The point isn't that the migration is dangerous to your WordPress site — it isn't, it only reads your content. The point is that once you start fiddling with DNS and redirects, you want a known-good copy of the old site sitting in a folder so you can check things against it. Migrations go sideways in small ways, and a backup turns "oh no" into "oh well, let me look."

Spin up Ghost

You need somewhere for the content to land. Two flavors here.

If you don't want to think about servers, Ghost(Pro) is the official hosted option. You sign up, you get a temporary something.ghost.io address to work on, and you point your real domain at it later. It costs money, but it's the path of least resistance and it funds the open-source project, which is a nice bonus.

If you'd rather self-host, you're running Ghost on your own infrastructure — it's a Node.js app, not PHP, so mentally file away that your old LAMP-stack habits don't all transfer. Make sure you're on a current version before importing. Self-hosting is cheaper and gives you full control; it also means you are now the person who keeps it patched, which, if you'll recall, may be part of why you left WordPress. Choose with eyes open.

Either way, set up your publication basics — title, description, timezone — before you import. It's easier to have the house standing before you move the furniture in.

The actual migration

Here's the part that's genuinely pleasant now. Ghost has a built-in WordPress migrator, and it walks the whole thing for you.

In Ghost Admin, go to Settings → Advanced → Import/Export. You'll find the migrate tools there. Before you start, log in to your WordPress site in another tab — it makes the next steps smoother.

  1. Enter your WordPress URL. Type in the public address of your existing site and hit Continue.
  2. Generate the export. Ghost gives you an "Open WordPress Settings" button that drops you straight onto the export screen of your WordPress admin. Choose All content and download the file. You'll get an XML file — that's your whole site's text content in one document.
  3. Upload it back to Ghost. Return to the migrator window, drag that XML file in, and continue. (If you lost track of it, it's almost certainly in your Downloads folder.)
  4. Review and import. Ghost tells you how many posts and pages it's about to bring in. If the number looks right, hit Import content. Give it a moment, and you'll get a confirmation that your stuff has landed.

That's it for the words. A few hundred posts come across in seconds with no drama. There are some ceilings worth knowing: the XML file needs to be under 100MB, and the importer handles up to around 2,500 posts. If you're past either of those, skip down to the "when the easy way isn't enough" section.

Now the part nobody warns you about: images

Remember how the export was just text? Your post bodies are now full of image tags pointing at yourolddomain.com/wp-content/uploads/.... Right now, those images still load — but only because your old WordPress site is still alive and serving them. The day you take WordPress down, every image on your new Ghost site goes with it.

You've got two real options.

The quick-and-dirty one is to keep the old domain (or at least the uploads folder) online and serving files, and let Ghost keep hotlinking to it. It works, but you've now got a dependency on the thing you were trying to leave. Fine as a temporary bridge, bad as a permanent plan.

The proper fix is to get the images onto Ghost and update the references. If you're self-hosting, this can be as clean as copying your backed-up wp-content/uploads directory into Ghost's content folder so the paths line up — much faster than downloading and re-uploading everything one file at a time, especially if both sites live on the same server and you're comfortable with SSH. On Ghost(Pro), or if you'd rather not touch a terminal, you re-upload images and fix the links, which is tedious but only has to happen once. Some folks route images through a CDN like Cloudinary during the move to sidestep the whole hosting question. Whatever you pick, decide before you kill the old site, not after.

Don't let your SEO fall off a cliff: redirects

This is the one that costs people actual traffic, so pay attention here.

WordPress URLs and Ghost URLs often don't match. WordPress loves dated permalinks like /2024/03/my-post/; Ghost defaults to flat slugs like /my-post/. If you change that structure and do nothing else, every link Google has indexed, every backlink someone earned you, every bookmark — they all hit a 404. Your rankings notice. Your traffic notices.

The fix is 301 redirects, which tell search engines "this moved, send the authority over here." Ghost lets you upload a redirects file (a redirects.yaml or .json) under Settings → Advanced. Ghost publishes a list of the most common WordPress-to-Ghost redirect rules, and for a standard dated-permalink setup you can often write one rule that flattens everything to root and call it a day. If your structure is more bespoke, you'll write more rules — a bit of regex, a bit of patience.

Honestly, if you can preserve your old URL structure in Ghost instead of redirecting, that's even less risky. But if you're changing it, the redirects are not optional. Skipping them is the single most common way people tank their own migration.

While you're thinking about SEO: those Yoast meta titles and descriptions didn't come over. You don't need to redo all of them, but do go set custom meta on your most important, highest-traffic posts manually in the post settings sidebar. Let the long tail keep Ghost's sensible defaults.

Members, subscribers, and the awkward money conversation

If you've got an email list — Mailchimp, Jetpack, a newsletter plugin, whatever — you can bring those people into Ghost. Export them as a CSV, then go to Members → Import in Ghost Admin and upload it. As long as your CSV has at least email and name columns, free subscribers come straight across.

Here's the uncomfortable bit: paying subscribers cannot be silently migrated. Ghost handles payments through Stripe, and you can't just teleport someone's active subscription from one billing system into another — that's not how payment authorization works, and frankly you wouldn't want a platform that could do that. Your paid members will need to re-subscribe through Ghost's checkout. That means a clear, friendly heads-up email explaining the move and asking them to resubscribe, ideally with a reason they'll care about. Plan for some attrition and plan the messaging carefully. This is the part of the migration that's a relationship problem, not a technical one.

The leftovers: navigation, comments, and your theme

A few smaller things won't migrate, and they're all quick to rebuild.

Navigation menus and widgets don't come over. Ghost keeps this simple — rebuild your top and footer menus under Settings → Navigation. It takes five minutes and the result is cleaner than the widget soup you probably had.

Comments are their own little project. Ghost has native member commenting now, which is great if you're leaning into the membership model. If you had a big archive of WordPress comments you want to preserve, the classic route is migrating them into a third-party system like Disqus — as long as your post URLs stay the same, the comments reattach to the right posts. Decide whether your old comment history is actually worth keeping; for a lot of blogs, it quietly isn't.

Your theme won't transfer, and that's a feature, not a bug. Don't try to rebuild your WordPress theme pixel-for-pixel in Ghost — you'll fight the platform the whole way. Migration is the natural moment to pick a proper Ghost theme that leans on native features like memberships, dark mode, and email layouts. Have the theme sorted before you import if you can, so you're reviewing content in its real context.

Going live

Once the content's in, the images are sorted, the redirects are written, and the theme's in place, do a real review pass. Click through a sample of posts. Check that images load, that formatting survived, that a couple of older dates look right, and that no two posts ended up fighting over the same slug (Ghost renames one if they collide). Test your redirects by actually visiting a few old URLs.

Only when that all checks out do you point your domain at Ghost by updating your DNS. Your registrar's exact steps vary, but it's the same idea everywhere, and most hosts' support will do it for you if you ask nicely. Then send the announcement to your list, keep the old WordPress install around in read-only limbo for a little while as a safety net, and breathe.

When the easy way isn't enough

If you're over the 2,500-post line, your export blows past 100MB, or your site is a tangle of custom post types and bespoke structure, the built-in migrator will leave gaps. You've still got options.

Ghost maintains a suite of open-source migration tools on GitHub for exactly this — they run from the command line and are built for large, weird, custom migrations. If you're a developer or comfortable in a terminal, that's your path, and it gives you far more control over how content maps across.

If you'd rather hand the whole thing off, Ghost(Pro)'s Concierge migration service will move your content and subscribers for you. It's aimed at people with real scale or real complexity who'd rather pay to make the problem disappear. No shame in that — for a big publication, an afternoon of your time is worth more than the fee.

A last honest word

Migrating from WordPress to Ghost is not hard, but "not hard" isn't the same as "automatic." The content move is a button. The cleanup — images, redirects, subscribers, SEO — is an afternoon, maybe a weekend if your archive is deep. Rush it and you'll lose traffic to broken links and orphaned images. Do it deliberately and you come out the other side with a faster site, a calmer dashboard, and the thing you actually wanted in the first place: a tool that gets out of the way and lets you write.

Back up first. Sort the redirects. Warn your paying members. Everything else is detail.


Ghost Theme

Written by

Ghost Theme

View all posts →

Build something beautiful

Your dream publication, today.

Join 5,000+ creators who trust our themes. Get every theme — plus all future releases — for one simple price.

30-day money back guarantee · Cancel anytime