TL;DR
- To track subscribers from Telegram ads, you need a unique entry point per ad — a named invite link for a channel or a bot deep link with a
startparameter — because Telegram does not pass a click ID into a channel join. - Named invite links created through the Telegram Bot API give per-link join counts, and
chat_memberupdates let your bot record which link each new subscriber used. - Bot deep links are the most precise option: AdsGram macros such as
{campaign_id}and{click_id}travel inside thestartparameter, and your server confirms the action through the AdsGram conversion API. - In Telegram Ads campaigns run through AdsGram, dynamic macros are not accepted in the ad URL, so attribution relies on one named invite link or one static deep link per creative.
- Track cost per subscriber, 24-hour unsubscribe rate and 7-day retention together — a cheap subscriber who leaves in a day costs more than an expensive one who stays.
Most advertisers can tell you how much they spent on a Telegram campaign. Far fewer can tell you which creative brought the 400 people who stayed in the channel. That gap exists because a channel join is not a website visit: no referrer, no click ID, no cookie.
This guide shows how to track subscribers from Telegram ads in practice — the four methods that work, exactly how to set each one up, what changes when you buy through Telegram Ads, and which metrics separate real audience growth from expensive noise.
Why Telegram subscribers are hard to attribute
Telegram gives you no per-user source data for a channel join by default. The ad platform records a click; the channel records a new member; nothing connects the two records unless you create that connection yourself.
Attribution is the process of assigning a user action — here, a subscription — to the specific ad, creative or placement that caused it. Three constraints shape how it works inside Telegram:
- Joins carry no parameters. A user tapping
t.me/yourchannelarrives identically whether they came from an ad, a repost or a search. - Native statistics are aggregated. Telegram's channel analytics group new followers into broad source buckets, not campaigns.
- Only a unique entry point creates a signal. A named invite link or a bot deep link is the one thing that tells you which ad a person came through.
Everything below is built on that last point.
[VISUAL OPPORTUNITY — INSERT VISUAL: a horizontal flow diagram showing ad impression → click → unique entry point (named invite link / bot deep link) → join event → advertiser database → campaign dashboard, with a red "attribution breaks here" marker on the path that uses a plain @username link]
Four ways to track subscribers from Telegram ads
There are four working methods, and serious advertisers combine at least two: one for granular per-ad data, one as an independent cross-check.
Method | Granularity | Setup effort | Best for |
|---|---|---|---|
Named invite links | Per link (per creative, placement or campaign) | Low — bot admin rights + one API call per link | Channel growth campaigns |
Bot deep links with | Per user and per click | Medium — bot logic + database | Funnels where the bot is the first step |
Telegram channel statistics | Aggregated by source type | None — built in | Sanity checks and organic vs. paid split |
Trackers and postbacks | Per click and per conversion | Medium to high — tracker setup | Performance campaigns with downstream actions |
Pick the method that matches where your subscriber actually lands, then keep the naming convention identical everywhere.
Method 1: Named invite links for channels
Named invite links are the fastest reliable way to attribute channel subscribers, because each link keeps its own join counter and can be created in seconds. A named invite link is an additional channel invite link with a human-readable label attached to it.
The Telegram Bot API documents createChatInviteLink, which accepts a name of up to 32 characters, an optional expire_date, a member_limit, and creates_join_request. Set-up sequence:
- Add your bot to the channel as an administrator with the right to invite users — without admin rights the method fails.
- Call
createChatInviteLinkonce per ad you want to measure, using a strict label such astgads_de_creative-aoradsgram_bots_v2. - Put that link — not
@yourchannel— into the ad's URL field, so every join through it is countable. - Subscribe to
chat_memberupdates explicitly inallowed_updateswhen you callsetWebhookorgetUpdates. Telegram does not send these updates by default, and this single omission is the most common reason tracking silently returns nothing. - Store each join event in your own database: link name, user ID, timestamp. This gives you cohorts, which the Telegram interface cannot.
- Cross-check aggregate numbers in the channel's invite-link list inside the Telegram admin interface.
- Run one test join from a second account before you spend budget.
Practitioner note: if you set creates_join_request to true, joins turn into approval requests and your bot receives chat_join_request updates containing the invite link used. Attribution becomes very reliable, but you add friction and a moderation duty — use it for high-value niches, not mass acquisition. Note also that member_limit cannot be combined with creates_join_request.
Method 2: Bot deep links with a start parameter
Bot deep links give per-user attribution because the parameter travels with the user into your bot's first message. A deep link is a t.me link with a payload appended, for example t.me/your_bot?start=camp12_creativeA.
Per the official Telegram bot features documentation, the start parameter accepts A–Z, a–z, 0–9, _ and -, and is limited to 64 characters — encode anything longer with base64url. That 64-character ceiling matters in practice: chained tracking payloads run out of room fast, so use short IDs, not readable names.
When you run campaigns on AdsGram, the platform substitutes macros inside that payload automatically. The AdsGram tracking documentation lists the available macros — {campaign_id}, {banner_id}, {publisher_id}, {click_id} and {record_data} — and shows the deep-link pattern:
https://t.me/[name_of_the_bot]?start=[unique_referral_link]_{campaign_id}_{banner_id}_{publisher_id}_{click_id}_{record_data}
Your bot parses the start payload, stores it against the Telegram user ID, and then sends the channel invite link. The subscriber is now attributed to a specific campaign, banner and publisher placement — a level of detail no invite link alone can give you. This pattern also works well for advertising in Telegram that mixes channel growth with product actions, since the same identifier follows the user into the funnel.
Method 3: Telegram's built-in channel statistics
Telegram's native channel statistics answer one question well: how much of your growth is paid versus everything else. They show subscriber growth over time and group new followers by source type, alongside notification, view and post-level data.
Use them for three jobs:
- Verification. If your tracked joins and total channel growth diverge sharply, one of your links is missing a parameter.
- Timing. Growth spikes tell you when an ad actually delivered, which matters for placements that run unevenly.
- Organic lift. Paid campaigns generate reposts and search traffic; native stats capture that halo, your links do not.
What native statistics cannot do is separate creative A from creative B. Treat them as a cross-check, never as your primary attribution source.
Method 4: Trackers and server-side postbacks
Trackers and postbacks are for advertisers whose subscribers are supposed to do something next — register, deposit, buy. A postback is a server-to-server request that reports a completed action back to the ad platform, without cookies or browser involvement.
Two building blocks:
- Tracking links. Append campaign parameters to your destination URL so downstream systems can read the source. The Google Analytics campaign parameter reference covers the standard
utm_set for web landings; for Telegram destinations, AdsGram macros play the same role. - Conversion confirmation. AdsGram exposes an endpoint at
https://api.adsgram.ai/confirm_conversion, called with your account token, the user'stgid, thecampaignid, and agoaltypefrom 1 to 3 that marks the funnel stage — registration, first purchase, repeat purchase. A200 OKresponse means the conversion was registered.
The AdsGram platform also supports partner integrations with AppsFlyer, Adjust, AppMetrica, Keitaro and Kochava, so subscriber and post-subscription events can land in the analytics stack you already use. Watch one requirement: {record_data} must be present in the campaign URL for web landing links, Keitaro and Kochava, and {campaign_id} for Telegram ecosystem links. A missing macro means conversion tracking fails silently.
How to set up subscriber tracking in AdsGram
Setting up subscriber tracking in AdsGram takes one campaign build plus a short verification pass. AdsGram is an advertising platform and Telegram Ads reseller that runs campaigns in Telegram channels, bots and Mini Apps, with campaigns launching in roughly five minutes.
- Register in the advertiser dashboard and top up your balance. If you are also an AdsGram publisher, log in under the same account so your ads are not served inside your own app.
- Choose the campaign type that matches your subscriber goal: Telegram channels, bots, Mini Apps, Telegram clients, or Telegram Ads.
- Build the destination link before the creative. Named invite link for a pure channel play; bot deep link with macros when the bot is the entry point.
- Insert the macros you need — the dashboard highlights which macros are present in the link and which are missing, so fix that indicator before launch.
- Set targeting: geo, language, device, VPN status and Telegram Premium status. If you are unsure how granular to go, our guide to setting up targeted advertising in Telegram Ads walks through the parameters.
- Pick a pricing model: CPM, tCPC or tCPA. tCPA requires working conversion tracking, and it is worth waiting until roughly 25 conversions have accumulated before switching, so the optimisation has data to learn from.
- Launch, then verify within the first hour. Click your own ad, complete the join, and confirm the event appears in your database with the right link name or payload.
- Read the analytics by breakdown. AdsGram reports by time, banner, country, Telegram interface language and publisher platform ID, with all statistics displayed in UTC+0.
- Prune placements. Platform IDs that deliver joins which churn within 24 hours can be excluded from Mini App and bot campaigns directly in targeting settings.
Steps 7 and 9 are where most of the money is saved. Verification catches broken tracking while the budget is still small; placement pruning stops you paying for traffic that never becomes an audience.
What you can and can't track in Telegram Ads campaigns
Telegram Ads campaigns launched through AdsGram support subscriber tracking, but not through macros — the ad URL must be static. The AdsGram platform is a Telegram Ads reseller, so campaigns run under Telegram's own link and content rules.
What the Telegram Ads moderation requirements allow and forbid, in tracking terms:
- Invite links are permitted in the URL field — and prohibited inside the ad copy. This is the mechanism that makes per-ad attribution possible.
- Links containing dynamic macros are not accepted. No
{click_id}in a Telegram Ads URL. - Bot deep links with a static
startparameter are allowed, for examplet.me/name_bot?start=ABC. - One external link per URL field, HTTPS only, and URL shorteners are prohibited.
The practical workaround is structural: give every ad its own named invite link or its own static start value, and let the link name carry the campaign metadata your macros normally would. Two Telegram Ads campaign types are available at the start — Users, with flexible audience targeting, and Channels, for posts with text, URL and an image or video. Bots and Search campaign types unlock after the first freeze in either Users or Channels.
Launch Telegram Ads with AdsGram
Launch support, creative pre-moderation and targeting you won’t get with direct placement.
Metrics that show subscriber quality
Subscriber count alone is a vanity metric; the useful signal is what those subscribers do in the first week. Track these five together, broken down by creative and placement.
Metric | How to calculate | What it tells you |
|---|---|---|
Cost per subscriber (CPS) | Ad spend ÷ attributed joins | The real acquisition price of one audience member |
Join rate | Joins ÷ clicks | Whether the ad promise matches what the channel delivers |
24-hour unsubscribe rate | Leaves within 24h ÷ joins in that cohort | Misleading creative, wrong audience, or bot traffic |
7-day retention | Cohort members still subscribed on day 7 ÷ joins | Durable audience quality by source |
Cost per action | Spend ÷ confirmed conversions | Business value beyond the subscription itself |
A creative with the lowest CPS and the highest 24-hour churn is usually your worst creative, not your best. Sort by retention first, then optimise cost. Fake growth distorts every one of these numbers, which is why it is worth knowing how to protect a Telegram channel from bot manipulation before you scale spend.
Common tracking mistakes
Most broken subscriber tracking comes from configuration, not strategy. The recurring ones:
- Advertising
@channelnameinstead of an invite link. Joins arrive with no source and cannot be recovered afterwards. - Not requesting
chat_memberinallowed_updates. The bot works perfectly and receives nothing. - Reusing one invite link across every creative. You get a total, never a comparison.
- Exceeding 64 characters in a
startpayload. The link breaks or the parameter is truncated. - Omitting a required macro. Without
{record_data}or{campaign_id}where required, conversions never register. - Comparing dashboards on different time zones. AdsGram statistics run on UTC+0; your internal database probably does not.
- Deleting an invite link after a campaign ends. You lose the ability to analyse that cohort later.
Subscriber tracking checklist
Run this before every launch:
- Every ad has a unique entry point — named invite link or static
startvalue. - The naming convention is documented and identical in the ad platform and your database.
- The bot is a channel admin with invite rights.
chat_member(orchat_join_request) is listed inallowed_updates.- Required macros are present and confirmed by the dashboard indicator.
- A test join has been completed and verified end to end.
- Join events are stored with a timestamp so cohorts can be rebuilt.
- Cost per subscriber, 24-hour churn and 7-day retention are on one report.
- Telegram's native channel statistics are checked weekly as a cross-check.
- Underperforming placement IDs are excluded, not just paused.
With those ten in place, the next campaign becomes a comparison rather than a guess — which is the whole point of tracking. If you are still building the audience base that these campaigns scale, our guide on how to promote a Telegram channel from scratch covers the groundwork, and the Telegram Ads complete guide covers formats and costs in detail.
FAQ
- Can you see which ad a Telegram subscriber came from?
Not by default. Telegram passes no source data into a channel join, so a user arriving via@yourchannelis untraceable. You can only identify the source if the ad pointed to a unique entry point — a named invite link created through the Bot API, or a bot deep link with astartparameter that your bot records against the user. - How do I track subscribers from Telegram ads without a developer? Use named invite links. Create one link per creative, place it in the ad's URL field, and read the per-link join counts in your channel's invite-link list inside the Telegram admin interface. This requires no code and gives you creative-level comparison. Per-user data and cohort analysis do require a bot and a database.
- What is a good cost per subscriber in Telegram?
It depends entirely on geo, vertical and audience quality, so treat any single benchmark with caution. The more useful comparison is internal: measure cost per subscriber alongside 24-hour unsubscribe rate and 7-day retention for each creative and placement, then judge sources against each other rather than against an industry average. - Why do my tracked joins not match my channel's subscriber growth? Some difference is normal and healthy. Paid campaigns generate reposts, forwards and search traffic that your links never see, and organic churn runs in parallel. A large gap in the other direction — growth far below tracked joins — usually means a link is missing a parameter or a
chat_memberupdate is not being received. - How long should I wait before judging a Telegram ad campaign? Verify tracking within the first hour, but judge performance on cohorts, not on day one. A seven-day retention window is the minimum useful read, because subscribers acquired from a mismatched creative typically leave within the first 24 to 48 hours, well before the numbers stabilise.





