You paste a URL into LinkedIn / X / Slack / Telegram and the preview card either renders without an image or shows an old image you replaced weeks ago. OG failures cluster into three groups: meta tags written incorrectly (usually a relative path), the image itself not meeting platform requirements (size, format, file size), or the social platform serving a cached 24-hour-old crawl. This article ranks 5 hit-rate-sorted causes and gives a fix path from debugger inspection to forced re-scrape.
Common causes
Ordered by hit rate, highest first.
1. og:image uses a relative path
Social-media crawlers don’t resolve relative paths — they take whatever string is in content and try to fetch it as-is. <meta property="og:image" content="/og.png"> renders fine in the browser but the crawler gets a string it can’t fetch.
<!-- Wrong: relative path, crawlers fail -->
<meta property="og:image" content="/og/article-slug.png" />
<!-- Right: must be an absolute URL with protocol -->
<meta property="og:image" content="https://yourdomain.com/og/article-slug.png" />
How to spot it: LinkedIn Post Inspector / Facebook Sharing Debugger / opengraph.dev shows the og:image field starting with / instead of https://.
2. Image dimensions / ratio don’t meet platform requirements
Each platform has hard minimum size and aspect ratio rules. Anything below the minimum simply doesn’t render:
| Platform | Recommended | Minimum | Aspect ratio |
|---|---|---|---|
| Facebook / LinkedIn | 1200×630 | 600×315 | 1.91:1 |
| Twitter / X (summary_large_image) | 1200×628 | 300×157 | 2:1 |
| Slack | 1200×630 | 600×600 | loose |
| any, prefers 5:4 | 300×300 | — |
Anything narrower than 600px will fail on most platforms.
How to spot it: Debugger error Image size is too small, or the preview shows only title + description with no image.
3. Social platform cached an old crawl
LinkedIn / Facebook / Twitter cache crawl results for 7–30 days. You updated og:image but shares still show the old one.
How to spot it: Debugger displays “Last scraped: 5 days ago” or similar; new URLs work on first share but updated URLs don’t.
4. Image URL requires auth or has CORS restrictions
og:image points at a CDN that needs a cookie / token / referrer (e.g. signed Cloudinary URLs), or the origin sets Access-Control-Allow-Origin rules that exclude the social crawler’s UA.
How to spot it:
curl -A "facebookexternalhit/1.1" -I "https://yourdomain.com/og/article.png"
# Expect 200 + image/png; a 403 / 401 / redirect to login means it's gated
5. File format / size out of bounds
GIF / SVG / WebP aren’t universally supported; files over 5MB get dropped (Facebook caps at 8MB, LinkedIn 5MB, Twitter 5MB).
ls -lh og.png # expect < 1MB; over 3MB risks being rejected
file og.png # expect PNG image data or JPEG image data
How to spot it: Debugger reports Unsupported image format or Image too large.
Shortest path to fix
Use each platform’s debugger to see exactly what the crawler is receiving, then fix targetedly.
Step 1: Run the page through each platform’s debugger
| Platform | URL |
|---|---|
| https://developers.facebook.com/tools/debug/ | |
| https://www.linkedin.com/post-inspector/ | |
| Twitter / X | Legacy Card Validator is gone; use https://opengraph.dev |
| Telegram | DM @WebpageBot and send the URL |
Paste your URL, then check:
- Is
og:imagean absolute URL? - Is the previewed image correct?
- Are there any error messages?
Step 2: Verify the meta tags are complete and absolute
Minimum viable set:
<meta property="og:title" content="Article title" />
<meta property="og:description" content="One-sentence summary" />
<meta property="og:image" content="https://yourdomain.com/og/article.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://yourdomain.com/articles/article-slug/" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://yourdomain.com/og/article.png" />
In Astro / Next.js, force absolute URLs with a helper:
// src/lib/og.ts
const SITE = import.meta.env.PUBLIC_SITE_URL ?? "https://yourdomain.com";
export const absoluteOg = (path: string) =>
path.startsWith("http") ? path : `${SITE}${path.startsWith("/") ? "" : "/"}${path}`;
Step 3: Confirm the crawler can actually fetch the image
# Pull as the Facebook crawler
curl -A "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" \
-I "https://yourdomain.com/og/article.png"
# Expect:
# HTTP/2 200
# content-type: image/png
# content-length: < 5000000
A 403 / 401 / 302 means auth or routing is blocking the crawler. Make the path public (whitelist the crawler UA at the CDN, or move the image into the static public/ directory).
Step 4: Force a re-scrape
Every debugger has a “Scrape again” / “Re-scrape” / “Refresh” button:
- Facebook Debugger: paste URL → “Debug” → “Scrape Again”
- LinkedIn Post Inspector: paste URL → auto-rescrapes (cache ~7 days)
- Twitter (opengraph.dev): paste URL → “Refresh”
- Telegram: DM @WebpageBot the URL, hit “refresh” in the reply
For bulk refreshes, script the Facebook Graph API ?scrape=true:
curl -X POST "https://graph.facebook.com/?id=https://yourdomain.com/articles/foo&scrape=true&access_token=$FB_TOKEN"
Step 5: Re-export the image to spec if it’s the wrong size
Export at 1200×630 PNG or JPEG, target 300KB–1MB:
# ImageMagick one-liner
convert input.png -resize 1200x630^ -gravity center -extent 1200x630 -quality 85 og.png
# Or sharp (Node.js)
npx sharp-cli -i input.png -o og.png resize 1200 630 --fit cover
Avoid SVG (poor support) and GIF (animated frames usually pick an ugly still).
Prevention
- Standardize on 1200×630 PNG/JPG OG images, file size under 1MB; avoid SVG / GIF / WebP.
- Use a helper to coerce og:image and og:url to absolute URLs so per-article authors can’t get it wrong.
- Add a CI check that
curl -A facebookexternalhit ...fetches each new article’s og:image and asserts 200 + correct content-type. - After publishing, immediately trigger a scrape in the Facebook and LinkedIn debuggers so the default 30-day cache doesn’t block early shares.
- Auto-generate OG images from the article title (@vercel/og, satori, puppeteer) so “forgot to add an image” can’t happen.
Related
- Canonical wrong after domain change
- Deploy succeeded but page still shows old content
- Static assets 404
Tags: #Hosting #Debug #Troubleshooting #SEO