Fix Your Sitemap for Ghost
Ghost generates a sitemap index at /sitemap.xml with separate children for posts, pages, tags, and authors. Each of these sub-sitemaps has its own quirks that can surface thin or duplicate content.
Ghost splits its sitemap into sub-files automatically, which is great - you get per-category coverage data in Google Search Console. The flip side: each sub-file is generated without user input, so a stale author or abandoned tag silently ends up in search results. And Ghost won't let you edit the sitemap directly. All fixes happen upstream, in your Ghost Admin dashboard.
Looked at a Ghost newsletter site with 480 posts. The sitemap index showed 480 posts, 14 pages, 312 tags, and 9 authors. Turns out the 312 tags included every guest-post tag the team had ever used (one tag per guest), and only 2 of the 9 authors had published anything in the past year. Cleaning both brought GSC's "crawled, not indexed" bucket down from 38% to 11%.
Common Ghost Sitemap Issues
sitemap-tags.xmlexposing empty or guest-only tagssitemap-authors.xmllisting staff who've never published, creating thin author archivessitemap-amp.xmlstill live on older Ghost installs after AMP was deprecated- Members-only and paid-only posts appearing with partial content in
sitemap-posts.xml - RSS feeds (
/rss,/feed) inconsistent with sitemap URL structure - Paginated index pages (
/page/2/) leaking in via custom themes using the pagination helper - Subdirectory installs (Ghost at
/blog/) submitted as root-level sitemaps in GSC by mistake - Custom domain changes leaving old domain URLs in the sitemap until cache rebuilds
Tag and author hygiene
Ghost has an underused feature: internal tags. Any tag prefixed with # is internal-only - it doesn't render on the site, doesn't appear in sitemap-tags.xml, and doesn't get its own URL. Use them liberally for editorial categorization that shouldn't produce public pages.
For authors: every staff member with login access gets an author page, whether they've published or not. In Ghost Admin > Staff, remove people who'll never write, or demote them to Contributor and reassign their posts to the owner. The author archive disappears as soon as the account is removed.
AMP cleanup on older installs
Ghost 4.x and earlier shipped AMP output and emitted sitemap-amp.xml. AMP has been deprecated, but the sitemap entry can linger after upgrade. Disable AMP in Settings > Integrations > AMP, then 410 the old paths at the reverse proxy:
# nginx
location ~ /amp/?$ {
return 410;
}
# Caddy
@amp path_regexp /amp/?$
respond @amp 410
# Also verify
curl -I https://yoursite.com/some-post/amp/
# HTTP/2 410Members-only posts and canonicals
Posts set to Members or Paid access still render a public teaser and still go into sitemap-posts.xml. That's usually fine - Google indexes the teaser and users click through. But if you have two versions of the same content (a public teaser and a members-only full post at a different URL), set the canonical on both to the same URL so they don't compete. Ghost lets you set a Canonical URL in each post's metadata panel.
Subdirectory installs
If Ghost runs at yourdomain.com/blog/, the sitemap URL is yourdomain.com/blog/sitemap.xml, and every URL inside has the /blog/ prefix. Submit this URL, not the root one. In GSC, if your site uses the root domain as a property, the blog sitemap will show up fine - but make sure your Ghost url config in config.production.json includes the subdirectory, or internal links will be broken.
Step-by-Step Fix Guide
- In Ghost Admin > Tags, delete or merge empty and guest-only tags. Prefix internal-only tags with
# - Under Staff, remove inactive authors so
sitemap-authors.xmllists only real contributors - Disable AMP and 410 the
/*/amppaths at the reverse proxy if on Ghost 4 or earlier - Set canonical URLs on members-only posts that duplicate public content
- Edit robots.txt via hosting config (Ghost Pro: ask support) to disallow
/p/preview routes - Restart Ghost or wait for cache rebuild, then verify with
curl https://yoursite.com/sitemap.xml - Submit each sub-sitemap to Google Search Console to get per-type coverage reports
- Monitor the tags and authors sub-sitemaps monthly - they're the ones that rot quietly