Why Link Previews Break — 7 Common Causes + URL Unfurl Fixes
Link preview problems are frustrating because the cause isn't always obvious — the page looks fine in your browser, but the URL unfurl is wrong, missing, or outdated. Almost every broken preview traces back to one of seven predictable root causes, and each one has a specific fix.
This guide explains each of the seven, teaches you how to check URL metadata the way a platform crawler does so you can spot which cause applies, and links out to the deeper fix guide for each. At the bottom: a quick diagnosis table and an FAQ covering the common follow-up questions.
→ Diagnose your link preview now with TryUnfurl
How to Check URL Metadata Before Sharing
Every broken URL unfurl investigation starts the same way: find out what the platform crawler is actually reading. You have three ways to check URL metadata:
- TryUnfurl — paste the URL and see the Open Graph tags, Twitter Card tags, detected
og:image, and a rendered URL unfurl card for every major platform. No login. No internal cache. - View Page Source —
Ctrl+U/Cmd+Option+U. Search forog:in the HTML. Every tag your server actually sent appears here. If a tag shows in DevTools but not in View Source, it's JavaScript-injected and invisible to crawlers. - cURL —
curl -sL -A "facebookexternalhit/1.1" https://example.com/page | grep og:prints every Open Graph tag a crawler sees, simulating one of the platform user-agents.
Do this before you change anything — the output tells you which of the seven causes below applies.
Understanding the URL Unfurl Process
Every platform runs the same URL unfurl pipeline: fetch your page → parse the <head> → download the og:image → render a card → cache the result. A broken link preview is always a failure in one of those five steps. The seven causes below map almost one-to-one onto those steps.
1. Missing Open Graph Tags
What happens: The platform has nothing authoritative to work with, so it either shows no URL unfurl or scrapes random content from the page — wrong title, no image, or a description pulled from the first paragraph.
How to spot it: View your page source and search for og:title. If it's not there, that's the problem. TryUnfurl will also flag missing tags in one glance.
Fix: Add the core Open Graph tags to every page's <head>:
<meta property="og:title" content="Your Title" />
<meta property="og:description" content="Your description." />
<meta property="og:image" content="https://yourdomain.com/og-image.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://yourdomain.com/your-page" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Your Site Name" />
2. JavaScript-Rendered Metadata
What happens: The page uses a JavaScript framework (React, Vue, Angular, Next.js without SSR) that injects meta tags after the page loads. Platform crawlers — Slackbot, Discordbot, facebookexternalhit, LinkedInBot, Twitterbot — don't execute JavaScript. They see the empty initial HTML with no meta tags.
How to spot it: Paste your URL into TryUnfurl. If it shows missing or empty metadata that you can see in your browser's DevTools, JS rendering is the cause. A cURL against the URL will also confirm — the tags won't appear in the raw response.
Fix: Use server-side rendering (SSR) or static site generation (SSG) so meta tags are present in the initial HTML response. For Next.js, use the metadata export (App Router) or the Head component (Pages Router). For Nuxt.js, use useHead(). For SvelteKit, set <svelte:head>. For pure SPAs, use a prerendering service that serves static HTML to crawlers.
3. Stale Cached Preview
What happens: You updated your metadata, but the platform still shows the old URL unfurl. Platforms cache unfurl results and won't automatically re-fetch when your page changes.
How to spot it: TryUnfurl shows the correct new metadata, but sharing the link elsewhere still shows the old version.
Fix: Force a cache refresh on each platform:
- Facebook — Sharing Debugger → Scrape Again (click twice)
- Twitter/X — Card Validator
- LinkedIn — Post Inspector → Regenerate
- Slack — delete and re-share the link (or
?v=2) - Discord — add
?v=2to the URL when re-sharing - WhatsApp / iMessage / Telegram / Teams — delete + resend, or
?v=2query-string buster
Full per-platform workflow in how to refresh a link preview.
4. Broken or Inaccessible og:image
What happens: The preview shows no image, or the preview is suppressed entirely. Common causes: the image URL is relative (not absolute), the image returns a 404, the image is too small, it's blocked by authentication or robots.txt, or it's a signed URL that has expired.
How to spot it: Open the og:image URL directly in a private/incognito browser window with no cookies. If it doesn't load, crawlers can't get it either.
Fix: Use an absolute HTTPS URL pointing to a publicly accessible JPG or PNG image, sized 1200 × 630 px. Avoid short-lived signed URLs; prefer permanent paths. For the complete fix checklist, see preview image not showing.
5. Bot Crawler Blocked
What happens: Your site uses aggressive bot protection (Cloudflare, a WAF, custom middleware) that blocks platform crawlers, treating them as suspicious traffic. The platform receives a 403 Forbidden or a CAPTCHA page instead of your HTML.
How to spot it: URL unfurls work for most URLs on your site but not for specific pages, or they broke suddenly after adding security tooling. Server logs will show 4xx responses to bot user-agents.
Fix: Add exceptions for known platform crawlers in your bot protection rules:
Slackbot/Slackbot-LinkExpandingDiscordbot/2.0facebookexternalhit/FacebotLinkedInBotTwitterbotTelegramBotWhatsApp
6. Too Many Redirects
What happens: The URL redirects through multiple hops (e.g. HTTP → HTTPS → www → non-www → tracking URL → final destination). Platform crawlers give up after 3–5 redirects and can't reach the final page.
How to spot it: Use a redirect checker (curl -I -L or a browser DevTools Network tab) to count the hops from the shared URL to the final page. More than 3 is risky.
Fix: Minimise redirect chains. Ideally, the shared URL should redirect in a single hop to the canonical URL. Avoid chaining through marketing tracking URLs before the final destination — use UTM parameters on the final URL instead.
7. CDN or Server Caching the Wrong HTML
What happens: You've updated your page metadata and deployed, but your CDN or hosting provider is still serving a cached copy of the old HTML. Every crawler sees the old meta tags regardless of how many times you clear the platform cache.
How to spot it: Paste your URL into TryUnfurl — if it still shows old metadata after you've deployed changes, suspect CDN caching. Verify by checking your CDN dashboard for HTML cache settings or issuing a cURL with -H 'Cache-Control: no-cache'.
Fix: Purge the CDN cache for the affected URL(s) after every deployment that changes metadata. Most CDNs (Cloudflare, Fastly, CloudFront, Vercel, Netlify) allow targeted URL purges via dashboard or API.
Advanced Unfurl Optimization
Beyond fixing breakage, a handful of moves prevent most URL unfurl issues from recurring:
- Ship tags server-rendered. Never inject Open Graph via client-side JavaScript.
- Automate with the TryUnfurl API. Assert
og:image,og:title, andog:descriptionafter every deploy in CI/CD. - Audit monthly. Run evergreen pages through the bulk URL unfurl checker to catch silent regressions from CMS or theme updates.
- Set a site-wide default
og:image. No page should ever ship naked. - Use permanent image URLs. Avoid short-lived signed CDN URLs for
og:image. - Keep redirect chains to 1 hop and canonicals consistent between AMP and non-AMP versions.
Quick Diagnosis Guide
| What you're seeing | Most likely cause |
|---|---|
| No preview at all | Missing OG tags, or crawler blocked |
| Preview shows but no image | Missing/broken og:image |
| Outdated preview | Cached result — force a refresh |
| Wrong title or description | JS rendering, or cached old data |
| Preview works on some platforms, not others | Platform-specific image size mismatch |
| Preview worked, then suddenly broke | Bot protection change, or og:image URL changed |
| Preview works in tester, not in app | Platform cache — force refresh |
| Preview works on desktop, not mobile | User-agent-specific server response, or CDN variant |
Frequently Asked Questions
How do I check URL metadata before sharing?
Paste the URL into TryUnfurl to see every Open Graph tag and a rendered preview for every major platform in one view. Or run curl -sL https://example.com/page | grep og: from the terminal to see the raw tags your server returns.
Why did my URL unfurl work last week and break now?
Most common causes: (1) a deploy stripped OG tags, (2) a CMS or theme update injected duplicate tags, (3) the og:image URL moved or now returns 404, (4) a new WAF rule blocks platform crawlers, (5) a signed-URL og:image expired.
Does a broken URL unfurl hurt SEO?
Not directly — Google doesn't use Open Graph for ranking. But broken link previews reduce social shares and CTR, which indirectly reduces traffic and backlinks.
How can I prevent link previews from breaking in the first place?
Ship Open Graph tags server-rendered, set a site-wide default og:image, automate validation in CI/CD with the TryUnfurl API, and audit evergreen pages monthly with the bulk URL unfurl checker.
Why does the preview look right in the tester but wrong in the app?
The platform has an older URL unfurl cached. Force a re-scrape in the platform debugger, or use a query-string cache-buster on platforms without a debugger.
Diagnose Your Link Preview
Paste any URL into TryUnfurl to see exactly what crawlers are reading from your page — across all platforms at once.
→ Find out why your preview is broken now · → Bulk-check up to 100 URLs