og:image not showing
A shared link with no preview image, or a stale one, is almost always one of four things:
a relative image URL, an oversized or unsupported file, a platform's own cache of an older
version of the page, or the tag missing from the page's <head> in the
first place. This page covers all four, then goes platform by platform.
Check your URL now Free, no account: shows the tags, the image and the card on each platform.
Fix it per platform
For each platform: what you see, what to check, what to do. Run your URL through the OG image checker first; it covers the tag and image checks below in one pass.
X (Twitter)
- Symptom: the link shows as plain text, or with a small thumbnail instead of the large image.
- Check:
twitter:cardis present and set tosummary_large_image;og:image(ortwitter:image) is an absolute https URL. - Fix: add
<meta name="twitter:card" content="summary_large_image">. X no longer offers a public Card Validator, and X does not document how long it caches cards; the common workaround for a link X has already seen is to change the image URL (?v=2).
- Symptom: an old image, or no image, on a post that links to your page.
- Check: open the page in the Post Inspector and read what it scraped.
- Fix: correct the tags, then inspect the URL again so LinkedIn re-fetches it. If the preview is still old, change the image URL.
- Symptom: a stale image, or a warning about missing properties.
- Check: the Sharing Debugger lists the scraped tags and any errors for the URL.
- Fix: repair what it names, then press Scrape Again. Facebook caches images by URL, so a changed image needs a changed URL.
Slack
- Symptom: the link unfurls without an image, or with the one from an earlier version of the page.
- Check: Slack's link fetcher reads the tags from the HTML it receives, so put them in the server-rendered HTML, and make sure the page answers its
Slackbot-LinkExpandinguser agent with a 200 status. - Fix: Slack has no re-scrape tool like Facebook's Sharing Debugger, and its cache length is not documented. Change the image URL (
?v=2) and share the link again.
Discord
- Symptom: a link embed with no picture, or an outdated one.
- Check:
og:imageis an absolute https URL to a PNG or JPEG that loads without a login, and is not blocked for crawlers. - Fix: Discord has no re-scrape tool like Facebook's Sharing Debugger either, so change the image URL, then post the link again.
1. Use an absolute URL
og:image's content must be a full, absolute URL, including
scheme and host — https://yoursite.com/path/to/image.png, never
/path/to/image.png or a relative path. The
Open Graph protocol spec
defines og:image as an image URL, and its URL type is an
http:// or https:// address. A crawler fetching
your page has no reliable base to resolve a relative path against, so use the full URL.
If your page currently emits a root-relative path, that is usually the entire fix.
2. Match the size and format platforms expect
1200×630 px (roughly a 1.91:1 ratio) is a safe default. Facebook recommends at least 1200×630 and says to keep images close to 1.91:1 to show the full image in Feed without cropping, with a minimum of 200×200 and a maximum file size of 8 MB. LinkedIn lists a 5 MB maximum, a 1200×627 minimum and a 1.91:1 ratio. X's card documentation describes a 2:1 ratio for large-image cards, so other platforms may crop slightly differently; keep important content away from the edges. PNG and JPEG are the safe formats; X's card docs list JPG, PNG, WEBP and GIF (first frame only for animated GIFs) and state SVG is not supported.
WhatsApp is the tightest on file size in practice. Meta does not publish an exact number in its official docs, but it is widely reported by developers troubleshooting dropped previews that WhatsApp silently declines to show an oversized image — no error, the link just falls back to text-only — somewhere in the 300 KB–600 KB range depending on report. Since there is no official figure to target exactly, the safe move is to keep the file comfortably under 300 KB (a 1200×630 JPEG at quality 75–80 is normally well inside that). Sources reporting this behavior: opengraph.to and getlinkpeek.com.
3. Platforms cache what they unfurl
Facebook's sharing documentation says it caches images by URL: "We cache all images referenced based on each image's URL", so a replaced image needs a new URL, and updating the image does not automatically update the preview of old shares. Other platforms behave similarly in practice: they store what their crawler first saw and may keep showing it — editing the image file in place, with the same URL, may not change what people see until the platform re-fetches.
Two official tools force that refresh and show you exactly what a crawler saw:
- Facebook Sharing Debugger — shows the scraped tags and errors, and its "Scrape Again" button re-fetches the page for that URL.
- LinkedIn Post Inspector — inspect a URL to see what LinkedIn scraped and to request a fresh fetch.
Where a platform has no re-scrape tool of its own (for example Slack and Discord), the cache-busting param below is the practical fix.
4. Force a fresh fetch with a cache-busting param
Because Facebook documents that it caches images by URL, and other platforms are widely
reported to do the same, the practical way to get a fresh image — including on platforms with
no debugger tool — is to change the image URL. Add (or bump) a query
parameter that doesn't affect rendering, e.g. ?v=2, and point
og:image at that new URL:
<meta property="og:image" content="https://yoursite.com/card.png?v=2">
Every ogmake URL already includes its own parameters in the signed query string, so
changing any rendered field (title, template, etc.) naturally produces a new URL and a
fresh, uncached render — see the quickstart. If you're
serving a static image file yourself and need to force a re-check without changing its
content, appending an incrementing ?v= value is the same trick applied to a
file you don't control the caching headers of.
Still not showing?
Confirm the tag is actually present in the page's server-rendered HTML (not injected later by client-side JavaScript — link-preview crawlers generally read the HTML they receive), confirm the page returns a 200 status to the crawler's user agent, and re-run the Facebook Sharing Debugger above — its error list names the exact tag or fetch problem if one exists.
Building the image itself: the free generator makes a one-off PNG
with no account, and the quickstart covers a signed API URL
you can drop straight into og:image.