Ghost SEO

How SEO works on Ghost CMS — the traditional-vs-headless fork, the SEO Ghost builds in automatically, what it leaves to you, gated-content limits, and Ghost Pro vs self-hosted.

First published: Jun 27, 2026 · Last updated: Jul 13, 2026 · Advanced
demand #4 in Headless CMS#36 in Platform SEO#257 in Technical SEO#357 on the site

Ghost SEO splits in two depending on how you run it. In traditional (Handlebars) mode, Ghost handles core technical SEO automatically — sitemap, canonical tags, meta tags, Open Graph, Twitter Cards, and Article JSON-LD — with zero plugins, and it's fast by default. Run Ghost headless (Content API only) and all of that disappears; the frontend has to rebuild every piece. Either way, Ghost has gaps it never fills (breadcrumb/FAQ schema, hreflang, per-post noindex toggle, IndexNow), and gated members-only content can't be indexed because it's blocked server-side. The single biggest mistake is treating traditional and headless Ghost as the same SEO problem — they aren't.

TL;DR — Ghost SEO forks on one decision: traditional (Handlebars) mode vs. headless (Content API). Traditional Ghost ships core technical SEO automatically — sitemap, self-referencing + custom canonicals, meta tags, OG/Twitter cards, and Article JSON-LD — with no plugin, and it’s fast by default. Go headless and all of that disappears; the frontend has to rebuild every piece, and Ghost’s speed advantage evaporates because the framework now owns performance. Both modes share gaps Ghost never fills (breadcrumb/FAQ/Product schema, hreflang, per-post noindex, IndexNow, a redirect UI), and gated members-only content is blocked server-side so it can’t be indexed. Don’t conflate the two modes — they’re different problems.

The fork in the road

Ghost is a Node.js (Express) CMS with a decoupled core: an API plus an optional Handlebars frontend. That architecture is the whole SEO story.

  • Traditional mode — Ghost serves HTML through its Handlebars themes. Every built-in SEO feature applies, generated automatically via the theme’s {{ghost_head}} helper.
  • Headless mode — Ghost is “a full headless CMS which is completely agnostic of any particular front end or static site framework.” You query the Content API or Admin API from a separate frontend (Next.js, Astro, Nuxt, SvelteKit), and SEO becomes 100% that frontend’s responsibility.

The choice of mode is the single biggest determinant of Ghost’s SEO footprint. Everything below is organized around it. (For the framework-agnostic version of the headless side, see SEO for a Headless CMS.)

What traditional Ghost handles automatically

In traditional mode Ghost does the core technical SEO with zero configuration:

  • Sitemap. Auto-generated at /sitemap.xml, updated on publish/unpublish, covering posts, pages, tags, and authors. “Ghost automatically creates and updates an XML sitemap for your website.” Evidence for this claim Ghost automatically creates and updates an XML sitemap. Scope: Traditional Ghost publication output. Confidence: high · Verified: Ghost: SEO
  • Canonical tags. A self-referencing rel=canonical on every post and page — “Ghost adds canonical tags across your site to tell search engines which version of a page they should consider the ‘official’ one.” Since March 2019 you can also set a custom canonical per post in the editor’s metadata panel, or via the Admin API canonical_url field — built for “guest posts, multiple versions of the same page or when you need to curate a list of links to external sources.” Evidence for this claim Ghost outputs canonical tags and supports a custom canonical URL for a post or page. Scope: Traditional Ghost and the post/page metadata configuration. Confidence: high · Verified: Ghost: Canonical URLs
  • Meta title/description. Custom fields that fall back to the post title and excerpt when left blank.
  • Open Graph + Twitter Cards. Auto-generated from post metadata and the feature image.
  • Structured data (JSON-LD). “Ghost automatically includes structured data in all posts and pages” — Article schema with publisher, author, headline, datePublished, dateModified, image, and keywords.
  • Clean URLs + custom routing. Slug-based URLs by default, fully customizable via routes.yaml.
  • robots.txt. A default file that disallows the /ghost/ admin path and allows everything else.

This is genuinely more than a stock WordPress install gives you — Ghost lists “XML sitemaps, canonical tags, optimised URLs, microformats, Facebook Open Graph tags, support for Twitter cards and clean semantic markup” as built-in, no plugin required.

What Ghost never does — in either mode

Ghost covers the core and stops there. It does not generate:

  • Advanced schema — breadcrumb, FAQ, HowTo, Product, Recipe, or Video markup. Article schema only. Anything else is manual code injection or theme work.
  • Hreflang / international SEO — no native support. Multi-language Ghost needs a third-party service (Weglot, ConveyThis) or theme-level implementation, and hreflang is notoriously error-prone.
  • A per-post noindex toggle in the UI — you need code injection.
  • Keyword optimization guidance. This is deliberate. Asked about adding Yoast-style tools, the Ghost team argued that “one of the downsides of using Yoast’s KW optimisation suggestions is that is encourages us to write meta data for machines instead of humans,” and on the broader advanced-SEO wishlist (breadcrumb schema, hreflang, noindex controls) said flatly: “This isn’t on our radar at the moment.”
  • IndexNow — no native support; wire it via a custom webhook on publish if you want Bing/others notified instantly.
  • A redirect-management UI — redirects live in redirects.yaml (self-hosted) or Ghost Pro’s redirect manager; there’s no plugin ecosystem to lean on.

Headless Ghost: the SEO you have to rebuild

Go headless and Ghost stops being an SEO system — it’s a content API. Everything in the “handles automatically” list above is now the frontend’s job:

  • Sitemap — generated at build time or by a serverless function hitting the Content API.
  • Canonical tags — injected by the frontend framework, ideally absolute URLs from one SITE_URL.
  • Meta + OG/Twitter tags — rendered via the framework’s head management (Next.js generateMetadata, Astro’s <head>, Nuxt useSeoMeta).
  • Structured data (JSON-LD) — now entirely custom.
  • robots.txt — served by the frontend.
  • 301/302 redirects — handled in the frontend or the CDN layer.
  • Core Web Vitals — Ghost’s speed advantage disappears; the framework and rendering mode now dominate performance.

The one thing that carries over: the Content API still returns the editorial metadata you typed into Ghost’s editor — meta_title, meta_description, og_title, og_description, og_image, twitter_title, twitter_description, twitter_image, and canonical_url. The data is available; rendering it is on you. This is the headless-CMS SEO problem in general, and it’s really a JavaScript SEO problem — if your frontend defaults to client-side rendering, Googlebot has to queue the page for a later render wave. AI-crawler rendering varies by provider, so render on the server or at build time (SSR/SSG) to maximize coverage.

Gated content and what Google can see

Ghost supports three visibility levels: public, members-free (email required), and members-paid (subscription). The crucial point for SEO is that gated content is blocked server-side, not by sniffing the user agent. As Ghost’s own team put it: “Google can’t crawl protected content on your page, because that’s only ever available to logged in members.” Google gets exactly the same restricted view a logged-out reader gets.

Two realistic strategies:

  1. Public preview. Show an intro / first few paragraphs publicly and gate the rest. Ghost has a native public-preview feature for this — the public portion does the ranking work.
  2. Metered access. Third-party implementations allow N free articles before requiring registration.

If you do gate content, Google supports paywalled markup — NewsArticle with isAccessibleForFree: false and a hasPart/cssSelector describing the gated region — but Ghost doesn’t generate this automatically; it’s manual code injection. And the hard rule either way: don’t cloak. Showing Googlebot the full article while readers hit a paywall violates Google’s guidelines and risks a manual action. The honest framing is that public content ranks and gated content converts — don’t expect locked posts to bring search traffic.

Ghost Pro vs self-hosted

The SEO software is identical on both — same Ghost, same features. The difference is infrastructure control:

  • Ghost Pro — managed hosting with a built-in CDN, automatic SSL, and backups. The CDN helps TTFB and Core Web Vitals for distributed audiences. The catch: you can’t directly override robots.txt — you have to contact support. That’s a real constraint for headless or private-mode setups.
  • Self-hosted — full control of the server, headers, caching, robots.txt, server-level redirects, and your own CDN (Cloudflare is the common pick). More flexibility for advanced technical SEO, more to manage.

Neither is “better for SEO” inherently — Ghost Pro buys you a CDN, self-hosting buys you control.

Common pitfalls

  • Thin tag/author archives. Ghost auto-creates /tag/slug/ and /author/slug/ pages. Granular tags or single-post authors generate thin pages — consider noindexing the low-value ones.
  • Preview-URL indexing. Older Ghost versions could leak draft preview URLs to Googlebot via third-party scripts loading on preview pages (since fixed in core — see GitHub issue #9749). Verify preview pages aren’t indexed on older installs.
  • /ghost/ accidentally exposed. Confirm the default robots.txt disallow on the admin path hasn’t been overridden.
  • Duplicate content from custom collections. routes.yaml collections can create alternate URL paths for the same content. Ghost canonicalizes its default structure; custom routing can create duplicates if you don’t manage canonicals explicitly.
  • Missing custom canonical on syndicated/guest posts. If you republish content from elsewhere, set canonical_url per post (editor or API) to point at the original — the feature only exists since March 2019.
  • Headless pre-launch indexing. A public headless frontend deployed before launch without its own robots.txt can get indexed prematurely. Ghost’s own “private” mode sends Disallow: /, but that protects the Ghost instance, not your separate frontend.
Evidence for this claim Ghost outputs canonical tags and supports a custom canonical URL for a post or page. Scope: Traditional Ghost and the post/page metadata configuration. Confidence: high · Verified: Ghost: Canonical URLs

Ghost vs WordPress, briefly

Ghost gives you more SEO out of the box with zero configuration and is faster by default (Ghost’s own benchmark claims it’s “up to 1,900% faster than WordPress” — treat that as a vendor figure, but the direction is real: minimal JS, strong CWV baseline). WordPress’s ceiling is higher with the right plugins — schema, redirect managers, programmatic SEO — but its plugin-heavy norm often hurts performance. Ghost suits publishers who want to write without SEO-plugin overhead; WordPress suits complex sites needing advanced schema or large integrations. “Faster, therefore ranks better” is an oversimplification — Core Web Vitals is one factor among many, and headless Ghost’s speed depends entirely on the frontend, not Ghost.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin an expert quote first.