X renders a card. Everything reading Open Graph renders a URL.
This is cause 5 of the 5 ways link previews break. The full breakdown covers the manual fix and the automatic one.
meta[name='twitter:image'] → images.ctfassets.net/... ✓meta[property='og:image'] → not presentmeta[property='og:title'] → not presentThe product index, shared as a link.
A recipe page, the kind people actually share.
X falls back to og:* when twitter:* is missing. Nothing goes the other way. Shipping only twitter:image means every non-X surface is unstyled.
og:image → used by Slack, iMessage,
LinkedIn, WhatsApp, FacebookTeams test link previews by pasting into the company X account. That's the one platform where these tags work, so the gap never shows up.
The cheapest fix is emitting og:image alongside twitter:image. OpenGraph+ points both at a rendered screenshot so they can't drift apart again.