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.
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
states this directly: image properties are URLs, and a URL without a scheme is not one a
crawler can resolve reliably. Facebook's crawler documentation makes the same point in its
own examples, always showing a full https:// 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 the size every major platform renders full-bleed
without cropping or padding; PNG or JPEG are the two formats every platform reliably
supports — avoid SVG and animated GIF for og:image, neither renders
consistently across unfurlers.
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 own sharing documentation states it plainly: "Images are cached based on the URL and won't be updated unless the URL changes." The first time a platform's crawler fetches a link, it stores the og:image (and the other tags) and serves that cached copy on future shares — editing the image file in place, with the same URL, does not update what people see until the cache expires or is forced to refresh.
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, clearing Facebook's (and Messenger's) cached preview for that URL.
- LinkedIn Post Inspector — the equivalent tool for LinkedIn's own unfurl cache.
Slack, Telegram and iMessage don't publish an equivalent public debugger; for those, the cache-busting param below is the practical fix.
4. Force a fresh fetch with a cache-busting param
Because platforms cache by URL, the reliable way to make any of them re-fetch an image —
including the ones with no debugger tool — is to change the 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 — most unfurlers don't execute it), 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.