Facebook Link Preview Not Working? How to Fix It
When you share a link on Facebook or send it in Messenger, Facebook fetches the page, reads its Open Graph tags and builds a card with an image, a title, a short description and the domain.
When the card shows the wrong title, no image, a tiny thumbnail or nothing at all, the cause is almost always one of five things: missing or wrong og tags, an image Facebook will not use, Facebook's crawler being blocked, an og:url or redirect that points somewhere else, or an old preview held in Facebook's cache. This guide covers each one, how to confirm which you have with the Sharing Debugger, and how to fix it.
How Facebook builds a link preview
When a link is shared in a post, a comment or a Messenger chat, Facebook's crawler requests the page
from your server. It identifies itself with a user agent containing facebookexternalhit,
and sometimes Facebot. It reads the HTML head, picks out the Open Graph tags, fetches the
image and stores the result. That stored copy is what every later share of the same URL uses, until Facebook
fetches the page again.
Four things follow from that:
- Facebook reads the HTML your server sends, not what a browser builds after running JavaScript. Tags added by a script after the page loads are invisible to it.
- It reads only the start of the page. Facebook's crawler reads roughly the first megabyte of HTML, so tags placed after very large inline scripts or styles can be missed.
- The image is processed separately. The very first share of a new URL can appear without an image while Facebook downloads it, unless the page states the image width and height.
- Facebook keeps its copy for a long time, often around a month. Fixing the page does not change the preview until you ask Facebook to fetch it again.
Facebook uses Open Graph tags first. If they are missing it guesses from the <title>,
the meta description and the images it finds on the page, which is how previews end up showing a logo,
a banner advert or an icon.
The tags Facebook reads
| Tag | What Facebook uses it for | Notes |
|---|---|---|
og:title | The bold title on the card. | Keep it under about 60 to 70 characters so it is not cut short. |
og:description | The line under the title. | Often shortened or hidden on mobile. Put the key point first. |
og:image | The card image. | A full https address. Relative paths are ignored. |
og:image:width, og:image:height | The image size, before the image is downloaded. | Lets the very first share show the image straight away. |
og:url | The address Facebook files the preview, likes and shares under. | Must match the canonical URL of the page. Facebook fetches this address, not the one shared. |
og:type | The kind of content. | article for posts and
guides, website for home pages. |
og:site_name | The site name. | Facebook often shows the domain instead. |
fb:app_id | Links the page to a Facebook app for insights. | Optional. The Debugger warns when it is missing, but the preview works without it. |
A correct set you can copy
<head>
<meta charset="UTF-8">
<title>Autumn menu launch: six new dishes | The Old Mill Kitchen</title>
<link rel="canonical" href="https://example.com/news/autumn-menu">
<meta property="og:type" content="article">
<meta property="og:site_name" content="The Old Mill Kitchen">
<meta property="og:url" content="https://example.com/news/autumn-menu">
<meta property="og:title" content="Our autumn menu is here: six new dishes from 1 October">
<meta property="og:description" content="Slow-roasted squash, venison pie and a new Sunday roast, made with produce from farms within 20 miles.">
<meta property="og:image" content="https://example.com/images/autumn-menu-1200x630.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="A table set with the new autumn dishes at The Old Mill Kitchen">
</head>
Open Graph tags use property=, not name=. Put them near the top of the head,
and make sure each appears only once; if a plugin and the theme both output them, Facebook may use either
copy.
Images Facebook will show
A card with no image, a small square thumbnail instead of a wide picture, or a cropped image is an image problem. Facebook is strict about images.
| Requirement | What works | What fails |
|---|---|---|
| Size | 1200 x 630 pixels (a 1.91:1 ratio) | Images under 600 x 315 show as a small thumbnail; under 200 x 200 are rejected. |
| File size | Under 8 MB; under 1 MB loads fastest | Very large files time out while Facebook downloads them. |
| Format | JPG or PNG | SVG is not supported. |
| Address | Full https URL returning 200 | Relative paths, addresses that redirect to a login, images on a different blocked domain. |
| Access | Public, no cookies needed | Hotlink protection, signed CDN links that expire, robots.txt rules on the image folder. |
Keep text and faces away from the edges: Facebook crops slightly differently in the feed, in Messenger and on mobile. The same 1200 x 630 image works for LinkedIn, X, Slack, Discord and WhatsApp.
autumn-menu-v2.jpg,
then scrape the page again.When Facebook cannot fetch the page
If the Sharing Debugger shows a response code other than 200, an error such as "Could not scrape URL because it has been blocked", or no tags at all, Facebook's crawler is not getting the page. Check these in order:
- Firewalls and bot protection. Cloudflare Bot Fight Mode, Wordfence, ModSecurity
rules and hosting "anti-bot" settings often challenge or block
facebookexternalhit. A challenge page has no tags, so the Debugger shows nothing useful. Add an allow rule for the user agent. - robots.txt. Keep
facebookexternalhitallowed, including on the folder that holds your images. - Login walls, age gates and cookie gates. A page that sends visitors without a cookie to a login, age check or consent page gives Facebook that page instead. The tags must be in the HTML served to a visitor with no cookies.
- Country blocking. Blocking traffic from outside the UK also blocks Facebook's crawlers, which do not run from the UK.
- Slow responses. Facebook gives up on pages that take several seconds to respond. Heavy pages built on every request are the usual cause.
- Blocked domains. If Facebook has flagged the domain as spam or unsafe, links will not share at all. The Debugger says so, and the fix is to clean the site and ask Facebook for a review.
Your server's access log settles the question. Search it for the crawler after pressing Debug: no line means the request was blocked before it reached the site; a 403, 429 or 503 means the site refused it; a 200 means the problem is in the tags or the image.
sudo grep -i "facebookexternalhit" /var/log/nginx/access.log | tail -5
og:url, canonical URLs and redirects
Facebook treats og:url as the real address of the page. If it points somewhere else,
Facebook fetches that address and shows its preview instead. This causes some of the most confusing problems:
- Every page shows the home page preview. The theme sets
og:urlto the home page on every page. Make it the address of the page itself. - The preview shows an old version of the address. After moving a page,
og:urlstill names the old address. Update it to the new canonical URL. - Redirect chains. Facebook follows redirects, but each one adds delay and a chance of failure. Share the final address, and keep http-to-https and www redirects to a single hop.
- JavaScript redirects and single-page apps. Facebook does not run scripts. Pages that set tags or redirect with JavaScript show Facebook an empty head. Render the tags on the server, or pre-render the pages you share.
The Debugger shows both the address you entered and the canonical address it settled on, with the
redirect path between them. If they differ in a way you did not expect, fix og:url and the
canonical tag first.
Old previews and the Facebook cache
Facebook stores the preview it built for each address and can reuse it for weeks. That is why a fixed page can still share with the old title or image.
- Open the Facebook Sharing Debugger and paste the exact URL, including https and any trailing slash.
- Press Debug to see what Facebook has stored, then Scrape Again to make it fetch the page and replace its copy.
- Check the result: the preview, the time it was scraped, the response code and any warnings.
- Share the link in a new post. Existing posts usually keep the preview they were created with.
If you change many pages, you can ask Facebook to scrape them again through the Graph API instead of pasting each one into the Debugger:
curl -s -X POST "https://graph.facebook.com/?id=https%3A%2F%2Fexample.com%2Fnews%2Fautumn-menu&scrape=true&access_token=$FB_ACCESS_TOKEN"
If the old preview still appears after scraping again, something between Facebook and your page is
serving the old version: a CDN cache, a page cache plugin, or og:url pointing to another
address. Purge the cache for that URL and scrape again.
The fix, step by step
Step 1
Run the URL through the Sharing Debugger
Paste the exact URL into the Facebook Sharing Debugger, including https and any trailing slash, and press Debug. Note the response code, the canonical address, the preview, the time it was last scraped and every warning. The Social Preview checker shows the same tags alongside how LinkedIn, X, Slack and WhatsApp will read them, so you can fix every platform in one pass.
Step 2
Add the Open Graph tags Facebook reads
View the page source, not the browser element inspector, and check that og:title,
og:description, og:image, og:image:width, og:image:height
and og:url are in the head once each, near the top, using property= and full
https addresses. Remove duplicate tags added by a second plugin or the theme, because Facebook may use
either copy. Make og:title a clear headline of under about 70 characters and og:description a plain summary
of the page.
Step 3
Use an image Facebook will show
Open the og:image address in a private browser window. It should load straight away as a JPG or PNG of about 1200 by 630 pixels, and under 8 MB, ideally under 1 MB. If it redirects, asks for a login, is blocked by hotlink protection or is smaller than 600 by 315, replace it, and give a changed image a new file name so no cache keeps the old one.
Step 4
Let facebookexternalhit fetch the page
Check the firewall, any bot protection such as Cloudflare Bot Fight Mode or Wordfence, login
or age gates and robots.txt, then press Debug and search the server access log for facebookexternalhit.
No log line means the request was blocked before the site; a 403, 429 or 503 means the site refused it.
Allow the crawler wherever it is blocked or challenged.
Step 5
Fix og:url, canonical and redirects
Make
og:url identical to the canonical URL of the page itself, never the home page or an old
address, because Facebook fetches whatever og:url names. Share the final URL rather than one that redirects,
keep any http-to-https or www redirect to a single hop, and make sure the tags are in the HTML the server
sends rather than added by JavaScript.
Step 6
Scrape again and check the new preview
Purge any CDN or page cache for the URL so Facebook is served the fixed page, then press Scrape Again in the Sharing Debugger and check the new preview, response code and scrape time. Share the link in a new post to see the new card, because existing posts usually keep their old preview. Run important links through the Debugger before every campaign.
Stopping it from coming back
- Tags in the template. Generate Open Graph tags on the server for every page from the page's own title, description, address and featured image, so no page goes out without them.
- A default image. Set a site-wide 1200 x 630 fallback image for pages with no featured image, so Facebook never picks a logo or an advert.
- An allow rule for crawlers. Keep facebookexternalhit, Facebot, LinkedInBot, Twitterbot, Slackbot, Discordbot and WhatsApp on the firewall's allow list.
- New image, new name. Change the file name when you change a share image.
- Debug before posting. Run important links through the Sharing Debugger before they go out, and press Scrape Again after every change to a page that has already been shared.
1. Why is my Facebook link preview not showing?
Usually because Facebook could not fetch the page or the image. Paste the exact URL into the Facebook Sharing Debugger. If the response code is not 200, a firewall, bot protection, login wall or slow response is blocking facebookexternalhit. If the page loads but the image is missing, the og:image is absent, too small, not a full https address or not publicly reachable. Fix the cause, then press Scrape Again.
2. How do I refresh a Facebook link preview?
Paste the exact URL into the Facebook Sharing Debugger, press Debug, then press Scrape Again. Facebook fetches the page again and replaces its stored preview. Existing posts usually keep the preview they were created with, so share the link in a new post to see the new card. If the old preview still appears, purge any CDN or page cache for that URL, check that og:url points to the page itself, and scrape again.
3. What size should a Facebook preview image be?
About 1200 by 630 pixels, a 1.91 to 1 ratio, saved as a JPG or PNG under 8 MB and ideally under 1 MB so it loads quickly. Images smaller than 600 by 315 are shown as a small thumbnail rather than a wide card, and images under 200 by 200 are rejected. Add og:image:width and og:image:height so the very first share shows the image, and keep text away from the edges.
4. Why does Facebook show the wrong image or my logo?
Because the page has no og:image, has more than one, or Facebook could not fetch the one it names, so it picked another image from the page, often the logo or a banner. Add a single og:image tag with a full https address to a large JPG or PNG, check that it loads in a private browser window, remove duplicate tags from plugins, and then press Scrape Again in the Sharing Debugger.
5. Why does every page show my home page preview?
Because og:url on each page points to the home page. Facebook treats og:url as the real address of the page, so it fetches the home page and shows that preview for every link. Change og:url on every page to the page's own canonical address, usually by fixing the theme or SEO plugin setting that outputs it, then press Scrape Again in the Sharing Debugger for the pages you share most.
6. Do I need fb:app_id for Facebook previews?
No. The Sharing Debugger shows a warning when fb:app_id is missing, but the preview works without it. The tag only links the page to a Facebook app so the app owner can see sharing insights. If you do not use a Facebook app, ignore the warning. Spend the time instead on the tags that actually change the preview: og:title, og:description, og:image with its width and height, and og:url matching the canonical address.
7. Can I edit the preview on a Facebook post?
Only in some cases. Page owners who have verified their domain in Meta Business Suite can change the title and image of a link before publishing a post. Without domain verification, the preview always comes from the page's own Open Graph tags, and a published post usually keeps the preview it was created with. To show a corrected preview, fix the page, press Scrape Again and share the link in a new post.
The Social Preview checker fetches your page the way Facebook, LinkedIn, X, Slack and WhatsApp do, lists every Open Graph and Twitter tag, checks the image size and address, and shows each card side by side.
Open Social Preview Fixes โ