Link Preview Not Working in Telegram: How to Fix It
When you share a link in Telegram, the preview card with a title, description and picture is what makes people tap it. If the card is missing, shows the wrong image or keeps an old title after you changed it, your links look broken or out of date in every chat and channel they reach. The cause is nearly always one of three things: Telegram's fetcher cannot read your page, the page lacks Open Graph tags in its server HTML, or Telegram is still showing a card it cached earlier. This guide shows how to see your page the way Telegram does, set the tags and image it needs, let its fetcher through firewalls and refresh a stuck preview with the official bot.
How Telegram builds a link preview
When someone pastes a link into a Telegram chat, the app does not fetch your page from their phone. Telegram's servers fetch it, read the tags in the page head, build the preview card and store it. Every later message with the same URL reuses that stored card. Telegram's fetcher identifies itself with a user agent containing TelegramBot (like TwitterBot).
The preview is built from these tags, roughly in this order of preference:
| Part of the card | Tag Telegram reads first | Fallback |
|---|---|---|
| Site name line | og:site_name | The domain name |
| Title | og:title | twitter:title, then the <title> element |
| Description | og:description | twitter:description, then the meta description |
| Image | og:image | twitter:image; sometimes an image from the page, sometimes none |
Two things follow from this. First, the fetcher reads the raw HTML your server sends; it does not run JavaScript, so tags added by scripts after load are invisible to it. Second, because the card is cached, fixing your tags does not fix links that have already been shared until the cache is refreshed. Both are behind most cases of a Telegram link preview not working.
Why the link preview is not working in Telegram
| Symptom | Likely cause | Where to look |
|---|---|---|
| No preview at all | The fetcher is blocked: firewall, bot protection, country block or login wall | Server logs for TelegramBot requests and their status codes |
| Old title or image | Telegram's cached card from before your change | Refresh with @WebpageBot |
| Title but no image | Relative image URL, image too large, blocked image host or wrong format | The og:image value and the image's own response |
| Wrong page's details | Every page prints the home page tags, or og:url points elsewhere | The page head, template by template |
| Generic or missing text | Tags added by JavaScript, or missing og: tags | View source, not the browser's inspector |
| Preview for some links only | Telegram previews only the first link in a message, or the sender switched previews off | The message itself |
If you have never set up Open Graph tags, start with the missing Open Graph tags guide, then come back here for the Telegram-specific checks.
How to see what Telegram sees
Request the page the way Telegram does and check the status code and tags:
curl -s -o /dev/null -w "%{http_code}\n" -A "TelegramBot (like TwitterBot)" https://www.example.com/menu/
curl -s -A "TelegramBot (like TwitterBot)" https://www.example.com/menu/ | grep -iE 'og:|twitter:|<title'
You want a 200 and a full set of og: tags in the output. A 403 or 503 usually means a firewall or bot protection is treating the fetcher as a threat. An empty grep means the tags are missing from the server HTML, often because they are added by JavaScript.
Then check the image itself, using the exact URL in og:image:
curl -sI -A "TelegramBot (like TwitterBot)" https://www.example.com/images/menu-share.jpg | grep -iE '^HTTP|content-type|content-length'
It should return 200, a content type of image/jpeg or image/png, and a size comfortably under 5 MB.
Check the server logs
curl from your own machine is not quite the same as a request from Telegram's servers, which may come from another country. The access log shows what really happened:
grep "TelegramBot" /var/log/nginx/access.log | tail -10
If there are no lines at all after a fresh share, the request never reached your server, which points at a CDN or firewall rule upstream. If there are lines with 403 or 429, your own server or a security plugin is refusing it.
The Open Graph tags Telegram needs
Put these in the <head> of each page, in the HTML the server sends, with values specific to that page:
<meta property="og:site_name" content="Example Bakery">
<meta property="og:title" content="Weekend Menu and Opening Times">
<meta property="og:description" content="Fresh sourdough, pastries and cakes, Saturday and Sunday from 8 am.">
<meta property="og:url" content="https://www.example.com/menu/">
<meta property="og:type" content="website">
<meta property="og:image" content="https://www.example.com/images/menu-share.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
- Use absolute URLs.
og:imagemust start withhttps://. A relative path such as/images/menu-share.jpgoften gives a card with no picture. - Use
property, notname, forog:tags. Many parsers accept both, butpropertyis the Open Graph standard. - Put the tags early in the head, before large inline scripts or styles, so they are found quickly.
- Keep one set per page. Duplicate tags from a theme and a plugin can make the fetcher pick the wrong one.
Keep titles under about 60 characters and descriptions under about 160; Telegram trims longer text, and a short description reads better on a phone.
Image size and format for Telegram previews
Telegram does not publish exact limits for preview images, so the safest approach is to use values that every major messaging app accepts.
| Setting | Recommended | Why |
|---|---|---|
| Dimensions | 1200 ร 630 pixels | Wide images are shown as a large picture across the full width of the card |
| Minimum | At least 600 pixels wide | Small or square images tend to appear as a small thumbnail |
| File size | Under 1 MB, never over 5 MB | Large files may be skipped, leaving a card with no picture |
| Format | JPEG or PNG | Widely supported; avoid SVG, and test WebP or AVIF before relying on them |
| Hosting | Same domain, public, no hotlink protection | Hotlink rules that check the referrer can block the fetcher |
In recent Telegram apps, the sender can tap the preview while writing a message and choose larger or smaller media, so a small picture is not always your fault. A wide image of the recommended size gives the sender the large option. For more on sizing across apps, see the Open Graph image size guide.
Platform notes
WordPress
Yoast SEO, Rank Math and similar plugins output Open Graph tags, with a social image field on each post. Set a default image in the plugin's social settings so pages without their own image still get one. If two plugins both print tags, switch one off. The WordPress previews guide has the details.
Shopify
Most themes print Open Graph tags from a snippet included in theme.liquid, using the product image and the social sharing image set in the theme settings. Check that the snippet is included once and that products have a main image.
Next.js
Use the Metadata API or generateMetadata in the App Router so tags are rendered on the server. Tags set only in client components, or with a client-side head manager after load, will not be seen by Telegram's fetcher.
Cloudflare
Bot Fight Mode, managed challenges and country blocks can all stop the fetcher. Check Security, Events for blocked requests with TelegramBot in the user agent. A WAF skip rule for that user agent on your HTML and image paths fixes it; user agents can be faked, so keep the rule narrow.
The fix, step by step
Step 1
Fetch the page as Telegram does
Run curl with the user agent TelegramBot (like TwitterBot) against the exact URL people share and check the status code. You want a 200. A 403, 429 or 503 means something is blocking the fetcher, so go to the firewall step before changing any tags. Also confirm the URL does not redirect to a login, cookie or country page, because Telegram would build its card from that page instead.
Step 2
Check the tags in the server HTML
Pipe the same curl request through grep for og: and twitter: tags. You should see og:title, og:description, og:image and og:url with values for this page, not the home page. If they are missing from the curl output but visible in the browser inspector, they are being added by JavaScript, and you need to output them directly from the server, theme or framework instead.
Step 3
Fix or add the Open Graph tags
Add a single set of og: tags to the head of each template, with a page-specific title and description, an absolute https:// image URL and the canonical og:url. In WordPress, set them in your SEO plugin; in Shopify, in the theme's social meta snippet; in Next.js, with the Metadata API. Run the curl check again and confirm exactly one of each tag appears in the output.
Step 4
Fix the share image
Make the image 1200 by 630 pixels, JPEG or PNG, and under 1 MB. Request it with curl using the Telegram user agent and check it returns 200 with an image/jpeg or image/png content type. Remove hotlink protection for this path if it blocks requests without a referrer. Add og:image:width and og:image:height so apps know the shape before downloading the file.
Step 5
Let the fetcher through your firewall
Search the access log for TelegramBot after sharing the link in a test chat. If there are no entries, check your CDN's security events for blocked requests and add a narrow skip rule for that user agent on public pages and images. If entries show 403 or 429, look at security plugins, rate limits and country blocks on the server itself, then share the link again to test.
Step 6
Refresh the cached preview
Open a chat with @WebpageBot in Telegram and send it the exact URL, up to ten links in one message. It fetches the page again and replies with the updated preview, which then replaces the cached card for new messages. If the reply still shows the old details, your server is still sending old tags, so purge your page cache and CDN and send the link to the bot again.
Step 7
Test in a real chat
Paste the link into Saved Messages or a test chat and wait for the preview to appear before sending. Check the site name, title, description and image. Make sure it is the first link in the message, because Telegram previews only one. If the image appears small, tap the preview to see whether the larger media option is offered, which needs a wide image of the recommended size.
Step 8
Standardise the shared URL
Pick one form of each URL, with or without the trailing slash, on https and on your preferred host, and redirect the other forms to it. Use exactly that same form in og:url and in every link you post. Telegram caches each variant separately, so a single consistent address means one refresh fixes the card everywhere, and tracking parameters do not create stale copies.
Edge cases worth knowing
- Previews in channels and groups. They use the same cache as private chats, so one refresh with @WebpageBot fixes the card for new messages everywhere. Messages already sent may keep the old card.
- URL variants are cached separately.
example.com/menu,www.example.com/menu/and a version with tracking parameters are different URLs to Telegram. Refresh the exact form people share, and redirect variants to one canonical address. - Instant View is separate. The Instant View button uses Telegram's own templates, not your Open Graph tags. A missing Instant View is not a preview fault.
- Login walls and age gates. If the page redirects anonymous visitors to a login or consent page, the preview shows that page instead. Serve the tags on the public response.
- Slow pages. If the server takes many seconds to respond, the fetch can time out. Cached HTML for public pages avoids this; see the high TTFB guide.
Keeping previews working
Previews break quietly when a theme update, a new plugin or a security change touches the page head or blocks bots. A few habits keep them reliable:
- After changing a share image or title, refresh the URL with @WebpageBot before you post it in a channel.
- Run the curl check above after every theme, plugin or CDN change.
- Check the access log monthly for TelegramBot requests with 4xx or 5xx codes.
- Test new templates in our social preview checker, which reads the tags as messaging apps do. The preview cache guide covers refreshing other apps too.
1. Why is my link preview not working in Telegram?
A Telegram link preview usually fails because Telegram's fetcher cannot read your page, the page has no Open Graph tags in its server HTML, or Telegram is showing an old cached card. Check the page with curl using the TelegramBot user agent and look for a 200 response and og:title, og:description and og:image tags. If those are fine, send the URL to @WebpageBot to refresh the cache. Also check that the link is the first one in the message and previews are switched on.
2. How do I refresh a Telegram link preview?
You refresh a Telegram link preview by sending the URL to @WebpageBot, Telegram's own bot for updating previews. Open a chat with it, paste the exact link, and it fetches the page again and replies with the new preview. You can send up to ten links in one message. Make sure your server and CDN are already serving the new tags first, otherwise the bot will cache the old version again. Messages sent earlier may keep their original card.
3. What image size does Telegram use for link previews?
Telegram works best with a share image of 1200 by 630 pixels in JPEG or PNG format, kept under 1 MB. Telegram does not publish an exact limit, but files over about 5 MB are often skipped, leaving a card without a picture. Wide images can be shown large across the preview, while small or square images tend to appear as a thumbnail. Always use an absolute https address for og:image, and add width and height tags.
4. Does Telegram use Open Graph tags?
Yes, Telegram builds link previews mainly from Open Graph tags: og:site_name, og:title, og:description and og:image. If those are missing it falls back to Twitter card tags, the page title and the meta description. The tags must be in the HTML your server sends, because the fetcher does not run JavaScript. Use one set of tags per page with values specific to that page, and make sure the image address is absolute and publicly reachable.
5. Why does Telegram show the wrong image or an old title?
Telegram shows an old title or image because it cached the preview the first time someone shared the URL, and it keeps using that card until it is refreshed. Fix the tags on your site, purge any page cache or CDN, then send the URL to @WebpageBot. If the bot still shows the wrong details, check that your template is not printing the home page tags on every page, and that the shared address matches your og:url exactly.
6. Can Cloudflare block Telegram link previews?
Yes, Cloudflare can block Telegram previews when Bot Fight Mode, a managed challenge, a WAF rule or a country block treats Telegram's fetcher as a bot to stop. The fetcher cannot solve a challenge, so it gets no tags and builds no card. Look in Cloudflare's security events for blocked requests with TelegramBot in the user agent. A narrow skip rule for that user agent on your public pages and images usually fixes it, and you can confirm it in the access log.
7. Why does only one link get a preview in my Telegram message?
Telegram shows a preview for only one link per message, normally the first one, so other links in the same message appear as plain text. That is how the app works, not a fault with your site. If you need a preview for a particular page, put that link first or send it in its own message. The sender can also remove a preview before sending, and some chats or settings turn previews off entirely.
Our social preview checker fetches your page the way messaging apps do and shows the title, description and image they will find, along with any missing or broken tags.
Open Social Preview Fixes โ