ENEnglish
RUРусский
ZH中文
ESEspañol
PTPortuguês
TRTürkçe
ARالعربية
FAفارسی
FRFrançais
UKУкраїнська
IDBahasa Indonesia
HIहिन्दी
ENEnglish
RUРусский
ZH中文
ESEspañol
PTPortuguês
TRTürkçe
ARالعربية
FAفارسی
FRFrançais
UKУкраїнська
IDBahasa Indonesia
HIहिन्दी

How to Track Subscribers From Telegram Ads

Learn how to track subscribers from Telegram ads: named invite links, bot deep links, postbacks and AdsGram analytics
Blue AdsGram blog graphic showing how to track subscribers from Telegram Ads using deep links, UTM parameters, and start parameters.

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 start parameter — 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_member updates 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 the start parameter, 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/yourchannel arrives 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 start

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.

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:

  1. Add your bot to the channel as an administrator with the right to invite users — without admin rights the method fails.
  2. Call createChatInviteLink once per ad you want to measure, using a strict label such as tgads_de_creative-a or adsgram_bots_v2.
  3. Put that link — not @yourchannel — into the ad's URL field, so every join through it is countable.
  4. Subscribe to chat_member updates explicitly in allowed_updates when you call setWebhook or getUpdates. Telegram does not send these updates by default, and this single omission is the most common reason tracking silently returns nothing.
  5. Store each join event in your own database: link name, user ID, timestamp. This gives you cohorts, which the Telegram interface cannot.
  6. Cross-check aggregate numbers in the channel's invite-link list inside the Telegram admin interface.
  7. 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.

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's tgid, the campaignid, and a goaltype from 1 to 3 that marks the funnel stage — registration, first purchase, repeat purchase. A 200 OK response 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.

  1. 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.
  2. Choose the campaign type that matches your subscriber goal: Telegram channels, bots, Mini Apps, Telegram clients, or Telegram Ads.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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 start parameter are allowed, for example t.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.

Official reseller

Launch Telegram Ads with AdsGram

Launch support, creative pre-moderation and targeting you won’t get with direct placement.

Launch a campaign

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 @channelname instead of an invite link. Joins arrive with no source and cannot be recovered afterwards.
  • Not requesting chat_member in allowed_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 start payload. 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:

  1. Every ad has a unique entry point — named invite link or static start value.
  2. The naming convention is documented and identical in the ad platform and your database.
  3. The bot is a channel admin with invite rights.
  4. chat_member (or chat_join_request) is listed in allowed_updates.
  5. Required macros are present and confirmed by the dashboard indicator.
  6. A test join has been completed and verified end to end.
  7. Join events are stored with a timestamp so cohorts can be rebuilt.
  8. Cost per subscriber, 24-hour churn and 7-day retention are on one report.
  9. Telegram's native channel statistics are checked weekly as a cross-check.
  10. 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.

AdsGram

Advertising That Converts

Reach the right audience across Telegram
Launch a campaign


FAQ

  1. 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 @yourchannel is 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 a start parameter that your bot records against the user.
  2. 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.
  3. 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.
  4. 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_member update is not being received.
  5. 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.
Elizaveta Bydanova
Elizaveta Bydanova
Team Lead Business Development, AdsGram

All-in-one automated platform 
for effective advertising

Start your advertising journey with us today.