Common mistakes with Ghost’s 2026 self-hosted CMS adoption
Publishers migrating from WordPress or Substack to self-hosted Ghost face technical hurdles in server management, DNS configuration, and SEO. Key requirements include managing MySQL 8, setting up Mailgun for bulk delivery, and ensuring 301 redirects preserve link equity.
Server and software management
Publishers moving from WordPress or Substack to self-hosted Ghost often overlook the maintenance demands of a manual server stack. While Ghost(Pro) handles updates and backups, a self-hosted installation requires you to manage Node.js versions, MySQL 8 configurations, and security patches yourself. Many users experience 502 or 503 errors when Nginx cannot communicate with the Ghost process. You should check your logs using ghost log to identify these connection failures. If you use a VPS, you must also handle SSL certificate renewals and database backups to prevent data loss. Node.js version mismatches trigger errors during updates. You should verify compatibility before upgrading your environment.
Production Ghost requires MySQL 8, while SQLite remains limited to local development only. A 4 GB VPS handles the needs of a newsletter with 10,000 subscribers and 50,000 monthly visits. While a $14 DigitalOcean droplet is simple to set up, you must scale resources as traffic increases. You must decide between the established Ghost-CLI method and the newer Docker Compose preview path. Docker Compose bundles Ghost, MySQL 8, and Caddy, but you will find fewer community troubleshooting guides for this method. You must avoid installing Ghost as a root user, as the Ghost-CLI requires a non-root user for installation. You should also monitor resource use with top -c to prevent out-of-memory crashes during traffic spikes.
Email and DNS configuration
Misconfiguring email settings remains a primary reason for newsletter failure in self-hosted environments. Ghost requires two distinct setups: SMTP for transactional mail like password resets and the Mailgun API for bulk newsletter delivery. Missing MX or DMARC records often cause initial newsletters to bounce or land in spam folders. You must add SPF, DKIM, and DMARC records to your DNS provider to verify your sending domain. Most users should stick to a shared IP to avoid the reputation damage that inconsistent sending can cause to a dedicated IP.
You should, if you are planning to keep the same custom domain you were using at Substack, perform this step at the very end to avoid site downtime as you are getting things set up. You should disconnect the domain from Substack preferences before updating your DNS to avoid being stuck in a state where Substack still claims the domain. For transactional mail, use port 587 with STARTTLS instead of port 25, which many providers block.
Mailgun offers a Foundation plan for $35 per month that covers 50,000 emails, but you will pay $1.30 per additional 1,000 emails. You must also plug your Mailgun API key into the Ghost admin interface to connect the services.
| Component | Ghost(Pro) Publisher | Self-Hosted (VPS + Mailgun) |
|---|---|---|
| Monthly Base Cost | $29 | ~$15 to $30 |
| Email Sends | Included | $35 (50,000 sends) |
| Updates/Backups | Included | Manual |
| Support | Forum |
Content and SEO migration
The shift from WordPress to Ghost’s flat /post-slug/ URL structure creates heavy SEO risks if publishers neglect 301 redirects. Building a one-to-one redirect map from every old WordPress URL to its new Ghost URL preserves link equity. Custom fields, shortcodes, and page-builder designs from WordPress do not migrate into Ghost and require manual rebuilding using Ghost cards.
Importing members requires a specific CSV format. You must include the email field for the import to work. Other fields like name, note, and labels are optional. If you have existing paid subscribers, you must include the stripe_customer_id field to ensure they retain access. The subscribed_to_emails field also determines if members receive your newsletters. The complimentary_plan field allows you to import members who hold a free subscription.
The official WordPress plugin migrates posts, images, tags, and authors, but it cannot handle category migrations. Ghost only uses a system of tags, so you must manually recreate categories as navigation menus or tags. What happens to your search rankings if you miss a single category redirect?