Twitter card shows correctly in validators, but X still won’t display image for Ghost posts

Hi everyone,

I am having a persistent issue with Twitter/X cards for posts published on a Ghost site and would love some insight from the community.

  • Site: [https://status.app/blog/...]

  • Problem:

    • When I run my post URLs through Twitter/X card preview tools and other card/OG debuggers, the card looks correct:

      • twitter:card is summary_large_image

      • twitter:image and og:image point to a valid HTTPS image

      • All metadata appears as expected.

    • However, when posting the same URLs on X:

      • The image often does not show in the tweet preview.

      • This links to auto‑shortened not working properly.

      • The issue is reproducible across different X accounts and clients and only affects URLs from this Ghost blog.

Important details:

  • There was never an “early” version of these posts without an image; the feature/OG/Twitter image was present from first publish.

  • Other websites’ URLs show Twitter cards normally from the same X account.

  • X’s card validator says everything is fine (no errors, card loads successfully).

  • Third‑party preview tools (OG/Twitter card testers) also show the correct image and metadata.

What I’ve already tried:

  • Confirmed that:

    • og:image and twitter:image are absolute HTTPS URLs that load publicly in a browser.

    • twitter:card is set to summary_large_image.

    • There are no obvious duplicate/conflicting OG/Twitter tags in the page <head>.

  • Tested tweeting:

    • Plain URL only.

    • URL + text, without attaching any extra image.

  • Waited for X cache to refresh and re‑tested later.

Questions for the Ghost community:

  1. Has anyone seen a pattern where Ghost posts’ cards are correct in validators but X randomly refuses to show the image only for Ghost URLs?

  2. Are there known Ghost‑specific edge cases with Twitter/X (for example around CDNs, redirects, or how twitter:image is generated) that could cause this behavior, even if validators look fine?

  3. Is there any recommended workaround from the Ghost side, such as:

    • Forcing a different twitter:image URL pattern,

    • Adjusting theme metadata,

    • Or changing anything in ghost_head that has helped others with similar issues?

Any pointers, similar experiences, or theme/config tweaks that have worked for you would be very helpful.

You’ve chosen to skip the entire bug report template, which will make it hard for anyone to help diagnose or fix your problem.

Here it is again:

Fill out the following bug report template with as much detail as possible!

Are you sure this is a bug? If you just need help, post in the developer help category. If it’s a feature request, head to the ideas category.


Issue Summary

  • Explain roughly what’s wrong
  • What did you expect to happen?

Steps to Reproduce

  1. This is the first step…
  2. This is the second step, etc.

Setup information

Ghost Version
Share which version of Ghost you’re using.

Node.js Version
If self-hosting - share which version of Node.js you’re using.

How did you install Ghost?
Provide some details about your install of Ghost if you are self-hosting.

Provide details of your host & operating system
Include further details about your hosting and OS.

Database type
MySQL 5.7 / MySQL 8 / SQLite 3 / Other

Browser & OS version
Include if reporting frontend bugs.

Relevant log / error output
Copy and paste any relevant log output. Use backticks to format this into code.

Hi Cathy, thanks for the nudge, and sorry again for not following the template initially.

I’ve now double-checked the setup while reworking the post, and there’s an important clarification:

This is a headless Ghost setup, not a classic Ghost theme or Ghost(Pro) install. Ghost is used via the Content API only (ghost.status.im), and the public blog (status.app/blog) is rendered by a custom frontend hosted on Vercel. I only have editor access, so I don’t have visibility into infra details beyond that.

To align with the template as much as I can, here’s the corrected setup info:

Ghost Version: Unknown (headless Ghost, editor access only)

Node.js Version: Managed by hosting provider (Vercel)

How did you install Ghost? Headless Ghost (API-only usage)

Host & OS: Custom frontend on Vercel + separate Ghost instance

Database: Managed by Ghost instance

Given this setup, I’m no longer assuming this is a Ghost core bug. The behavior looks very similar to X/Twitter image proxy + caching issues, but since it only reproduces with URLs backed by Ghost content, I wanted to sanity-check with the community whether anyone running headless Ghost + custom frontend has seen similar behavior or edge cases.

If this belongs in developer help rather than bugs, happy to move it, just wanted to avoid missing any Ghost-specific quirks before closing the loop on our side.

Thanks for your patience.

Hi Cathy. I have had the same problem with Ghost, since set up. Pics randomly show up on X, however as of late posts show up, but none of the images appear.