Telegram Ads measurement & attribution — the practical playbook
How to actually measure Telegram Ads performance when the platform itself reports almost nothing. UTM strategy, bot-funnel deep-links, cohort inference.
7 min · updated 2026-05-17
Attribution is the single biggest reason performance marketers undervalue Telegram Ads. Unlike Google or Meta — which surface conversion data inside the cabinet — Telegram Ads tells you almost nothing about what happened *after* the click. This article is the practical playbook for making Telegram measurable without the platform's help.
#TL;DR
- The Telegram Ads cabinet reports **reach and impressions**, not conversions
- UTM parameters on your CTA URL are the foundation — everything downstream attaches there
- For bot/mini-app destinations, **deep-link start parameters** carry attribution into the funnel
- You cannot attribute back to specific channels in EUR cabinet — only aggregate campaign spend
- Workaround: **rotate creative + use unique tracking links per campaign**, infer channel quality from cohort behaviour downstream
#What the cabinet actually shows you
**EUR cabinet** (the official Telegram Ads Platform):
- Aggregate impressions per campaign
- Aggregate reach (deduplicated unique users)
- Daily spend
- Approximate CTR (delivered by Telegram, methodology opaque)
- **No** channel-level breakdown after delivery (you choose channels at setup, but performance is averaged)
- **No** demographic breakdown of who clicked
- **No** conversion or revenue data
**TON cabinet** (channel-owner paid posts):
- Reach (estimated by channel views)
- That's it. Truly. The TON system has no built-in measurement at all.
Everything else — conversion rates, ROAS, channel quality, geo performance — you have to infer or instrument yourself.
#UTM parameter strategy
The foundational move: every CTA URL needs UTM tags. Telegram passes them through without modification.
Recommended structure:
```
https://your-site.com/landing
?utm_source=telegram
&utm_medium=tg_ads
&utm_campaign=launch-jan-2026
&utm_content=banner-v3-headline-a
&utm_term=crypto-channels-batch-1
```
Key conventions:
- **utm_source** = always `telegram` (separates from organic / other paid)
- **utm_medium** = `tg_ads` (EUR cabinet) vs `tg_organic` (channel-owner native posts) vs `tg_ton` (TON sponsored)
- **utm_campaign** = your campaign name + month
- **utm_content** = creative variant (image-v1, text-v2, etc.)
- **utm_term** = channel batch or audience segment (since per-channel attribution isn't surfaced, use it to bucket)
Read these in your destination analytics (GA4, Mixpanel, PostHog). This gets you campaign-level + creative-variant attribution.
#Deep-link start parameters for bot/mini-app destinations
If your CTA goes to a Telegram bot or mini-app (`t.me/yourbot?start=PARAM` or `https://t.me/yourbot/yourminiapp?startapp=PARAM`), the `start` / `startapp` parameter flows into the bot's first message as `/start PARAM`.
Use it as your attribution token:
```
https://t.me/yourbot?start=tgad_jan2026_bannerA_cryptobatch1
```
In your bot handler:
```js
bot.command('start', (ctx) => {
const payload = ctx.match // 'tgad_jan2026_bannerA_cryptobatch1'
// log to your analytics with this token
// associate with user.id for full downstream funnel
})
```
Once you have `(user_id, start_payload)`, every downstream event in your bot (purchase, signup, deposit, mini-app login) inherits attribution. This is the most reliable measurement path on Telegram.
#Cohort inference for channel quality
Since per-channel breakdown isn't surfaced by EUR cabinet, the workaround is **cohort isolation**.
Run a single creative against a single channel batch for 3–5 days. Note:
- Spend
- Total UTMs / deep-link hits attributed to that campaign
- Downstream conversion behaviour from that cohort
Then switch the same creative to a different batch. Compare. Over 4–6 isolation experiments, you build a per-channel quality ranking that the platform refuses to give you directly.
This is slow (~2 weeks per batch) but produces real signal. Big spenders run dozens of these in parallel with unique `utm_term` tags.
#Conversion tools that work
| Tool | What it covers | Telegram-specific notes |
|---|---|---|
| **GA4** | Web destinations | Treats UTMs natively. Set tg_ads as a paid channel grouping. |
| **Mixpanel / Amplitude** | Web + app + bot events | Best for bot funnels — instrument `/start` payload + downstream events. |
| **PostHog** | Web + product | Self-host friendly, EU-compliant, cheap at scale. |
| **AppsFlyer / Adjust** | Mobile app installs | Telegram traffic shows up as organic unless you use a deferred deep-link wrapper. |
| **In-bot custom** | Bot + Telegram-only flows | Most reliable. Store `(tg_user_id, attribution_token, event_log)` in your own DB. |
#Common pitfalls
1. **Forgetting UTM on CTA URL.** Telegram Ads doesn't add them. If you launch without tags, every click is "(direct)" in your analytics — fully unattributed.
2. **Reusing the same UTM across creatives.** You lose ability to compare variants. Always vary at minimum `utm_content`.
3. **Trusting cabinet CTR alone.** The number isn't independently verifiable. Compare against UTM-tagged landing-page hits for sanity check.
4. **Ignoring the lag.** Telegram cabinet reporting lags 4–8 hours. Don't optimise budget based on the same-day numbers.
5. **Treating TON cabinet impressions equivalently to EUR.** TON reach is self-reported by channel owners, often inflated 2–5×.
#See also
Cabinet differences: /wiki/eur-vs-ton-vs-stars. Pricing reference: /wiki/telegram-ads-pricing-guide. Creative iteration: /wiki/telegram-ads-creative-best-practices. Why this isn't Google: /wiki/telegram-ads-vs-google-ads.