Why Facebook’s cache is stubborn
Facebook caches link preview data for about 30 days and operates multiple cache layers: the crawler cache, the CDN image cache, and per-post preview caches. Clearing one doesn’t always clear the others.
Fixing it
1. Verify your HTML is actually updated
Before blaming Facebook’s cache, confirm your server is returning the new tags:
curl -A "facebookexternalhit/1.1" https://example.com/page | grep "og:"If the old tags are still there, the problem is your server/CDN/deployment, not Facebook.
2. Sharing Debugger: click “Scrape Again” multiple times
Open the Sharing Debugger, enter your URL, and click “Scrape Again”. If the preview doesn’t update, click it two or three more times. Facebook has intermediate cache layers that need multiple scrape requests to fully flush.
3. Purge your own CDN
If you use Cloudflare, Fastly, CloudFront, etc., the CDN may still serve old HTML to Facebook’s crawler. Purge the URL from your CDN cache, then scrape again.
4. Batch invalidation
For many URLs at once, use the Batch Invalidator.
5. Graph API for automated workflows
curl -X POST \ "https://graph.facebook.com/?id=https://example.com/page&scrape=true&access_token=YOUR_TOKEN"6. Refresh individual posts
Existing posts cache their preview separately. Use the three-dot menu on a post and select the option to refresh the link attachment.
Gotchas
- Debugger shows new data, posts still show old: existing posts keep their cached preview. Only new shares reflect updates. Individual posts must be refreshed separately.
- Changed image, old image persists: Facebook caches images on its CDN independently of metadata. After a re-scrape, the old image may stick around for hours. Use a new filename (not just new content at the same URL) to force a fresh fetch.
- Debugger updated, mobile still stale: the mobile app has its own cache layer. Give it a few hours, or force-close and reopen the app.