Hi all, I’m Minh, founder of SEOmatic. Before posting I read through the SEO threads here, and the same story keeps coming up: someone opens Search Console, traffic has dropped or half their posts aren’t indexed, and the thread ends with “check your redirects” or “be patient”. The hard part isn’t Ghost. Ghost’s technical SEO is genuinely good. The hard part is that nobody looks at your Search Console data and tells you what’s actually wrong and what to do about it.
That’s the part we built. You connect Google Search Console and your Ghost site (Admin API key, no plugin, Ghost Pro or self-hosted). AI agents read your real search data and tell you which posts are slipping, which are sitting just off page 1, and what to change. On paid plans they can apply the fixes too: refreshes, internal links, canonicals, schema (Ghost’s API exposes real fields for these, which most hosted platforms don’t). Every change is a diff you approve first, and one click undoes it.
If you just want the diagnosis part, that’s free: we made an MCP server, so you can ask Claude or ChatGPT “why did my traffic drop?” or “which posts are almost on page 1?” against your own Search Console data. No card needed.
Hopefully your agents know what Ghost does if you set a post’s canonical tag to itself, right?
At the risk of sounding like Claude (no AI used in the drafting of this or any other forum post), setting a post’s canonical can be a real “footgun”, in that Ghost doesn’t include any posts with a set canonical in the site’s sitemap.
Good catch, and thank you - you’re right that this was true until Ghost 29427 merged in July, and still true on older self-hosted versions. We’ve just shipped a guard for exactly this: our agents never set self-referencing canonicals on Ghost, only cross-URL canonicals where sitemap exclusion is the intended outcome. Genuinely appreciate the footgun warning.
Related question on the schema part. Your integration page says the JSON-LD goes into the post head, so I assume that’s codeinjection_head. Thing is, ghost_head already outputs an Article/BlogPosting block on every post, in every theme, and there’s no way to switch that off. I just checked on one of my own sites and it’s there on every post. So if an agent adds Article schema, does that end up as a second Article entity on the same page? I’ve seen that go wrong more than once, two blocks with slightly different dates or author and Search Console starts complaining. Or do you only add the types Ghost doesn’t do itself, like FAQPage or HowTo, and leave the Article alone?
Yes - exactly that. On Ghost we only add types Ghost doesn’t already output, so FAQPage, HowTo, Product, LocalBusiness and similar. We never write Article or BlogPosting there, so you won’t get a second Article entity next to ghost_head’s.
On suppressing Ghost’s own schema: you’re right that {{ghost_head exclude=“schema”}} works on recent Ghost versions, and right that it’s not worth it for most people.
One thing worth flagging since you’re deep in this: codeinjection_head is a partial-update field, so anything writing to it has to merge rather than overwrite. Ours preserves whatever you already have in there.
Great, that’s what I was hoping to hear. And yes, the codeinjection_head thing bites; I’ve seen integrations treat it as write-only and wipe whatever was in there. Maybe worth a line in the docs.