Telegram gives you exactly one field to carry attribution from an ad into a chat. Here is how the start payload works, how to design codes that still make sense a year later, and how to reconcile bot numbers with ad platform reporting.
A Telegram deep link is a normal URL: t.me/yourbot?start=PAYLOAD, or the native form tg://resolve?domain=yourbot&start=PAYLOAD. Once a /start is actually sent, your bot receives a message whose text is /start PAYLOAD. That message is the entire attribution event. There is no referrer header, no cookie, no landing page script, no click ID appended by the platform. Whatever you did not encode into the payload is gone the moment the user leaves the browser for the Telegram app.
Two constraints shape everything else. First, the payload is capped at 64 characters and accepts only A-Z, a-z, 0-9, underscore and hyphen — so a UTM query string cannot be stuffed into it. Second, the payload only reaches the bot if a /start is sent: a cold user taps the Start button and you get it, while a returning user who opens the chat from their list and types “hi” arrives with nothing attached. Design your reporting around starts, not opens. The mechanics of the URL itself, including the startgroup variant used to add a bot to a group, are covered in the Telegram deep link glossary entry.
Payload codes are written once and read forever, usually by someone who was not in the room when they were minted. Fix a slot order and never deviate from it — for example channel_creative_geo_period, producing ig_reel_hookb_br_2603. Positional slots stay readable to a human at a glance and parseable by a script without a lookup table.
ig-reel_br cannot coexist with ig_reel_br.yymm, never 0304 — a European and an American read that differently.A payload does two jobs, and it helps to separate them: it selects what the subscriber sees, and it records where the subscriber came from. In mySkua the incoming payload is resolved against your campaign codes first. On a match, that campaign delivers its own promo code, its message in the subscriber's language, its media and its inline URL buttons. On no match, the payload is still kept as a source and turned into a tag, and the subscriber gets the standard welcome flow.
That distinction makes payloads useful beyond a dashboard number, because sources and tags are also targeting criteria: drips and broadcasts can be aimed at a language, a source, a tag or a category. A code like tg_partnerx_pt_2604 is both an attribution record and an audience — that cohort can get a different day-three message than your Instagram traffic, with no separate list to maintain.
Granularity is decided when you mint the link and can never be recovered afterwards. If every Instagram placement shares instagram, no later analysis will tell you which reel did the work. The counterweight is that thousands of near-identical codes are their own kind of unreadable. The practical rule: mint a separate link for any dimension you would actually move budget over. If you would never pause a creative independently, it does not need its own code. If you buy geo by geo, geo belongs in the payload.
A second axis comes for free. When a bot asks subscribers to pick a category — Sport or Casino, say — that choice is recorded independently of the link they arrived through, so crossing source against category tells you which channels bring which intent without multiplying your link count.
Deep links live in hostile places. Bio-link tools rewrite URLs and sometimes strip the query string. Screenshots get retyped with a missing underscore. A partner appends their own suffix to a code you gave them. Plan for it:
Ad platform reporting ends at the click on your t.me link; bot reporting begins at the /start. Nothing crosses that boundary automatically, so the payload has to be your join key: use the same code in the ad name that you use in the payload. A join on that string then puts spend, impressions and clicks beside subscribers and activations.
Expect the two sides never to match. Clicks always exceed starts: the app switch fails, the user reads the bot profile without tapping Start, or the click was accidental. Watch the click-to-start ratio per link instead — a stable ratio that suddenly halves usually means a broken link or a creative the bot profile does not confirm, not a tracking bug. On the bot side you export subscriber growth, campaign activations and delivery stats; Telegram bot analytics covers the cohort and retention views that make those numbers comparable week to week.
Deep links get forwarded. Without rules, one enthusiastic subscriber sharing a code in a group chat can inflate a campaign until it looks like your best performer. Three mechanisms keep the numbers honest:
Decide explicitly whether a report is first touch or last touch. The source recorded at the first /start is sticky and answers “where did this subscriber come from”. Campaign activations are event level and answer “which offers did they engage with”. Summing the two into one conversion column is where double counting starts. Payout models built on partner links — the pattern in affiliate marketing with a Telegram bot — should state which of the two they pay on, in writing, before the first link is issued.
When a link credits the wrong campaign or nothing at all, work down this list in order:
t.me/brand and t.me/brand_bot are different destinations, and only one is your bot.IG_Reel and ig_reel are different strings before normalisation.?start= survived.If you run one link today, split it three ways this week — by channel, by creative and by geo — and write the naming scheme somewhere your team can read it. Attribution on Telegram is not a tool you buy; it is a convention you enforce every time a link is created. The platform only has to keep every payload, match what it recognises, and store the rest as a source you can query later.
mySkua is in a private, invite-only beta. If you run Telegram funnels across several bots and want to work this way, join the waitlist to request access — we onboard new teams in small batches and are happy to look at your link scheme when we do.
Want this on your own bots?
mySkua is in a closed beta and accounts are opened in small batches. Tell us what you run and we will come back to you.
Request access