On this page
- what this guide does
- which Instagram surface are you asking about?
- why feed captions don't render link previews (and what to do instead)
- DM link previews — the OG-tag-and-cache problem
- the Android vs iOS DM gap (and the whitespace trick)
- Story link stickers — the "frozen at creation" gotcha
- broadcast channel link previews — the separate surface
- when the preview is right but nothing else works — regional, account, domain
- the in-app browser bridge — when your preview is fine and your destination still leaks
- did the fix work? — verify across surfaces
- the Instagram link-feature timeline (so you know what changed)
- sibling problems on other platforms
- frequently asked
what this guide does
You pasted a link into an Instagram DM and got plain text instead of a preview card. Or your Story link sticker shows the wrong thumbnail. Or you put a link in a feed caption and Instagram acts like the URL isn't there.
Three different problems, three different causes. The caption case isn't a bug — Instagram doesn't render link previews in feed captions, by design. The other two are fixable in minutes once you know which surface you're on.
This is the diagnostic flow: identify the surface, get the cause, get the fix. Plus the part nobody else writes — what to do when the preview renders perfectly and viewers still bounce because of where the link lands them.
which Instagram surface are you asking about?
Instagram has four distinct link surfaces. Each has its own preview behavior. Most articles cover one and skip the rest. Skim the table, find your surface, jump to that section.
| Surface | Renders link preview? | Clickable link? | Cache behavior |
|---|---|---|---|
| Feed post caption | No (by design) | No (by design — except a March 2026 Meta Verified test, ≤10/mo) | n/a |
| Reel description | No (same policy) | No | n/a |
| Live caption | No | No | n/a |
| Direct message (DM) | Yes, when OG tags resolve | Usually yes; Android sometimes renders as plain text | Shares Facebook's OG cache (~30-day TTL) |
| Story link sticker | Yes, but cached at sticker creation | Yes (two taps: sticker → Visit Link) | Frozen at Story-publish time; not refreshable on a posted Story |
| Broadcast channel | Yes, separate "join channel" card + standard in-channel previews | Yes | Standard Meta OG cache |
Two rules fall out of this table:
- If your preview is missing in a feed caption, Reel description, or Live caption, you don't have a bug. You've hit Instagram's product decision to keep viewers in-app. Skip to the captions section for the workarounds.
- If your preview is missing in a DM, a Story sticker, or a broadcast channel, you have a fixable problem. Each section below covers one surface.
The one architectural fact behind all of this: Instagram does not run its own preview crawler. It uses Meta's shared facebookexternalhit agent and Meta's shared preview cache — the same cache that Facebook, Messenger, and WhatsApp read from. Every fix that involves OG tags routes through the Facebook Sharing Debugger. Instagram has no equivalent tool of its own.
why feed captions don't render link previews (and what to do instead)
Instagram designed the feed as visual storytelling. Captions are commentary, not navigation. Clickable links would pull viewers off-platform mid-scroll; Instagram doesn't want that.
The consequence: a URL typed into a feed caption renders as plain text only. No preview card, no underline, no tap target. Same for Reel descriptions and Live captions. There is no OG-tag combination, no debug step, no account setting that produces a clickable link or a preview card in a feed caption for a standard account.
The one current exception: in March 2026, Instagram began testing clickable links in feed captions for Meta Verified professional creator accounts — mobile-app only, capped at roughly 10 links per month. Most accounts don't have it. Don't plan around it.
The actual paths to put a link in front of feed viewers:
- Bio link.
Edit Profile → Website. One URL. The canonical link-in-bio mechanic. To put multiple destinations behind one bio URL, see the bio multi-link patterns. - Story link sticker. Available to every account regardless of follower count (since 2023). Covered in its own section below.
- DM-from-comment automation. Reply to a feed-post comment with a DM containing the link. The DM follows the DM rules below.
- "Link in bio" caption call-out + pinned post. The universal workaround the whole platform has converged on. The link itself lives in the bio; the caption tells viewers where to find it.
If you came here hoping Instagram would render a preview in your feed caption — it won't, and that's not a problem you can fix from your side. Use the bio link or the link-not-clickable troubleshooting page for the workarounds.
DM link previews — the OG-tag-and-cache problem
This is the most-asked variant of the question and the one with the highest fix-success rate.
What Instagram reads. When you paste a URL into an Instagram DM, Meta's facebookexternalhit crawler fetches the page, parses the first 1MB of HTML for Open Graph tags, builds a preview card, and caches the result. The same agent serves Facebook posts, Messenger threads, and WhatsApp chats. Four Meta surfaces share one cache. Fix once via the Facebook Sharing Debugger; the fix propagates to all four within minutes.
This is the single highest-leverage fact in the cluster. Every Instagram-specific debug step routes through a Facebook tool because Instagram doesn't have one. The deep tool walkthrough is in the Sharing Debugger UI guide; the eleven-cause breakdown is in the Facebook equivalent of this article. Treat both as sibling references.
The OG tags Instagram DMs actually use:
| Tag | Required? | What it does | Fallback if missing |
|---|---|---|---|
og:image |
Required for the visual card | Preview thumbnail | No card; URL renders as plain text link |
og:title |
Recommended | Card headline | Falls back to <title> element |
og:description |
Recommended | Card subtitle | Sometimes shown, sometimes omitted by Instagram even when present |
og:url |
Recommended | Canonical URL — keys the cache | Falls back to the requested URL |
og:type |
Optional | Content type | Defaults to website |
The minimum viable HTML:
<head>
<meta property="og:title" content="Your title (≤60 chars renders cleanly)">
<meta property="og:description" content="Your description (≤155 chars)">
<meta property="og:image" content="https://example.com/og/image.png">
<meta property="og:url" content="https://example.com/canonical-path">
<meta property="og:type" content="website">
</head>
The image spec — the most-broken part:
| Constraint | Spec | What happens if violated |
|---|---|---|
| Recommended dimensions | 1200 × 630 (1.91:1) | Smaller risks crop or no-render |
| Minimum dimensions | 200 × 200 | Below this, Instagram ignores it |
| Max file size | 8 MB (3 MB safer) | Above this, the scrape times out silently |
| Format | JPG, PNG, GIF (WebP works, but less reliably than on the web) | WebP renders most of the time on Instagram and less often on Facebook; JPG/PNG remain the safe defaults |
| URL | Absolute HTTPS | Relative URLs fail; HTTP-only fails |
| Access | Public, no auth, no CDN bot wall | 401/403 on the crawler IP breaks the scrape |
| Story-sticker crop | Centered crop applied | Keep important content centered in the 1200×630 frame |
Diagnostic order when your DM preview is failing:
- Run the URL through the Sharing Debugger. Paste, click Debug, look at what Meta has cached. If it's wrong, click Scrape Again. Instagram DMs update within minutes.
- If the Debugger shows the right preview but your DM still shows plain text: force-quit the Instagram app on the testing device and reopen. The per-device app cache is independent of Meta's central cache and occasionally lags. If that doesn't fix it, you're hitting the Android parser gap, regional A/B testing, or per-account suppression — see the sections below.
- If the Debugger can't reach your URL at all: crawler-access issue. Check
robots.txt(allowfacebookexternalhit), CDN bot rules (Cloudflare bot fight mode is the usual offender — it returns 403 to anything that looks automated, including Meta's crawler), HTTPS validity, and that the page returns in under 10 seconds. See user-agent detection in adjacent crawler contexts for UA strings to allowlist. - If the og:image is right in the Debugger but the preview shows no image: image-spec violation. Walk the table above — usually file too large, unusual format, or image behind an auth-gated CDN path.
- The 1MB head-parsing limit. Per Facebook's crawler documentation, the crawler reads only the first 1MB of HTML. Instagram inherits this limit. If OG tags are emitted late in
<head>after large inline CSS or JS, they can be cut off. Keep OG tags in the first 10KB — ideally the first 50 lines of<head>.
Cache-bust trick when Scrape Again silently fails. Append ?v=2 (or any random query string) to the URL. Meta keys the cache off the full URL including query string, so this forces a fresh fetch.
the Android vs iOS DM gap (and the whitespace trick)
On iOS, Instagram uses the system text-link detector. URLs are reliably detected and rendered as blue tappable links with a preview card.
On Android, Instagram's link detection is weaker. URLs sometimes render as plain black text — not blue, not underlined, not tappable. The recipient can long-press to copy, but most viewers won't. OG tags are fine; the link just isn't being detected as a link at all.
Why this hits automation tools hardest. ManyChat, LinkDM, CreatorFlow, and the rest all send DMs as plain text. They all hit the same Android detection limit. Switching automation tools doesn't fix it — the bottleneck is the Android Instagram client.
The whitespace fix. Put the URL on its own line, with a blank line before and after:
Here's the link you asked for:
https://link.boo/yourname
Tap to open in your browser.
Android's link parser triggers reliably most of the time with this formatting. Pasted inline ("here's the link https://link.boo/yourname tap it"), it triggers a small fraction of the time. The whitespace isn't cosmetic — it's the trigger.
The shortener helper. Short URLs trigger Android's parser more reliably than long ones with query strings. A custom-domain short link (link.boo/yourname) parses cleanly and removes one variable from the stack. If you're shipping links to mixed-OS audiences from automation tools, length matters.
Story link stickers — the "frozen at creation" gotcha
What a Story link sticker is. A tappable bottom-sheet trigger on a Story slide. Available to every account since 2023 (previously gated to ≥10K followers). One sticker per Story slide. You customize the visible label; the destination URL is set when you add the sticker. Reference: Instagram's official link sticker help. For the full sticker mechanic, the Story link sticker walkthrough is the dedicated piece.
What viewers see. They tap the sticker, a bottom sheet pops up with the link's OG preview card — title, description, image cropped to roughly square — then they tap "Visit Link" to leave the app. The destination opens in their browser or in Instagram's in-app browser depending on their per-app setting.
The gotcha nobody else names clearly. Instagram caches the preview at the moment you publish the Story. That cache is bound to that specific Story. If you publish, then fix your OG tags ten minutes later and re-scrape via the Sharing Debugger, the preview in the already-published Story does not update. The Debugger updates the central Meta cache; the Story's snapshot is independent.
The only fix on a published Story is to delete it and re-post. You'll lose the views, replies, share count, polls. There is no second path. The Sharing Debugger doesn't help. Force-quitting doesn't help. Waiting doesn't help. Delete, fix tags, re-publish.
Operational rule. Validate the link preview in the Sharing Debugger before you publish a Story with a link sticker. If you discover an og:image typo after publishing, you're starting over.
Centered-crop reminder. Because Instagram crops the OG image to roughly square for the Story bottom sheet, keep important content in the centered region of your 1200×630 og:image. A logo in the lower-right corner gets cropped out of the Story preview while still rendering correctly in DM and Facebook previews.
Bottom-sheet shows the label but no thumbnail. The og:image failed the crawler fetch — usually CDN access, auth wall, file size over 8MB, or HTTP-not-HTTPS. The link still works; the preview is just bald. Walk the image-spec table from the DM section.
broadcast channel link previews — the separate surface
Most articles don't mention this surface exists. Broadcast channels — Instagram's one-to-many DM-style feature launched in 2023 — have two distinct preview surfaces.
The "join channel" preview card. When creators share a broadcast-channel join link to a Story or pin it to bio, the preview is a Meta-generated card showing channel name, description, and subscriber count. It's driven by Instagram's own channel metadata, not by your website's OG tags. If the join card looks wrong, fix it inside the Instagram app — open channel settings and edit the name, description, and cover image. You cannot override the join card with OG tags on your domain, because it's not your domain being previewed.
In-channel link previews. When the broadcaster pastes a URL into a channel message, this works exactly like DM previews. Same facebookexternalhit crawler, same OG tag rules, same Meta cache, same Sharing Debugger fix path. The diagnostic is identical to the DM section above.
when the preview is right but nothing else works — regional, account, domain
If you've fixed your OG tags, the Sharing Debugger shows the correct card, but the preview still won't render for some viewers, the cause is one of the five below.
Regional A/B testing. Instagram runs feature tests by region. There are documented cases — Signal's GitHub issue #11239, originally reported from Serbia — where Instagram link previews stopped rendering for users in specific countries while continuing to work elsewhere and while continuing to work in WhatsApp (which handles the scrape differently). Underlying cause: an Instagram-side restriction on unauthenticated access to public profile data, which broke Signal's preview-fetch path. Signal's resolution was "wontfix" — the change was on Instagram's end. If your preview works for some viewers and not others and the pattern correlates with geography, this is the cause. There is no workaround; you wait it out.
Account standing — your account. New accounts (under roughly 30 days), accounts flagged for past spam, accounts in monetization restrictions, and accounts that have shared URLs from blocklisted domains see suppressed link rendering in DMs. Symptom: your DMs send successfully but recipients see plain text. No notification fires. The signal is "the preview renders when the same URL is posted from a different account on the same device."
Account standing — the recipient's account. Some Instagram users have link previews suppressed on their side (account restrictions, regional restrictions, age-gated accounts). Same link, same OG tags; some viewers see a preview, some don't. Not fixable on your end.
Domain standing. Domains flagged by Meta's classifier — the "this link may be unsafe" warning — see suppressed preview rendering across all four Meta surfaces. The Sharing Debugger will tell you if your domain is flagged; the appeal path is Facebook Business support. The Instagram-side surfacing of this warning is covered in the unsafe-warning sibling-issue walkthrough; Instagram's domain blocklist behavior covers what gets flagged and why; if the appeal stalls, the domain-block unblock workflow is the operational guide.
The 50-share title inheritance. Because Instagram reads from Meta's shared cache, the Facebook anti-misinformation rule that locks a link's title after roughly 50 shares also affects how Instagram renders that link's preview. If your title is wrong in DMs and the URL has 50+ Meta-surface shares, you can update the image and description through the Debugger but not the title. Workaround: publish at a new URL — same content, different canonical path, fresh cache key.
The JavaScript-injection caveat. Meta injects JavaScript into pages loaded inside Instagram's in-app browser, documented in Felix Krause's 2022 writeup. This doesn't break OG preview generation — the crawler scrapes raw HTML, not the in-app-browser DOM — but it can interfere with destination-side analytics in ways that compound the "preview works, conversion bombs" pattern. Fix for that compounded problem is in the next section.
the in-app browser bridge — when your preview is fine and your destination still leaks
Everything above is the preview problem. The preview problem ends once your OG tags resolve, your cache is fresh, and your Story stickers are validated before publishing. The conversion problem starts at that point.
When an Instagram viewer taps your link from inside Instagram — DM, Story sticker, broadcast channel, bio link — the link opens by default in Instagram's in-app browser, not the viewer's Safari or Chrome. That in-app browser is a separate cookie jar. The viewer might be logged into your site in Safari; they are not logged in inside Instagram's webview. They land on your sign-in page instead of your checkout page. Most bounce rather than re-typing a password.
For destinations that depend on authenticated sessions — Amazon affiliate, Substack subscribe, OnlyFans, Patreon, Spotify pre-save, Shopify checkout — this typically costs 30–60% of would-be conversions. The preview rendered perfectly. The destination dropped them.
This is downstream of the preview. It's linkboo's broader thesis on in-app browsers — the cookie-jar problem at the destination — and it's the structural cost an OG-tag fix alone cannot solve. The Instagram-specific in-app browser writeup covers what Instagram's webview isolates and what it injects; how webview cookie isolation works is the engineering breakdown of WKWebView and Android WebView cookie scoping; the creator-side escape walkthrough is the implementation guide. For viewers tapping individual links, how viewers can open Instagram links in Safari is the consumer-facing walkthrough.
To see which in-app browser your viewers land in before you ship a fix, test which in-app browser your viewers land in — open the page on a device, tap from inside Instagram, see what's detected.
The structural fix is a link tool that bounces viewers out of Instagram's webview into their real browser before the destination loads. linkboo handles this; implementation lives in linkboo's deployment docs. Start free on linkboo →.
did the fix work? — verify across surfaces
Once you've made a change, walk this list before declaring it done.
- Re-scrape in the Sharing Debugger. Confirm
og:title,og:description, andog:imagematch what you intended. - DM the URL to a test account. Test on both iOS and Android if possible — the Android parser gap can mask an otherwise-clean fix.
- Add a link sticker to a test Story (Close Friends list, archive immediately after testing). Confirm the bottom-sheet preview renders correctly and "Visit Link" opens the URL.
- If you operate a broadcast channel, paste the URL into a test message and confirm the preview renders.
- Paste the same URL into a Facebook post composer (don't publish). If Facebook's composer shows the new preview but Instagram DMs still show the old one, force-quit and reopen the Instagram app — the per-device app cache is independent of Meta's central cache and occasionally lags by a few minutes.
All four Meta surfaces should reflect the new preview within a few minutes of a successful Scrape Again. If one surface doesn't, that's a per-surface or per-account issue, not a tags-and-cache issue — route back through the relevant section above.
the Instagram link-feature timeline (so you know what changed)
Brief reference table for context — useful as a freshness signal and because most of these dates are misremembered in older guides.
| Year | Change |
|---|---|
| Pre-2021 | Story link "swipe up" gated to accounts with ≥10K followers. No link stickers in DMs. |
| 2021 | Link sticker replaces swipe-up — initially gated to ≥10K followers, then progressively opened. |
| Aug 2022 | Felix Krause publishes the in-app browser JS-injection writeup; Meta acknowledges and frames as privacy-respecting. |
| 2023 | Link sticker opened to all accounts regardless of follower count. Broadcast channels launched. |
| 2024 | Minor tweaks to DM link rendering on Android; whitespace-trick reliability stays roughly steady. |
| 2025 | Story link sticker preview crop tightens to a centered square (previously sometimes rendered 1.91:1). |
| March 2026 | Meta begins testing clickable links in feed captions for Meta Verified professional creator accounts. ~10 links/month cap. Mobile only. Limited rollout — most accounts don't have access. |
Net: link stickers are the universal preview-rendering surface; feed captions remain preview-less for everyone except the test cohort; DMs and broadcast channels continue working via standard Open Graph tags and Facebook's sharing best practices.
sibling problems on other platforms
The "link preview not showing" question hits every social platform with subtly different mechanics. The sibling articles in this sub-silo:
- The Facebook equivalent of this article — the shared cache one covers Facebook's eleven OG-preview failure modes in depth. Because Instagram shares Facebook's cache, every fix from that article applies here too.
- The click-by-click Sharing Debugger walkthrough is the UI reference for the tool that fixes both Facebook and Instagram previews — the same Debugger does both jobs.
- The X/Twitter sibling — different platform, similar diagnostic covers X's
twitter:cardmeta tags, the missing Card Validator, and X's algorithmic suppression of link-bearing posts. The mechanics are different, the diagnostic structure is similar.
frequently asked
Why doesn't Instagram show a link preview in my caption? Instagram doesn't render clickable links — or previews — in feed captions, by design. The exception is the March 2026 Meta Verified test, limited to professional creator accounts with a ~10 links/month cap. Use a bio link or Story link sticker for in-feed link distribution.
Does Instagram show link previews in DMs?
Yes. Instagram reads your OG tags (og:image, og:title, og:description) and renders a card. Same crawler as Facebook (facebookexternalhit), same cache, same fix tool.
Why is my DM link preview not showing on Android? Android's link parser inside the Instagram app is weaker than iOS's. URLs sometimes render as plain black text. Put the URL on its own line with whitespace around it — fixes most cases. Short, branded URLs help.
How do I refresh an Instagram link preview?
Use the Facebook Sharing Debugger (developers.facebook.com/tools/debug/). Paste the URL, click Debug, click Scrape Again. Instagram shares Facebook's preview cache, so fixing it there fixes Instagram DMs and broadcast channels within minutes. Append ?v=2 to the URL if Scrape Again silently fails.
Why does my Story link sticker preview look wrong, and how do I fix it? Instagram caches the preview at the moment you publish the Story. Fixing OG tags after publishing does not update the existing Story — the cache is bound to the Story. Delete, fix tags, re-post. There is no second path.
Does fixing the Facebook preview also fix Instagram? Yes. Meta runs one preview cache across Facebook, Messenger, Instagram DMs, and WhatsApp. Fixing once via the Sharing Debugger propagates to all four within minutes.
What og:image size does Instagram want? 1200 × 630 pixels (1.91:1), under 8MB, JPG or PNG for the safe defaults. In Story link sticker previews, Instagram crops to roughly square — keep important content centered in the 1200×630 frame.
Why does the preview work for some friends and not others? Account standing on either end (new account, regional A/B test, flagged domain), or the recipient has previews suppressed. Not always fixable on your side — see the regional/account section above.
Can I make Instagram open my link in the user's normal browser instead of the in-app one? Not from Instagram's settings — Instagram always opens links in its in-app browser by default. You can route around it with a link tool that bounces viewers to their system browser before the destination loads.
Does the in-app browser cache the OG preview? No — the OG preview is fetched by Meta's central crawler, not by the in-app browser. The in-app browser does cache the destination page itself, separately from your system browser, and that's the source of the logged-out problem.