The Telegram start parameter is the one payload a bot link can carry. Telegram documents it as up to 64 characters drawn from A-Z, a-z, 0-9, underscore and hyphen. That is enough for a lookup key and not enough for a Meta click identifier, so working attribution stores the click server side and passes only a short reference.
Every article about Telegram attribution mentions the start parameter. Almost none of them state its limits precisely, which is a problem, because the limits are the whole design constraint. This page is the reference: what Telegram actually documents, what fits inside 64 characters, what does not, and how to build a handoff that survives the boundary.
What is the Telegram start parameter?
The start parameter is a value appended to a bot link as ?start= that Telegram delivers to the bot the moment the person opens the chat. It is Telegram's documented mechanism for passing data into a conversation before the user has typed anything.
Telegram describes the mechanism this way:
"Telegram bots have a deep linking mechanism that allows additional parameters to be passed to the bot on startup. It could be a command that launches the bot or an authentication token to connect the user's Telegram account to their account on another platform."
Telegram, Bot Features, Deep Linking. core.telegram.org/bots/features#deep-linking. Checked 14 August 2026.Note the second example Telegram gives: an authentication token connecting a Telegram account to an account on another platform. That is precisely the attribution use case. Telegram is not describing a tracking feature, it is describing an identity handoff, and attribution is one honest application of it.
How many characters can the start parameter hold?
Sixty-four. Telegram states the limit and the permitted character set in a single sentence, and it has not changed across recent Bot API releases.
"A-Z, a-z, 0-9, _ and - are allowed. We recommend using base64url to encode parameters with binary and other types of content. The parameter can be up to 64 characters long."
Telegram, Bot Features, Deep Linking. core.telegram.org/bots/features#deep-linking. Checked 14 August 2026.Two facts follow directly. First, the permitted alphabet is exactly the base64url alphabet, which is why Telegram recommends base64url and not standard base64: standard base64 uses + and /, neither of which is on Telegram's list. Second, 64 characters of a 64-symbol alphabet is 6 bits per character, so the parameter carries at most 384 bits, or 48 bytes, of binary payload.
That 48 byte ceiling is the number worth committing to memory. It is the real budget.
What actually fits in 48 bytes?
Enough for an opaque reference and a little routing metadata. Not enough for a click identifier, a UTM set and a timestamp. The table below is arithmetic, not opinion.
| What you might want to carry | Cost in characters | Fits in 64? |
|---|---|---|
| Random 128 bit token, base64url, unpadded | 22 | Yes |
| Random 128 bit token as lowercase hex | 32 | Yes |
| UUID with hyphens | 36 | Yes |
| Two 128 bit tokens, base64url | 44 | Yes |
| 128 bit token plus a short campaign code and a 32 bit timestamp | about 40 | Yes |
A full _fbc cookie value | about 55, but contains periods | No |
Raw fbclid from Meta's own documented example | 61 | Not safely |
A ttclid, which TikTok says may run to 1,000 characters | up to 1000 | No |
| Click ID plus three UTM values plus a timestamp | 150 and upward | No |
Can you put an fbclid in a Telegram start parameter?
No, not reliably, and a full _fbc value is impossible by construction. Meta's stored click value is period delimited, and the period is not in Telegram's permitted character set, so the value cannot pass through unmodified.
Meta documents the format explicitly:
"The formatted ClickID value must be of the form version.subdomainIndex.creationTime.<fbclid>"
Meta's worked example: fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890
Three periods, and Telegram allows none. You could strip them and reassemble on the far side, but you would still be carrying the bare fbclid, and Meta's own documented example value is 61 characters long before you add anything else. Meta also warns that the value is case sensitive and must not be modified, which rules out any lossy re-encoding scheme.
People try this. The failure mode is quiet: the link works, the bot receives something, and the reassembled click identifier is subtly wrong, so Meta accepts the event and matches nothing. You get a green tick in your logs and no attribution. Passing a reference instead of a payload removes the failure mode entirely.
What should you encode in the start parameter instead?
A short opaque reference to a click record you already stored server side. The bridge page holds the click identifier, the UTMs, the timestamp and the user agent. The start parameter carries only the key that finds them again.
A workable shape looks like this:
- On landing, write the click record. Store the click identifier exactly as it arrived, plus every UTM value, the referrer and the arrival time. Generate a random reference at the same time.
- Redirect to the bot with the reference only.
https://t.me/your_bot?start=<reference>, where the reference is 22 to 32 characters of base64url. - On
/start, join the two records. The bot now holds both the Telegram user ID and the stored click record. That pairing is the attribution. - Retire the reference. Treat it as single use, or at least bind the first Telegram ID that redeems it, so a forwarded link cannot silently reassign a click to a second person.
Three design details are worth getting right, because each one produces a distinctive class of bad data if you get it wrong:
- Use enough entropy. Sequential or short references are guessable, and a guessed reference means a stranger inherits someone else's attribution. 128 bits from a cryptographic random source costs 22 characters and removes the problem.
- Expire references. A reference redeemed weeks after the click is more likely to be a shared screenshot than the original clicker. Meta's Conversions API will not accept an
event_timemore than seven days old in any case, so a short lifetime costs you nothing you could have used. - Do not encode personal data. The start parameter is visible in the link, in the address bar, in shared screenshots and in any chat where the link is forwarded. Treat it as public. A random reference is public-safe; an email address or phone number is not.
FlowTracker generates the tracked link, stores the click record, mints the reference, redeems it on /start and keeps the pairing for every later event. Nothing to encode by hand.
What does the bot actually receive?
A message containing /start followed by a space and the parameter value. Telegram's documentation gives the exact shape for both private chats and groups.
For a private chat, Telegram's example is a link of the form https://t.me/your_bot?start=airplane, and it states:
"When someone opens a chat with your bot via this link, you will receive:"
/start airplane
Practically, that means your bot must parse the parameter out of a message body, not out of a dedicated field. Split on the first space, take the remainder, and validate it against your own reference format before you use it as a database key. It arrives from the open internet.
What about groups, channels and Mini Apps?
Groups use startgroup, Mini Apps use startapp, and channels have no start parameter at all. The distinction matters because it determines which funnel shapes can carry attribution.
| Destination | Parameter | What the bot receives |
|---|---|---|
| Private chat with a bot | ?start= | /start <value> in a message |
| Group, adding the bot | ?startgroup= | /start@your_bot <value> |
| Mini App | ?startapp= | Delivered to the Web App, see Telegram's Web Apps guide |
| Channel | None | Nothing. Channel links carry no payload |
Telegram documents the group case with the example https://t.me/your_bot?startgroup=spaceship and states that following the link prompts the user to select a group to add the bot to, with the resulting update containing text in the form /start@your_bot spaceship.
The channel row is the one that surprises people. A t.me/yourchannel link accepts no parameter, which is why per-visitor invite links exist and why channel attribution is a different mechanism entirely. That mechanism is covered in what is technically observable about a Telegram channel join.
Telegram Business uses the same channel for its own purposes. Its documentation states that a user connecting a bot to their account and tapping "Manage Bot" reaches a bot "which will receive a deep link message in the format /start bizChat<user_chat_id>". If your bot supports Telegram Business, namespace your references so they cannot collide with Telegram's own reserved prefixes.
What the start parameter cannot do
It cannot recover a click that never touched a page you control, and it cannot tell you whether the person redeeming it is the person who clicked. Both limits are structural, and no tool removes them.
- It does not fire without a bridge page. If your ad points straight at
t.me/your_bot, there is no click identifier to store and no reference to mint. The parameter is empty because nothing filled it. - It does not survive forwarding intact. A person who forwards your link passes their reference to someone else. Binding the first redeemer is the only defence, and it means the second person is correctly unattributed rather than wrongly attributed.
- It is not a Meta, Google or TikTok identifier. It is yours. The ad platform learns nothing from it. Returning a conversion still requires sending the stored platform click identifier through that platform's server-side API.
- It does not cover organic arrivals. Someone who searches the bot username, or taps a link in a forwarded screenshot, arrives with no parameter. Counting those as unattributed rather than guessing is the honest treatment.
Once the pairing exists, everything downstream is bookkeeping: the join, the conversation, the purchase, and the conversion sent back through the Meta Conversions API within its documented upload window. The 64 characters are the narrow part of the pipe, and they are narrow on purpose.
Sources
Every link below was fetched and read on 14 August 2026. Where a vendor does not document something, this article says so rather than filling the gap with an estimate.
Last reviewed 14 August 2026