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 consider starting with the Ghost.org-hosted solution while you learn the CMS.
🎬 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:
I had a look at Ghost.org and created a trial account. The first thing that I noticed was it was going for 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:
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 customizability, but less than WordPress.
So these were the benefits that I thought I could get out of it:
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 with 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 Rebrandly 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:
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.
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.
Also, 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.
Having gone through the process now, I realized that this is not the same thing as Ghost.org hosting because it's not really a traditional support-assisted solution.
But- it's really good if you already know what you are doing.
I don't really understand what I am and was doing, with Ghost just yet. So I should have used a more beginner-friendly option and then moved over to Gloat - but ultimately it worked out!
I sent @dr an email mid-week about my migration, a few days ahead of time, to get some more details and feedback.
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 Dan refunded my purchase as soon as we realized the mistake.
Phew, thank you Dan!
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 Dan know when it was ready for changing my domain details to point to the installation.
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.
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.
Here you choose:
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.
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 an error.
All my posts were set to the same day.
I sent an email to Gloat with details on the issue but it was after hours, so I needed to troubleshoot here.
I tried doing the JSON version, but then all my content was broken basically. Thousands of missing images.
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.
Anyway, now that this issue was solved, I tried again to import the content.
A new issue.
You can't easily upload large files.
All the images are now broken.
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.
Ugh.
This is a little annoying, but better than nothing. For those with the same problem, the solution has been to:
Once I got to my contact page, I also remembered that Ghost doesn't have an inbound contact form option.
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, though, 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.
Dan replied quickly and my site was up since the 28th of June!
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.
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.
So, here are the technical results:
Google Page Speed Insights shows an 11-point improvement on mobile and a 5-point improvement on desktop.
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.
By moving, I lost a few things:
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:
Thank for sharing, I always wanted to use some third party CMS for blogging. But since there are a bunch of REST api plugins for wordpress, I think wordpress can be used as CMS with framework such as React/Next JS
Good call. You are definitely right in that WordPress is a better solution if you have some technical requirements. Ghost wouldn't be the best solution, in my opinion.