A Telegram deep link is a t.me web address that opens a specific chat, channel, group, or bot when tapped, optionally carrying a parameter that your bot receives. The common shapes are https://t.me/username to open a chat, https://t.me/username?text=Hi to open it with a draft prefilled, and https://t.me/YourBot?start=payload to open a bot and hand it a payload. Tap the link, Telegram opens at the right place, and for a bot the payload arrives server-side.
That last part is what makes Telegram different from most messaging channels. WhatsApp does not tell you which ad drove a wa.me tap. Telegram bots do: the ?start= payload is delivered to your bot when the user starts, so attribution can be built into the link itself. For plain chat and channel links you still need a redirect in front to see the click, the same way you would with any messaging deep link. This post covers both.
The t.me Link Patterns
There is one address family and a few parameters. Telegram documents them in the deep-link reference (accessed 2026-07-18).
- Open a chat or channel:
https://t.me/username. Works for public usernames, channels, and groups. This is the link you put in a bio or an email signature. - Prefill a draft:
https://t.me/username?text=Hello%20Acme. The message is URL-encoded and lands in the draft box. The user taps send, Telegram does not send it for them. - Open a bot with a payload:
https://t.me/YourBot?start=spring-promo. Telegram opens the bot, shows the Start button, and on tap deliversspring-promoto the bot in the/startcommand. - Add the user to a group via a bot:
https://t.me/YourBot?startgroup=payload. Same idea, aimed at group setup rather than a private chat.
The tg:// scheme (tg://resolve?domain=username) exists but is fragile. Browsers and in-app webviews block or strip custom schemes, so a printed tg:// link fails more often than it works. Use t.me, which is a normal https URL that resolves cleanly and can sit behind a short link. The mechanics of why t.me routes into the app at all are the OS-native ones described in deep links without an SDK.
Why the Start Parameter Is the Attribution Win
Most click-to-chat channels are one-way: the tap opens the conversation and tells you nothing. Telegram bots break that pattern because the ?start= payload is delivered to your bot code. Facebook Messenger does the same with its ref parameter; WhatsApp is the one that stays silent. Telegram caps it at 64 characters and allows only letters, numbers, hyphens, and underscores, and recommends base64url if you need to pack structured data, per the bot deep-linking docs.
So the payload can carry a campaign tag, a referrer id, or an encoded record id. When the user taps Start, your bot reads it and knows the click came from, say, the May newsletter rather than the pinned channel post. No pixel, no webhook gymnastics, no reading tags out of a message body. The signal is in the /start your bot already handles.
The limit matters. Sixty-four characters is enough for nl-may-hero or a short base64url id, not for a full UTM string. The pattern that scales is a compact id in ?start=, with the human-readable campaign data stored against that id in your own system.
The Redirect Layer
For chat and channel links, and to unify tracking across every Telegram surface, put a short link in front of the t.me URL. The customer taps s.elido.me/tg, your edge records the click, then redirects to https://t.me/YourBot?start=nl-may. From the customer's side the flow is identical to tapping t.me directly.
From your side, three things changed:
- The click is recorded. The redirect fires an event with timestamp, geo, device, and the UTM parameters that arrived on the short link, so the Start your bot logs a second later is joinable to a specific campaign.
- The destination is editable. Swap the bot username, the channel, or the
?start=payload without reprinting a QR or editing a live ad. If you move a campaign from one bot to another, you change the destination once. - The campaign data is portable.
s.elido.me/tg?utm_source=email&utm_medium=newsletter&utm_campaign=maycaptures the tags at the redirect even thought.meignores query strings it does not recognise.
This is the same layer described in tracking UTM end to end, and it is the exact approach the WhatsApp click-to-chat guide uses for wa.me. Telegram just gives you a second signal on top through the bot payload.
If you want editable, measurable Telegram links without building the redirect yourself, Elido's deep links sit in front of any t.me destination and log every tap. You can set one up on the free plan.
A Practical Setup
Three short links cover most Telegram flows:
- General link:
s.elido.me/tgto your main bot or channel, used in the website footer, the bio, and the email signature. Catches generic inbound. - Campaign link: one per active campaign,
s.elido.me/tg-may-nl, pointing at the same bot with a campaign-specific?start=payload. Used in the specific ad or newsletter. - QR-printed link:
s.elido.me/tg-shopfor physical placements, with a payload that names the placement so your bot greets the scanner in context.
Each link maps to a UTM template and a descriptive label like surface:newsletter · channel:telegram · campaign:may. Configure them at /links and the labels drive the filters in analytics. Filter by channel:telegram to see every Telegram-driven tap across campaigns.
The Prefilled Message Caveat
The ?text= draft is a genuine friction cut: the customer arrives at the chat with a message typed and only has to tap send. But Telegram never sends it automatically, and that is deliberate. A link that could silently send a message on your behalf would be a spam vector, so Telegram requires the tap. Write the prefill so the tap feels natural, and do not build a flow that depends on the message being sent before the user acts.
For bots, there is no visible draft at all. The ?start= payload is invisible to the user and handed straight to the bot, which is cleaner for tracking because there is no tracking id sitting awkwardly in a message the customer can see.
QR Code Surfaces
A large share of Telegram click-to-chat traffic comes from scans, not web taps. Someone is in a shop, at an event, or holding a flyer, and scans a code that opens your bot or channel. Print-to-conversation is one of the strongest uses of the short-link-then-t.me pattern.
Two rules keep the print run useful:
- The QR encodes
s.elido.me/<slug>, nevert.me/...directly. Encodingt.melocks the destination, kills the scan analytics, and wastes the print run if the bot or channel changes. - Each placement gets its own short link and its own
?start=payload, so the window code, the flyer code, and the packaging code are separate rows you can compare. Design considerations like quiet zone, contrast, and error correction are the same as any placement, covered in dynamic vs static QR codes.
What Does Not Work
Three patterns that look reasonable and fall over:
Encoding the raw t.me link in a QR or ad. No click data, no destination control, and a dead asset the day the username changes. Print the short link, always.
Stuffing a UTM string into ?start=. The 64-character limit and the restricted character set will truncate or reject it. Use a short id and resolve it to the full campaign data on your side.
Relying on tg:// for anything printed or shared. Custom schemes get blocked by browsers and in-app webviews, so the link fails for a chunk of users with no fallback. Keep tg:// internal and route the public path through t.me behind a short link, with smart routing handling any per-device fallback the way smart links do.
Telegram is the rare channel where the deep link can carry attribution on its own. Pair the bot ?start= payload with a redirect in front, and you get both the click and the Start, joined to the campaign that drove them.
Related on the Blog
Preguntas frecuentes
How do I create a Telegram deep link?
Take the t.me address of your account, channel, group, or bot and add a parameter. For a bot, https://t.me/YourBot?start=payload opens the bot and sends the payload to it when the user taps Start. For a person or channel, https://t.me/username opens the chat, and appending ?text= prefills a draft message. Encode the message and keep the start payload to 64 characters using only letters, numbers, hyphens, and underscores.
What is the start parameter in a Telegram link?
The start parameter is a short string in a bot deep link, written as ?start=payload. When someone opens https://t.me/YourBot?start=payload and taps Start, Telegram delivers that payload to your bot in the /start message. Your bot reads it and can greet the user, unlock content, or record where the click came from. It is the one messaging channel where attribution is built into the link rather than bolted on.
Can I prefill a Telegram message?
Yes for a person or channel link. https://t.me/username?text=Hello opens the chat with Hello typed into the draft. The message is not sent automatically, the user has to tap send, which is a Telegram security feature, not a bug. Bot links use ?start= instead of ?text=, and the bot receives the payload silently rather than showing it as a draft.
Can you track clicks on a t.me link?
A bare t.me link gives you no click data, because Telegram does not report the tap back to you. Put a short link in front of it: the customer taps your short link, the redirect records the click with time, device, and campaign tags, then forwards to t.me. For bots, the ?start= payload adds a second, server-side signal your bot can log when the user actually starts.
What is the difference between t.me and tg:// links?
t.me is a normal https web address that Telegram resolves and opens in the app, which makes it safe to print, share, and put behind a short link. tg:// is a raw app-scheme URL that only works if Telegram is installed and can be blocked or stripped by browsers and apps. Use t.me for anything customer-facing, and treat tg:// as an internal fallback at most.
Prueba Elido
Pega una URL, obtén un enlace corto
Sin registro. El enlace vive 30 días. Crea una cuenta para conservarlo.
Gratis, sin registro · 2 por día