The short version: write good Open Graph tags and you've covered all of them. Only X adds its own twitter: layer, and even that falls back to Open Graph. The details below are for when a specific platform misbehaves.
The reference implementation of Open Graph. Reads og:title, og:description, og:image, og:url, og:type and og:site_name. Renders the large 1.91:1 card when the image is at least 600×315; smaller images become a compact left-thumbnail card. Caches hard — use the Sharing Debugger's "Scrape Again" after any change.
Shares Facebook's crawler and cache, so if it works on Facebook it works on WhatsApp. Shows a smaller, squarer thumbnail than the feed card, so keep the essential part of the image centred. Very heavy images sometimes don't load — another reason to stay well under 1 MB.
Reads Open Graph and prefers a 1200×627 image. Historically the most aggressive cacher of all — once LinkedIn has seen a URL, it can hold the old preview for weeks. The Post Inspector is the only reliable way to force a refresh. LinkedIn also reads og:type = article and can surface an author/publisher.
X (Twitter)
The one platform with its own layer. Reads twitter:card, twitter:title, twitter:description and twitter:image — but falls back to the og: equivalents for anything not specified. In practice you only need to add twitter:card = summary_large_image and let it inherit the rest from Open Graph. The old Card Validator is retired; append ?v=2 to bust the cache and post to test. Remember: Twitter tags use name=, not property=.
Slack
Unfurls links using Open Graph, showing title, description and image at a modest size. It also reads <meta name="description"> and even <title> as fallbacks, so a page with basic SEO tags but no OG still gets a usable unfurl. Because it renders small, image text must survive shrinking. Cache expires on its own; a query-string change forces a new unfurl.
Discord
Uses Open Graph much like Slack, plus theme-color to tint the embed's left border — a nice touch for branded links. Supports large images with twitter:card = summary_large_image. Caches for a few minutes to hours; re-posting after a short wait, or a query-string tweak, refreshes it.
iMessage & Signal
Apple's Messages builds a rich link from Open Graph, favouring a large image when the ratio is right and falling back to a small icon otherwise. It's cache-persistent per link and offers no debugger, so get it right before sharing. Signal reads OG similarly. For both, an absolute image URL and a clean 1.91:1 graphic are what matter.
At a glance
| Platform | Reads | Cache | Refresh with |
|---|---|---|---|
| Open Graph | Long | Sharing Debugger → Scrape Again | |
| OG (via Facebook) | Long | Facebook debugger | |
| Open Graph | Very long | Post Inspector | |
| X (Twitter) | Twitter → OG fallback | Medium | ?v=2, then post |
| Slack | OG, then description/title | Short | Query-string change |
| Discord | OG + theme-color | Short | Re-post / query change |
| iMessage | Open Graph | Per-link | No debugger — get it right first |
The takeaway
Don't build seven different tag sets. Write one complete Open Graph block, add twitter:card for X, keep the image at 1200×630 with the message centred, and every platform above renders well. Then confirm it with a side-by-side preview before you share — and when something still looks off, the troubleshooting checklist covers the rest.
Next: the perfect OG image · fix a broken preview · back to the tool