Free Telegram Link Generator
Build any t.me deep link: a bot link with a ?start= payload your code can read, add-to-group and add-to-channel links with admin rights, Mini App, share and message links, and sticker packs. Each comes with its tg:// version and a QR code, and nothing you type leaves your browser.
Build your Telegram link
5-32 letters, digits or _, ending in bot. @ and t.me/ are stripped.
0 characters · 64 max · A-Z a-z 0-9 _ -
How the start parameter carries attribution
A Telegram bot link does something a wa.me or m.me link cannot. When someone opens t.me/my_support_bot?start=ref_newsletter_aug and presses Start, Telegram sends your bot the command /start ref_newsletter_aug. Nothing is typed by the user and nothing can be edited away, so the payload is a clean attribution channel: give each campaign, partner or page its own payload and the very first update tells your code where the visitor came from. Your bot reads it as the text after /start , stores it against the user, and can branch its first reply on it, for example skipping the menu for someone who clicked a pricing link.
Treat the payload like a UTM tag, not a secret. It sits in plain text in the URL, so it lands in browser history, ad click logs and forwarded messages. A campaign code is fine; a session token or an email address is not.
Adding a bot to a group or a channel
startgroup asks the user to choose a group, adds the bot, and then delivers the same kind of payload, which is how you learn which community installed the bot rather than which person. Add admin= with rights joined by + and Telegram instead lists only groups where the user can add admins, then makes the bot an admin with exactly those rights, merged with any it already holds. startchannel works the same way for channels with two differences: a bot can only join a channel as an admin, so admin= is required, and no start parameter is allowed. Ask for the least you need. A moderation bot needs delete and ban rights; a posting bot needs post and edit; very few bots need the right to add new admins.
Mini App links
startapp opens a web app inside Telegram instead of sending a chat command. t.me/yourbot?startapp launches the bot's Main Mini App, the one set in BotFather; t.me/yourbot/appname?startapp launches a named Direct Mini App created with /newapp, and one bot can have several. The value after startapp= reaches your app as initData.start_param and as the tgWebAppStartParam URL parameter, so it plays the same attribution role as a start payload. mode=compact opens the app at half height and mode=fullscreen takes over the screen. Telegram documents no length limit for this value, so the generator only URL-encodes it.
Share, message and sticker links
A share link (t.me/share/url?url=...&text=...) opens a chat picker and drops your URL into the message box, with the text on the next line. It is the Telegram equivalent of a share button: the user still chooses the chat and presses Send.
Message links point at one post. In a public chat that is t.me/username/42. A private supergroup or channel has no username, so its link uses the numeric ID instead: t.me/c/1234567890/42. The ID your bot receives in updates is the Bot API form, -1001234567890; Telegram builds it by adding 1,000,000,000,000 to the channel ID and negating it, which is why stripping the -100 gives you the number the link needs. In a forum, put the topic ID before the message ID. Private links only open for members.
Sticker and custom emoji packs install from t.me/addstickers/name and t.me/addemoji/name, where the name is the pack's short name. What this page cannot build is a private invite link (t.me/+hash): Telegram issues those hashes itself, from the app or the API.
Usernames, base64url and the 64-character budget
Every username, bot or not, is 5 to 32 Latin letters, digits and underscores, and bot usernames must end in bot, so tetris_bot works and tetris does not. Start payloads allow only A-Z, a-z, 0-9, _ and -, up to 64 characters. Anything else, such as spaces or non-Latin text, has to be base64url-encoded first, which costs about a third of the budget. The counter above shows the encoded length as you type, so you find the limit before your users find a broken link.
The link opens the chat, but the bot says nothing
A correct deep link proves nothing about the bot behind it: Telegram delivers /start whether or not anything is listening. If Start is pressed and no reply comes, the update pipeline is broken, not the link. The classic cause is two consumers fighting over one token, which Telegram answers with 409: can't use getUpdates while a webhook is active or 409: terminated by other getUpdates request. Check the token with the Telegram bot token checker and the delivery queue with the Telegram webhook checker. Updates reach a bot through a webhook or polling, and that is what turns a payload into something your chatbot analytics can attribute. Connect the bot to a Telegram chatbot and every /start, payload included, starts a flow instead of landing in an inbox nobody watches.
Frequently asked questions
What does the ?start= parameter actually do?
It is delivered to your bot as the argument of the /start command the moment someone opens the chat and presses Start. Your code receives the exact string after start=, so you can match it against a campaign, a referral code or the page the link sat on and branch the first reply on it, without asking the user anything.
Can people see what I put in the start payload?
Yes. The payload is plain text inside the URL, so anyone with the link can read it, and it ends up in browser history, ad-platform click logs and forwarded messages. Telegram's apps do not print it into the chat when Start is pressed, but that is a display choice, not encryption. Never put tokens, passwords or personal data in it.
What is the difference between startgroup and startchannel links?
startgroup lets the user pick a group to add the bot to, optionally as an admin with the rights in admin=, and can carry a start parameter. startchannel adds the bot to a channel, and because a bot can only join a channel as an admin, admin= is required and no start parameter is allowed. Both merge the rights you ask for with any the bot already has.
How do I make a link that opens my bot's Mini App?
Use t.me/yourbot?startapp to open the bot's Main Mini App, or t.me/yourbot/appname?startapp for a named Direct Mini App created with /newapp in BotFather. Anything after startapp= reaches the app as initData.start_param and the tgWebAppStartParam URL parameter, and mode=compact or mode=fullscreen controls how it opens.
How do I link to a message in a private group or channel?
Private chats have no username, so the link uses the chat's numeric ID: t.me/c/1234567890/42. Take the Bot API chat ID your bot sees, which starts with -100, drop the -100 and use what is left. The generator does that conversion for you. Only members of the chat can open the link; everyone else gets an error.
Do I need to base64url-encode my payload?
Only for start and startgroup payloads that contain characters outside A-Z, a-z, 0-9, underscore and hyphen, such as spaces, punctuation or non-Latin text. Encoding costs about a third more length, so the 64-character budget holds roughly 48 bytes of original text. Order codes and short slugs never need it.
What is the tg:// version of a link for?
tg:// links open the Telegram app directly instead of going through a t.me web page, which is handy inside an app or a desktop shortcut. They only work where Telegram is installed and are often stripped or blocked by websites and email clients, so for anything public, such as a website button, an ad or a QR code, use the t.me version.
Why does my link open the bot but nothing happens?
The link did its job: Telegram opened the chat and delivered /start. Silence means nothing is processing updates for that bot. Usually a webhook is failing, two processes are polling the same token, or the code ignores the payload. Check the token and webhook first; the fix is almost never in the link itself.
Related
Turn every /start into a conversation
Connect your Telegram bot to Conferbot and branch the first reply on the payload. Free plan, no card.