12 min read

Migrating from WordPress to Ghost: My Experience

Migrating from WordPress to Ghost: My Experience

Considering moving to ghost from WordPress? Here's a detailed description of my experience migrating and converting my own site, including some tips picked up on the way.

To help here are some key conclusions I've made too:

If you're a heavy affiliate marketer, you may want to reconsider. Ghost is a little hard to use for marking links as no-follow, sponsored, etc. There are less plugins on the market so you get less technical flexibility.
If you need handholding and are not comfortable with the technical aspects of running Ghost, then you're better off going with the Ghost.org-hosted solution even if it's more expensive.
If you're a creator, such as a newsletter writer, YouTube, podcaster etc and you're looking for a Substack alternative that is more customizable, then Ghost is probably a very good solution for you.


I first heard about Ghost from my friend David, who suggested I have a look. He gave me a quick summary that it was started by a group of people from WordPress and that it was a newer, up-to-date technology.

My first impression was to be a bit skeptical about it as a good WordPress replacement. WordPress has been good to me over the years, and I loved how flexible it was. I was a bit unsure that a platform like Ghost could actually be powerful enough to handle the things that I'm trying to do with my website. Mainly:

  • Publish posts with multi-media embeds (YouTube, Spotify, etc)
  • Create lower-funnel review posts with affiliate content
  • Test marketing tools

I had a look at Ghost.org and created a trial account. The first thing that I noticed was it was going forw an Apple-like experience. They were trying to create some kind of walled garden where things fit together better, about the options were lower (this turned out not to be the case, by the way). The other interesting thing was that they seemed to be really digging into the paid creator niche.

Some things I noticed about Ghost right of the gate:

  • Clean UI
  • Focused creation experience (no bells and whistles)
  • Paid membership content tools built-in

The quick pitch is basically that you can run a Substack style type operation from Ghost and lock posts and content to paying members only.

Having tried Substack before, I'd say Ghost offers you more power than Substack in the customizability, but less than WordPress.

So these were the benefits that I thought I could get out of it:

  • Better site performance technically, including SEO
  • A walled garden experience with smoother integrations
  • A more focused creator experience
  • Creator monetization opportunities

So you can see my overall thesis here was that it would be a technological upgrade with creator business model support.

Also, I'm taking a punt on Ghost.org being more involved and invested in supporting creators as well as keeping the platform updated and progressing faster than WordPress.


Having had a look around in the ghost trial account, I tried to import some of my content from WordPress as a test and I discovered a few key things that I needed to have prepared first.

Pages can't easily be nested (as far as I know). So I had to UN nest some of my pages, removing their parent pages and putting 301 redirects in place first to make sure Google I knew that the pages moved.

The other thing is that I had no control of the post being displayed on the feed without probably modifying the theme file or something like that. It's a little bit beyond my pay grade even if I know some basic HTML, but who can be bothered?

This meant that I had to clean up my feed history and remove anything that I wouldn't feel comfortable people scrolling past in the feed.

I had to add proper dates so that there was a logical sequence to the feed. It was kind of nice to see because I could see the balance of my content, how much was top the funnel on how much was at bottom of the funnel.

Another big thing I had to prepare for was that my links would not easily be added as nofollow and sponsored, for when I inserted affiliate links to products.

This is a real pain to do in Ghost, it doesn't really support you changing the link type when you insert it.

You can see that Ghost doesn't offer any options for modifying the links when you put them in.

I started the process of creating a rebound Brantley account and setting up some proper links but I realized the nofollow and sponsored post tags on my links will be intact when I moved over so there's no major rush to change these just yet.

The other thing is that I realized my WordPress comments would be lost.

Ghost does support Disqus, so I tried to install the plugin on WordPress first and migrate my comments by syncing the plugin with my WordPress comments but it actually didn't work. I couldn't be bothered troubleshooting that and holding up the whole project just for this, so I decided to let it go and maybe come back to it later with Disqus support.

A quick recap of my preparations:

  • Unnested pages and put in 301 redirects
  • Prepared a list of 301 redirects already in place, in case I get lots of 404s to those pages
  • Ordered my content published dates to be sure it looks right as a feed
  • Gave up on comments
  • Gave up on link-type controls

All I had left to do was to decide whether I would use the ghost.org service or something else to set up and run my installation.

Finding a Host

Ghost.org offered paid supported and managed experience for about $31 U.S. dollars a month. I thought there was quite a lot for me to just play around with and test, given that this website doesn't really make any money, so I had to look around for other options.

You need the Creator edition to use premium (non-free) themes...

After Googling, I came across an indie host called Gloat.

It seemed like Gloat offered a managed hosting-like experience without any limitations.

The major drawbacks were that you wouldn't get a CDN and your newsletter sendings would be capped.

The price was almost half, in USD. It came out to about $26 USD a month after EU sales taxes, though.


Important: Having gone through the process now, I realised that this solution is really not the same thing Ghost.org hosting because it's not really a supported solution.

You basically get your website installed and you're on your own, it's good for what it is and if you know what you are doing, but don't get it mixed up with a supported solution.

It's sad to say, and maybe I'm getting old, but I don't really understand what I am and was doing, with Ghost just yet. I don't really know how it fully works on the back end in comparison to WordPress, but I was willing to pay to get the transition done so I thought I would go with this indie solution for some better service.

Looking back now- I think if you need hand-holding (like I did), you should go with the Ghost.org service instead.

I sent the founder an email mid-week about my migration, a few days ahead of time, to get some more details and feedback and didn't hear back. Who knows whether the email got lost but I'm fine with giving him the benefit of the doubt. I'll share more about my experience below.

My Migration

With my site prepared and the host/installation service noted, I went ahead and bought the hosting and site installation package over the weekend.

As it turns out, the site installation package is for something different (a total misunderstanding on my part) so the founder refunded my purchase as soon as we realized the mistake. Phew, thank you!

The hosting purchase was made on the weekend via Stripe and the hosting and installation was set up first thing Monday morning. Fast!

I was sent a link to my Ghost website backend, with instructions to set up my website and let the founder know when it was ready for changing my domain details to point to the installation.

Settings Configuration

The first thing I did was configure my settings including the theme.

There are only really 3 things you need to set up before importing content.

General Settings

This contains your site title, meta description, and your social media data. I remembered now that Ghost doesn't have all the social media profiling data structure that Yoast has, so this was a bit sad. But I hoped Google would work it out anyway.

Design Settings

Here you choose:

  • Theme (this determines how many settings you get)
  • Accent color
  • Site icon, and brand logo (site icon is your favicon)
  • Cover image
  • Headline, by-line.
  • Subscribe CTA call out "E.g. Subscribe to my list for ..."
  • Font style (2 options for both body and headlines)
  • Labels for your feed, related posts, etc
  • Related post settings
  • Social media sharing toggle

For my theme, I chose a free theme from Ghost themselves as it was pretty straightforward.

I wanted something that was similar to Substack but showed my images and let me feature particular content. I wanted to feature content so that readers weren't too put-off by my middle and lower-funnel content.

Sidenote: I tried to find some premium themes on Ghost's website itself and also Envato, but there were too few options and not all of the Envato themes supported the latest version of Ghost. Maybe easier to go with an official ghost theme so it's always supported.  

I'm guessing these options are based on your theme, so the location of where these menus appear is pretty self-explanatory.

With the site core setup, I could move into populating my website.

Content Migration

Ghost has a content migration plugin that you install on WordPress. You can search the WordPress plugin directory for the Ghost plug-in and then install it.

So I installed it on my WordPress site and then used the export feature from the plugin:

An important thing to note was that you can get JSON which is just text and links, or the Ghost File which has images.

I then went to import it in Ghost in the Labs section, following the Ghost tutorial on how to migrate content.

Annoyingly, I got this error:

It made all my posts set to the same day, which isn't ideal.

I sent an email to Gloat with details on the issue but it was after hours, so I was on my own here.

I tried doing the JSON version, but then all my content was broken basically. Thousands of missing images.

Fixing the Ghost WordPress Migration Date Format Error

After looking around for about 2-3 hours, I finally found the cause:

Date is in wrong format (PHP <=7) · Issue #28 · TryGhost/wp-ghost-exporter
Generating an export file for Wordpress running on PHP 7 (which is the default for WordPress.com accounts) results in an invalid date format because the use of p in the date format code was only ad...

There seems like a bunch of posts on the Ghost forum about this error but nobody has posted the solution.

Timestamp Problem when Importing from Wordpress
I’m testing Ghost in a local environment (using the docker approach for migrating to Ghost 2.x). I’m importing content from an existing wordpress blog. When I import the json dump from the (old) wordpress ghost plugin, all the posts have this warning about the date variable: Post: Date is in a wr…

Anyway, now that this issue was solved, I tried again to import the content.

I sent another email to the host but it was still out of office hours so I had to try to find a way around it.

I tried breaking up the import folder into different parts, about 100mb each given the tip by Ghost which says try to limit imports to about 100mb. I still got the same error, until I had pieces that were about 40mb. So I ended up importing all the content to the site in about 8-10 pieces.

Now, finally, my posts were in the feed and populated with the correct dates.

I started to go through my pages to check that everything was all clear. While doing this, I noticed that the importer brought in all my post content as HTML embeds:

This is a little annoying, but better than nothing. For those with the same problem, the solution has been to:

  1. Open the post in another tab,
  2. Copy all the content,
  3. Open the editor again
  4. Delete the HTML
  5. Paste in the content

Once I got to my contact page, I also remembered that Ghost doesn't have an inbound contact form option.

Adding Forms to Ghost

While browsing the integration library, I found that Formspree was the best integration for forms.

It took a bit of getting used to first, but I found that basically Formspree provides you a library of scripts that you can use to create forms of different types, and then to each script you plug in your destination code for your account.

You copy the code and add in your Formspree destination URL to receive the form submission there.

It's free for up to 50 submissions a month, so I thought I'd use that for now. I copied the code, my 'post' URL from my account and embedded it on my contact page.

Sadly, it looks a little wonky with the thin border line around it. But I'll work out a way to remove that at some point I guess.

With all of the content added, images fixed and form in place, I could email back Gloat and ask to put my URL live.

The founder replied fairly quickly and my site was up since the 28th of June!

Email Marketing

Moving my list was pretty easy. I exported a list from Sendfox and then went to the member section on the Ghost Members page and imported them.

Tracking and Analytics

Because I used Google Tag Manager, I could simply reinstall the same header and /body tags on Ghost using Code injection on the Settings page.

The Results

So, here are the technical results:


Google Page Speed Insights shows an 11-point improvement on mobile and a 5-point improvement on desktop.

Mobile, before.
Mobile, after.
Desktop, before.
Desktop, after.

Pingdom Tools shows my load speed improved massively, by 16 points overall and from 2.01 seconds to under 0.5 seconds.


It is still early days so I can't really tell, but my SEO seems to have a small bump.

It may have been rekt a little by my tinkering around with removing poor quality posts that I didn't want to show on my feed plus un-nesting my pages, though.


I have yet to see the changes for my users, but I'll come back here and update the post when I can see stats around:

  • Dwell time
  • Click through rates (internally)
  • Page/s per session

WordPress vs Ghost Features

By moving, I lost a few things:

  • Easily marking links as no-follow and sponsored or no-index
  • Image optimization. I can't use Smush.
  • Structured data around my other social media profiles via Yoast, e.g. YouTube link, personal logo, etc
  • No auto-responder for my email members, can’t do double opt-in like on Sendfox

Final Thoughts

Despite some of the heartache I had in the move, which can be expected with any website conversion, I feel excited to see what I can do with ghost versus WordPress. I have a couple of hopes here, including:

  • A greater focus on my content 'creation' vs fiddling with plugins etc
  • Monetising through paid memberships
  • SEO benefits from better technological performance

Comments welcome or chat to me on Twitter.