Why Your Link Preview Looks Broken (And How to Fix the Thumbnail)

You paste your link into WhatsApp and no image shows up. Just a bare blue URL. The same link looked fine last week.
When a link preview is not showing, there are four likely causes. The page has no Open Graph tags, the crawler cannot see them, the image is out of reach, or the app cached an old copy.
Check them in that order. The second cause is the most common, and almost nobody explains it.
Why is my link preview not showing?
When you paste a link, the app does not open the page. It sends a small bot called a crawler, which asks your server for the page and reads the head of the HTML.
It is looking for meta tags, and Open Graph is the shared format for them. The Open Graph spec lists four required tags: og:title, og:type, og:image and og:url.
Facebook's webmaster guide names a slightly different four, swapping og:type for og:description. Ship all six and you satisfy both: og:title, og:type, og:image, og:url, og:description and og:site_name.

Step 1: Does the page have Open Graph tags at all?
Open your page and use View Source, not Inspect Element. Search that text for og:. If nothing comes back, add the six tags and test again.
Three tags people add without needing them are twitter:title, twitter:description and twitter:image. X's card documentation said each falls back to its og: equivalent. Only twitter:card has no Open Graph twin, so set that one and skip the rest.
That documentation has since been taken off the web.
Step 2: Can the crawler actually see them?
This is the cause that wastes the most hours: crawlers do not run JavaScript.
Discord says so in its draft link-preview documentation, written but not yet merged. Its wording: "No JavaScript is executed, so tags added by a client-side framework after load are never seen."
No major platform documents a crawler that runs JavaScript. Treat it as the rule.
If your site builds the tags in the browser, the crawler sees an empty head. Your DevTools still show them, because your browser ran the code. View Source will not.
That gap is the test: tags in DevTools but missing from View Source mean the crawler sees nothing. The fix is to render them on the server.
Step 3: Can the crawler reach the image?
Your tags can be perfect and the image can still fail. Work down this list.
- Use an absolute URL. Meta's link sharing FAQ says all URLs "must be absolute". A path like
images/card.pngis not resolved. - Leave the image public. LinkedIn names a blocked crawler, or "a protected directory or website", as causes.
- Check robots.txt. Meta's crawler page warns crawlers may cache it for up to 24 hours, so a fix is not instant.
- Stay under the size cap. Facebook allows 8 MB and LinkedIn allows 5 MB. WhatsApp is far tighter.
- Declare the dimensions. Meta asks for
og:image:widthandog:image:heightso the crawler "can render the image immediately". - Do not block Meta's crawler. That same page lists five named Meta crawlers, and only
facebookexternalhitbuilds previews. A blanket block kills them.

The 600KB rule the web turned into 300KB
You will read everywhere that WhatsApp images must be under 300KB. That is wrong: Meta's WhatsApp page says the image should be "under 600KB in size".
The 300KB figure is real, but it is about HTML. The same page says the head "must appear within the first 300KB of the HTML". Two rules, two different things, merged by years of copying.
1200 x 630 is a recommendation, not a spec
The Open Graph spec sets no dimensions at all. The famous 1200 x 630 comes from Facebook's image guide, which asks for "at least 1200 x 630 pixels".
Meta does not agree with itself. Its Sharing Best Practices page asks instead for images "at least 1080 pixels in width", and both pages are live today.
LinkedIn sets a minimum of 1200 x 627, and X's archived card docs asked for a 2:1 ratio on the large card. A 1200 x 630 image clears LinkedIn and sits close to 2:1, so it works as one default.
Serve JPEG or PNG, not WebP
Only X and Discord document WebP support. Facebook, LinkedIn, WhatsApp, Slack and iMessage document nothing either way, and Meta's sole format list is JPEG, GIF and PNG.
A crawler fetches your image once, so WebP saves you little here and risks a blank card.
Step 4: Is the app showing an old copy?
Sometimes the tags are right and the old card keeps appearing, and then you need a refresh tool.
Facebook's Sharing Debugger has a Scrape Again button and needs a Facebook login. Meta's only published figure is "the standard 24 hour update period". The 30 days you read elsewhere appears nowhere in Meta's docs.
LinkedIn's Post Inspector needs no login. LinkedIn does not publish how long it caches, so treat any seven-day figure as folklore.
X has no working card debugger. The old validator now sends you to a login page, and X's card documentation is gone from the live web.
Slack's unfurl debugger needs a workspace sign-in. Discord caches for about half an hour per its draft docs, and its fix is a new query string like ?v=2.
WhatsApp and iMessage have no refresh tool at all. Stop hunting for one. Your only reliable fix there is a fresh URL. WhatsApp also tells you nothing about who clicked, which has its own workaround.

Whose preview shows when you paste a short link?
Short links look cleaner, and cleaner links tend to earn more clicks.
The card you see belongs to the destination page, not to the shortener. A plain short link has no preview data of its own.
We asked a TinyURL link for its page while posing as Facebook's crawler. It answered with a 301 and 306 bytes: a Redirecting stub and zero Open Graph tags.
That leaves a crawler two options: follow the redirect and read the tags at the end, or show no card. Short links do produce rich cards every day, so crawlers follow the redirect.
How many hops they follow is mostly unpublished. Discord's draft docs say at most five. Nobody else states a number, so keep chains short and use a clean 301 or 302.
There is one exception: a shortener can answer with a real page carrying its own Open Graph tags, instead of a bare redirect. Then the short link owns the card. On clik.so that happens when a link has a custom title, description or image set, on the Starter plan and up.
It is also why a short link sometimes shows a card that does not match the page.
FAQ
Why does the preview work on Facebook but not on WhatsApp?
They enforce different limits. WhatsApp wants the image under 600KB and the head inside the first 300KB of your HTML, while Facebook allows an 8 MB image. WhatsApp also has no refresh tool, so a bad card there outlives the fix.
Do I need twitter: tags as well as og: tags?
Mostly no. X's card documentation, before it was withdrawn, said twitter:title, twitter:description and twitter:image all fall back to their og: equivalents. Only twitter:card has no Open Graph twin, so set that and skip the other three.
How do I clear a cached preview on X?
You cannot: the old card validator redirects to a login page, and X's card documentation is no longer published. Paste the link into the composer and see what X draws today.
Want to try this yourself?
Fix the tags first. That solves most broken previews for free. If you also want a short link to carry its own title and image, that is what custom link previews are for. The clik.so free plan includes one custom domain and 2,000 tracked clicks a month, with no card required.

