Social SEO

Link Preview Not Showing? How to Fix Broken Social Cards on Any Platform

By the SEOtest.app Editorial TeamMay 14, 20267 min read

When you paste a URL into Slack, Facebook, or iMessage and get a bare blue link instead of a preview card, the cause is almost always one of four things: the scraper can't reach your tags, the image is missing or too heavy, the platform is showing a cached old version, or the wrong field is being read. Each has a different fix, so the trick is to identify which symptom you have before changing anything.

Start by seeing what the scraper actually sees, not what your browser sees. Run the URL through our Open Graph checker. It fetches your live HTML the way a social bot does and shows the exact tags it found plus a rendered preview. Nine times out of ten the checker tells you the answer in five seconds: a tag is missing, an image URL is broken, or everything's fine and the platform is just caching. This post assumes you already know what Open Graph tags are; if you don't, start with the Open Graph meta tags guide and come back.

Symptom 1: no card appears at all

You get the raw URL, no box, no image, nothing. This means the platform's scraper found no usable Open Graph tags. There are three reasons.

The tags aren't in the HTML the bot receives. The most common case in 2026: your og: tags are injected client-side by JavaScript (a React or Vue app that sets them after render). Social scrapers read the initial HTML response and mostly don't execute JavaScript, so they see an empty <head>. Fix it by rendering the tags server-side or prerendering the page. To confirm this is your problem, view the page source with JavaScript disabled, or check what the OG checker reports versus what you see in devtools.

The bot is blocked. Your robots.txt, a firewall, or a WAF (Cloudflare bot-fighting rules, for example) may be blocking facebookexternalhit, Twitterbot, LinkedInBot, or Slackbot before they reach the page. A 403 or a challenge page to the bot means no card. Check your server logs for those user-agents getting non-200 responses, and allowlist them.

The tags are malformed. A stray unclosed tag or the og: properties placed in <body> instead of <head> can make the parser give up. The checker will show them as missing.

Symptom 2: card shows but the image is missing

You get a title and description in a box, but the image slot is empty or gray. The text tags worked, so the problem is specific to og:image.

Relative URL. og:image must be an absolute https:// URL. /images/card.png won't resolve for an external scraper; it needs https://yoursite.com/images/card.png. This is the single most common image failure.

The image is too large. WhatsApp and iMessage want the image under roughly 300 KB or they show nothing. Facebook and LinkedIn tolerate more but have their own ceilings. A 4 MB PNG screenshot is a frequent culprit. Export a compressed JPG at 1200x630.

The image URL is slow or gated. Scrapers time out. If the image sits behind authentication, hotlink protection, or a slow CDN cold-start, the fetch fails and the slot stays empty. Confirm the URL loads publicly in an incognito window.

No dimensions declared. Add og:image:width (1200) and og:image:height (630). Facebook and LinkedIn often won't render the large card on the first scrape without them, showing nothing until they've fetched the image once, which is exactly when your launch post goes live. For the full spec, see OG image size and format best practices.

Symptom 3: the card is stale (shows the old version)

You fixed the tags, but the preview still shows yesterday's title and image. Nothing is broken. Every platform caches scraped metadata hard, some for a week or more, and won't re-fetch until you force it. Here's how to force a re-scrape per platform:

| Platform | How to force a re-scrape | | --- | --- | | Facebook | Sharing Debugger, paste the URL, click "Scrape Again" | | LinkedIn | Post Inspector, paste the URL, it re-scrapes on load | | X / Twitter | No public validator now; append a throwaway ?v=2 to bust the cache | | Slack | Post the link, then "delete" and re-post; Slack re-fetches after ~30 min | | Discord | Edit and re-send, or append a query string | | WhatsApp | Append a query string; WhatsApp keys its cache to the exact URL |

The universal fallback that works everywhere: append a unique query parameter (?v=2, ?v=3) to the URL you share. To the scraper it's a new URL with no cache entry, so it fetches fresh. Harmless to the page, and the fastest way to confirm your fix actually worked.

Symptom 4: the card shows the wrong title or description

The preview appears but the title is your site name, or an old headline, or something you didn't set. This is a fallback-order problem.

Platforms read og:title first. If it's missing, they fall back to the <title> tag, then to an <h1>, then to whatever text they can scrape. So a card showing your generic site-wide <title> usually means og:title isn't present or isn't being read (see symptom 1 for client-side injection). Same logic for description: og:description falls back to <meta name="description">, then to page text.

The wrong-title case that surprises people: you set og:title correctly but the platform still shows the old one. That's symptom 3, caching, wearing a disguise. Re-scrape and check again.

The order to work through it

Don't shotgun changes. Run this sequence:

  1. Run the URL through the OG checker to see what the bot sees.
  2. Match the result to one of the four symptoms above.
  3. Apply that symptom's fix and deploy.
  4. Force a re-scrape on the target platform (or append ?v=2).
  5. Re-run the checker to confirm.

If you're preparing a launch and want to see the card on every platform at once before you post anywhere, the sibling workflow is previewing across platforms, covered in how to preview a link before sharing.

Frequently Asked Questions

The platform's scraper found no usable Open Graph tags. The most common reason in 2026 is that your og: tags are injected by JavaScript after page load, and social bots read only the initial HTML. Render the tags server-side. The other causes are a firewall or robots.txt blocking bots like facebookexternalhit, or malformed tags outside the <head>.

The og:image tag has a problem specific to the image. Most often it's a relative URL (it must be an absolute https:// link), an image over ~300 KB (which WhatsApp and iMessage reject), a slow or login-gated image URL, or missing og:image:width and og:image:height that stop Facebook rendering the large card on first scrape.

Use the platform's debugger where one exists: Facebook's Sharing Debugger has a "Scrape Again" button and LinkedIn's Post Inspector re-scrapes on load. Where there's no validator, append a throwaway query parameter like ?v=2 to the shared URL, which the scraper treats as a fresh URL with no cache.

Platforms read og:title first and fall back to the <title> tag if it's missing, so a wrong title usually means og:title isn't present or is being injected client-side where the bot can't see it. If og:title is correct but the old one still shows, the platform is serving a cached card, so force a re-scrape.

Do social bots run JavaScript when scraping my page?

Mostly no. Scrapers like facebookexternalhit, Twitterbot, LinkedInBot, and Slackbot read the initial HTML response and generally do not execute JavaScript. If your meta tags are added client-side, the bot sees an empty head and shows no card. Render Open Graph tags server-side or prerender the page.

Related Guides

Put this knowledge into action

Analyze your website with our free SEO tool and get instant recommendations.

Analyze Your Website