Home/ Guides/ Link preview not working
Guide · Open Graph
Why your link preview is broken on X, fine on LinkedIn.
Same URL, two different stories: it unfurls beautifully on LinkedIn and falls flat on X (Twitter). The cause is almost always a missing twitter:card tag plus a stale, aggressive cache. Here's how to diagnose the mismatch and fix it.
The short answer
X needs a twitter:card tag. LinkedIn doesn't.
X (Twitter) reads Twitter Card tags first and only draws the big banner when twitter:card = summary_large_image. LinkedIn, Facebook, Slack and Discord just read your og: tags. So a page with only og: tags renders on LinkedIn but shows a bare or small card on X. The other usual suspects: a stale per-platform cache, a scraper bot blocked by robots.txt or user-agent rules, a relative or non-HTTPS og:image, or an image over ~1 MB.
Tired of chasing tags per platform? Every slsh.me short link ships one correct card, with og: and twitter:card set together, so it renders right on X, LinkedIn and everywhere else. Free.
Who reads what.
The mismatch comes down to which tags each platform's scraper trusts — and how long it remembers the first thing it saw.
| Platform | What it reads | Common failure |
|---|---|---|
| X / Twitter | twitter:card, then og: fallback | No summary_large_image → small card or no image. Caches the first scrape hard. |
og: tags | Aggressive cache — once scraped, the old card sticks until you re-run the Post Inspector. | |
og: tags | Caches scrapes; the Sharing Debugger ("Scrape Again") is the only reliable refresh. | |
| Slack & Discord | og: tags | Usually forgiving, but skip a blocked scraper or a non-HTTPS og:image. |
| iMessage & WhatsApp | og: tags | Crop to a tight bubble — edge content and tall images get cut. |
Why the mismatch happens.
Every platform runs its own scraper. When you paste a link, a bot fetches the page and reads its <meta> tags, then decides on its own what to show. The scrapers don't share results, so a tag one platform ignores can be the very tag another requires.
X requires a Twitter Card tag. X looks for twitter:card first. With twitter:card set to summary_large_image you get the full-width banner; set to summary you get a small square thumbnail; absent, X falls back to your og: tags but won't draw the large card. LinkedIn, Facebook, Slack and Discord never look at twitter:* at all — they read og:title, og:description and og:image. That single difference is why an og-only page is fine on LinkedIn and broken on X.
Caching is per platform, and sticky. The first time a URL is scraped, the result is cached; edit your tags afterward and the platform keeps showing the stale card until you force a re-scrape. Each one caches independently, so a fix can land on one network and still look broken on another for hours.
Blocked or mis-served scrapers see nothing. If robots.txt or a user-agent / WAF rule blocks Twitterbot, facebookexternalhit or LinkedInBot, that platform gets an empty page and renders a bare card — even though the tags are perfect for everyone else.
og:image must be absolute and HTTPS. A relative path like /og.png or an http:// URL resolves in your browser but not for a scraper, so the image silently drops. See the Open Graph image size guide for the exact spec, and the Open Graph tags guide for the full tag set.
The diagnosis checklist.
Work these four in order. The first one fixes the X-vs-LinkedIn mismatch most of the time.
Confirm twitter:card = summary_large_image
View source on the page and search for twitter:card. If it's missing or set to summary, that's your X problem in one line. Add <meta name="twitter:card" content="summary_large_image">; twitter:title/description/image are optional and default to your og: values.
Check og:image is absolute, HTTPS, and under ~1 MB
The URL must start with https:// and be a full address, not /og.png. Keep the file under 1 MB at 1200×630 — heavy or relative images drop on the platforms that are otherwise fine.
Force a re-scrape on each platform
Your tags may already be correct but cached stale. Run the URL through Facebook's Sharing Debugger ("Scrape Again") and LinkedIn's Post Inspector, and for X paste it fresh — append ?v=2 if the old card lingers. Each cache is separate, so refresh them all.
Confirm the scrapers aren't blocked
Check robots.txt and any user-agent / WAF rules don't block Twitterbot, facebookexternalhit or LinkedInBot. A blocked bot sees an empty page and renders a bare card — even when the tags are flawless.
Test it the fast way.
Instead of pasting into four platforms and clearing four caches, fetch your page once and see every card side by side. A checker reads your live tags and renders the real preview per platform — so you can spot the X-vs-LinkedIn gap before you post, not after.
The free slsh.me Open Graph checker fetches your page, reads its og: and twitter:card tags, and renders the real card on X, LinkedIn, Facebook, Slack, Discord, iMessage and WhatsApp — with a best-practices audit that flags a missing summary_large_image or a relative image.
Or stop maintaining tags by hand: every slsh.me link ships one correct card that renders everywhere, free.
Questions
Why does my link preview work on LinkedIn but not Twitter/X? +
og:) tags, so a page with only og: tags unfurls fine there. X (Twitter) looks for Twitter Card tags first — if there's no twitter:card set to summary_large_image, it falls back to a small card or none at all, and its scraper caches aggressively. Add the twitter:card tag and force a re-scrape and the X card matches LinkedIn.Do I need twitter:card tags if I have Open Graph tags? +
og:title, og:description and og:image when Twitter Card tags are missing, but it won't draw the large image card unless twitter:card is set to summary_large_image. To match what LinkedIn and Facebook show, add at minimum twitter:card = summary_large_image; twitter:title, twitter:description and twitter:image are optional and default to the og: values.How do I refresh a cached link preview? +
?v=2 if it still shows the old card). A working preview checker fetches your page live, bypassing all of those caches.Why is my X card showing a small image instead of a large one? +
twitter:card is set to summary (or is missing and X guessed), not summary_large_image. The large 1200×630 banner card only renders when twitter:card is explicitly summary_large_image and og:image is an absolute HTTPS URL under about 1 MB. Set both, re-scrape, and the small card becomes the large one.One link, one correct card.
Shorten any URL with slsh.me and it ships both the og: and twitter:card tags set together — so it renders right on X, LinkedIn and everywhere else. No more per-platform tag chasing, plus live click analytics for free.
Free forever · see pricing