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#40 in Platform SEO#243 in Technical SEO#330 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 SEOGhost SEO is the practice of optimizing a site built on Ghost CMS. The work splits in two: in traditional (Handlebars) mode Ghost handles core technical SEO automatically; run headless and you must rebuild all of it in the frontend. forks on one decision: traditional (Handlebars) mode vs. headless (Content API). Traditional Ghost ships core technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. automatically — sitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., self-referencing + custom canonicals, meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored., OG/Twitter cardsTwitter Card tags (now often called \"X Cards\") are <meta name=\"twitter:...\"> tags in a page's <head> that tell X's link-unfurling system what rich preview to build for a shared URL — image, headline, description, and (for player cards) an embeddable frame. The four card types are summary, summary_large_image, app, and player. Every twitter:* property falls back to its og:* equivalent if missing — except twitter:card itself, which has no fallback and must be set explicitly. They are not a Google or Bing ranking factor., and Article JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. — 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 schemaProduct schema (schema.org/Product) is structured data that tells search engines a page's product name, price, availability, and reviews so it can appear in Shopping-style rich results. It's separate from a Google Merchant Center feed, though Google reconciles the two., hreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others., per-post noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed., IndexNowIndexNow is an open push protocol that lets you instantly tell participating search engines (Bing, Yandex, Naver, Seznam, and Yep) which URLs you've added, changed, or removed via a simple HTTP request — and one submission is shared across all of them. Google does not use it., a redirectA redirect sends browsers and crawlers from a requested URL to a different one. An HTTP redirect specifically is a 3xx status code paired with a Location header; meta refresh and JavaScript redirects achieve a similar navigation without being a 3xx response themselves. Permanent redirects (301/308) are Google's signal the target should be canonical; temporary ones (302/303/307) aren't. 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) CMSA content management system (CMS) is software that lets users create, manage, and publish digital content — like blog posts and pages — without writing raw code. WordPress, Drupal, and Joomla are the most common open-source CMS platforms. 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 CMSA content management system that separates the content repository from the presentation layer, delivering content via API to any front-end framework rather than rendering HTML server-side itself. It doesn't specify the rendering mode, hosting, cache, preview security, or publishing workflow — those are separate decisions. 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 CMSA headless CMS decouples content storage and editing (the backend) from how that content is rendered and delivered (the frontend), serving content over an API instead of a built-in templated 'head'. Its SEO outcomes come almost entirely from how the separate frontend renders pages..)

What traditional Ghost handles automatically

In traditional mode Ghost does the core technical SEOTechnical SEO is the practice of making a site easy for search engines to crawl, render, index, and (now) be eligible for AI answers. It's the foundation that lets your content and links rank — not a ranking trick of its own. with zero configuration:

  • SitemapA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing.. Auto-generated at /sitemap.xml, updated on publish/unpublish, covering posts, pages, tags, and authors. “Ghost automatically creates and updates an XML sitemapAn XML sitemap is a UTF-8 file listing the canonical URLs on your site (with optional lastmod) so search engines can discover and prioritize them. It's a discovery and diagnostic aid, not a guarantee of indexing — and Google ignores its priority and changefreq tags. 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 tagsA rel=\"canonical\" annotation — in the HTML <head> or an HTTP Link header — that tells search engines which URL is the preferred version of duplicate or near-duplicate content.. 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 GraphOpen Graph (OG) tags are `<meta>` elements in a page's head, defined by the Open Graph protocol (ogp.me, created by Facebook), that describe a page as a shareable object — its title, description, image, URL, and type. They control how a link preview card looks when the page is shared on Facebook, LinkedIn, Slack, Discord, WhatsApp, and iMessage. They are not a direct Google ranking factor, though Google reads og:title, og:image, and og:site_name as inputs to how a result appears. + Twitter Cards. Auto-generated from post metadata and the feature image.
  • Structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. (JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal.). “Ghost automatically includes structured data in all posts and pages”Article schemaArticle schema (Article, NewsArticle, or BlogPosting) is structured data marking up a written piece's headline, author, and dates — Google labels it the \"Article rich result,\" but it's a better-displayed existing result, not a distinct new card, and it isn't required for Top Stories or Discover eligibility. with publisher, author, headline, datePublished, dateModified, image, and keywords.
  • Clean URLs + custom routing. Slug-based URLs by default, fully customizable via routes.yaml.
  • robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere.. 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.
  • HreflangHreflang is an annotation (in HTML, HTTP headers, or XML sitemaps) that tells search engines which language and optional region a page targets, and which alternate versions exist. It only works when every page in the cluster references all the others. / international SEOInternational SEO is the practice of optimizing a site so search engines understand which countries and/or languages it targets, and serve the right version to each user. It spans URL structure, hreflang, and on-page localization. — 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 noindexNoindex is a directive that tells search engines to keep a page out of their index, so it won't appear in search results. It works only on pages a crawler can actually fetch — a page blocked in robots.txt can never be noindexed. 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 redirectsA 302 (\"Found\") is a temporary redirect: it forwards users to a new URL while telling search engines the original URL should stay in the index. It's a weak canonicalization signal, not the zero-equity dead end of SEO folklore. — handled in the frontend or the CDN layer.
  • Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. — Ghost’s speed advantage disappears; the framework and renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. 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 SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. problem — if your frontend defaults to client-side rendering, GooglebotGooglebot is Google's web crawler — the software that fetches pages so Google can index and rank them. It comes in two variants, Googlebot Smartphone (primary, under mobile-first indexing) and Googlebot Desktop, and runs an evergreen Chromium renderer. has to queue the page for a later render wave. AI-crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. rendering varies by provider, so render on the server or at build time (SSR/SSG) to maximize coverage.

TIP Verify that the headless Ghost frontend rebuilt the crawlable page

Ghost can return all the editorial fields through its API while the public frontend still omits them from initial HTML. Compare the delivered document with a browser render; traditional Handlebars Ghost normally does not need this rendering check.

Test a headless route with my free Render Gap Analyzer Free

  1. Test a public post from each headless page template.
  2. Check content, real links, metadata, canonical, and structured data in the initial response.
  3. Move critical output to SSG or SSR, retest, then confirm Google’s view with URL Inspection.
The Ghost Content API can be healthy while its separate frontend still ships a thin crawlable response.

The initial HTML contains about eight words while the rendered page contains about 112. The finding says most content is added by JavaScript.

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 agentA user agent is the HTTP request header a client (browser, crawler, or bot) sends to identify itself. For crawlers, a short user-agent token — a substring of that string — is what robots.txt rules actually target.. 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 TTFBTime to First Byte — the time from the start of a request to when the first byte of the response arrives. It's a diagnostic metric (not a Core Web Vital) and a major input to FCP and LCP; ≤0.8 s is good. and Core Web VitalsWeb Vitals is Google's initiative (launched May 2020) for unified page-experience quality signals. Core Web Vitals — LCP, INP, and CLS — are the subset used in ranking; the rest (TTFB, FCP, TBT, Speed Index) are diagnostic, not ranking factors. 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 indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.. 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 contentThe same or very similar primary content reachable at more than one URL. There's no general duplicate content penalty — the real costs are possible signal dilution, the wrong URL getting chosen, and less-efficient crawling. 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.

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 SEOProgrammatic SEO (pSEO) is the practice of generating many pages from a single template plus a data source to target large sets of similar queries. It's powerful when each page genuinely answers its query with unique data, and spam when it just stamps a thin template across a shallow dataset. — 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 a quote first.