To track subscribers from Telegram ads, give each campaign, creative, or placement a unique invite link. For user-level records, an administrator bot can receive channel membership updates and store the invite link used for each confirmed join. A plain channel username does not carry campaign data, while a bot deep link proves a bot start rather than a channel subscription.
The rest of the conversion path needs different tools. Telegram Pixel can record eligible events on a website, but it cannot observe a user's journey inside a standard Telegram bot. A campaign that sends users to a bot needs a deep link with a start parameter, a server-side event log, and a CRM or payment record for the final business outcome.
The practical measurement chain is:
Ad spend -> channel ad impression -> channel join or bot start -> onboarding milestone -> qualified lead -> purchase
Use an invite-link ID for a channel destination or a short tracking token for a bot destination. Save the confirmed join or bot start, then attach later events to the same internal user record where the data model allows it. Join delivery and spend from the buying platform with channel, bot, and CRM events. That is the foundation for cost per subscriber, cost per start, CPL, CPA, retention, and placement-level optimization.
Telegram Pixel and Bot Tracking Solve Different Problems
A browser pixel runs JavaScript on a web page. It can record a page view, completed form, checkout, or another website action when the user's browser loads the code and sends the event. Telegram has an official Pixel documentation page, and some Telegram Ads account or reseller routes expose Pixel Tag controls for website campaigns.
A standard bot chat is not your website. There is no page where you can install a browser tag, and a pixel cannot see a /start command, callback button, questionnaire answer, or Bot API payment update. Those events arrive at the bot's backend through Telegram updates and must be recorded there.
|
Destination and event |
Primary measurement method |
What it can prove |
|
External website page or form |
Telegram Pixel, where available, plus website analytics |
A browser loaded a page or fired a configured website event |
|
Telegram channel |
Unique invite link plus chat_member or chat_join_request events |
A user joined through a specific invite link and remained or left later |
|
Standard Telegram bot |
Start parameter plus Bot API event log |
A Telegram user started the bot and completed defined in-bot actions |
|
Telegram Mini App |
startapp parameter plus validated Mini App and server events |
A user opened a campaign-specific app flow and completed validated actions |
|
Sales handled outside Telegram |
CRM record joined to the acquired user or lead |
A lead became qualified, booked, purchased, or generated revenue |
Availability needs a pre-launch check. Telegram's public Getting Started documentation says ad URLs must point to a Telegram channel or bot, while the current Ad Policies and Guidelines also discuss website destinations. Pixel controls and permitted destinations may therefore differ by account, country, or buying route. Confirm what your account supports before building a funnel around website events.
Treat the pixel as one input to the measurement system, not as the system itself. The event closest to revenue usually lives in your bot backend, billing service, or CRM. Optimize against that verified event whenever the campaign has enough volume.
Sara Al MansooriAdTech Strategist at MangoAds.
How to Track Subscribers From Telegram Ads
Use a unique additional invite link for every campaign dimension you need to compare. One link per campaign gives campaign-level attribution. One link per creative or placement gives a more granular report, but it also creates more links to manage. Keep a server-side mapping such as:
invite_link_id: inv_4f21campaign: q3_growth_uscreative: proof_aplacement: saas_channels_02
You can create and name additional invite links in Telegram or through the Bot API. The official `createChatInviteLink` method supports an optional name of up to 32 characters. Use short operational names and keep the full campaign metadata in your own table.
For user-level join records, add a bot to the destination channel as an administrator and explicitly request chat_member in allowed_updates. Telegram excludes chat_member from the default update set. When a person joins through an invite link, the `ChatMemberUpdated` object can include the link used. Store the user ID, invite-link ID, timestamp, previous status, and new status.
If the link requires approval, subscribe to chat_join_request instead. That update can include the invite link used, and the bot needs the can_invite_users administrator right. Treat a request as a separate event from an approved membership. A request that is rejected or never approved is not a subscriber.
Opening an invite link does not prove a join. Count channel_join only after a membership update confirms the transition. Record later leave events against the original acquisition cohort so you can calculate early churn and retention.
CPS = Ad spend / Unique attributed channel joins
24-hour unsubscribe rate = Members who left within 24 hours / Unique attributed joins x 100%
7-day retention = Attributed members still subscribed on day 7 / Unique attributed joins x 100%
Suppose a hypothetical channel campaign spends $1,200, records 1,200 unique attributed joins, and retains 960 of those members on day 7. CPS is $1.00, 7-day retention is 80%, and the cost per retained day-7 subscriber is $1.25. These figures demonstrate the calculation only. They are not Telegram performance benchmarks.
Do not use a single invite link for every creative if you need creative-level attribution. Do not describe a bot start as a channel join. If a user first starts a bot and then receives a channel invite link, confirm the later membership event and join it to the bot user record before counting a subscriber.
Define Conversions Before Creating Tracking Links
Write the event dictionary first. If marketing, sales, and engineering use different meanings for "lead" or "activation," the dashboard will look precise while answering the wrong question.
A useful combined event dictionary might contain these events:
|
Event |
Trigger |
Counting rule |
Business role |
|
channel_join |
Membership update confirms a user joined through a tracked link |
One acquisition join per user and channel |
Subscriber acquisition |
|
channel_leave |
Membership update confirms the user left |
One state change per valid update |
Churn and retention |
|
bot_start |
Backend receives /start <token> or an untagged /start |
One first start per user, plus separate raw restart events if useful |
Acquisition |
|
onboarding_complete |
User completes the last required onboarding action |
Once per onboarding version |
Activation |
|
lead_submitted |
Backend accepts a complete lead form |
Once per valid submission ID |
Lead volume |
|
lead_qualified |
CRM applies the agreed qualification rule |
Once per lead after status validation |
CPL optimization |
|
purchase_success |
Payment provider or Bot API confirms payment |
Once per transaction ID |
CPA or ROAS optimization |
|
refund |
Provider or Bot API confirms a refund |
Once per refund ID |
Net performance |
Do not count a message sent by the bot as proof that the user viewed it. Do not count a CTA click as a submitted lead if validation or delivery can fail. Telegram's Bot API exposes successful_payment and refunded_payment service messages for supported bot payments, but an external checkout should use the payment provider's confirmed server event.
Choose one primary conversion for each campaign. A lead-generation campaign might use lead_qualified; a self-serve product might use purchase_success; an early test with little sales volume might use onboarding_complete as a temporary optimization event. Keep downstream quality as a guardrail even when the primary event is higher in the funnel.
Build Deep Links With Compact Start Parameters
Telegram supports bot deep links in this form:
https://t.me/your_bot?start=<parameter>
The official Telegram bot features documentation allows A-Z, a-z, 0-9, _, and - in the parameter, with a maximum length of 64 characters. Telegram recommends base64url when binary or other structured content must be encoded. The Telegram Ads Guidelines also explicitly allow start parameters in links to destination bots.
Avoid placing a full UTM string, email address, Telegram user ID, or readable customer data inside the parameter. Use a short opaque token and keep the campaign details in your own mapping table.
Ad link: https://t.me/acme_demo_bot?start=k7P3xQ2Server-side mapping:k7P3xQ2 -> source=mangoadscampaign=q3_demo_uscreative=benefit_aplacement=saas_channels_02
This design stays within the character limit, avoids exposing business metadata in a forwarded URL, and lets the team correct labels without changing the live link. Use a new token whenever the reporting dimension must remain separable. If two creative variants share one token, no later query can recover which creative produced the lead.
For a Mini App, Telegram supports a startapp parameter and passes it to the app as start_param and tgWebAppStartParam, according to the official Mini Apps documentation. Keep the same token dictionary across bot and Mini App entry points so campaign reporting uses one naming system.
Capture a Bot Start Without Losing Attribution
Opening a bot link is not yet a bot start. The user normally has to press the Start button, after which the bot receives a command such as: /start k7P3xQ2
That difference matters. A deep-link click can abandon before the command reaches your backend. Count bot_start only after receiving the Telegram update, not when generating or redirecting the link.
When the update arrives, the backend should:
- verify that the message is a valid private-chat /start command;
- parse and validate the token against the campaign mapping table;
- create or update the internal user record;
- preserve the original acquisition touch;
- record the current touch and a timestamp;
- emit an idempotent bot_start event;
- send the correct onboarding version.
A minimal event record can look like this:
event_id: tg_update_93844102event_name: bot_startoccurred_at: 2026-08-21T14:03:11Zinternal_user_id: usr_81c7telegram_user_id: [stored securely]acquisition_token: k7P3xQ2onboarding_version: v3
Keep first_touch_token and latest_touch_token as separate fields. A returning user may open a later campaign link and trigger /start again. Overwriting the first touch destroys acquisition history; ignoring every later touch hides re-engagement. Store both, then apply a documented attribution rule in reporting.
Telegram can retry unsuccessful webhook deliveries. Its Bot API documentation says update_id can be used to ignore repeated updates and offers a webhook secret_token for request verification. Make event writes idempotent, because a retry should not create a second lead or purchase.
Instrument the Onboarding Sequence as a Funnel
The start count shows acquisition, not value. A bot can attract many starts and still fail because the welcome message is unclear, the first question asks too much, or the handoff to a human breaks.
Track only milestones that help diagnose a decision. For a B2B demo bot, the sequence could be:
bot_start-> value_proposition_selected-> business_email_validated-> company_size_submitted-> lead_submitted-> lead_qualified-> demo_booked
For an ecommerce or digital-product bot, the sequence might be:
bot_start-> product_viewed-> checkout_started-> purchase_success-> refund
Attach campaign_id, creative_id, placement_id, onboarding_version, and occurred_at to each event through the user's stored acquisition record. Do not ask the user to carry the token through every step.
Track step completion when the backend accepts the action. If a user submits an invalid email, record a validation failure for product diagnostics but do not count a lead. If a sales representative later disqualifies the submission, retain lead_submitted and add the separate lead_disqualified status. This preserves the difference between media quality and sales qualification.
The onboarding itself should reveal value quickly. Ask only for information needed to deliver the next step or qualify the lead. A long questionnaire may produce fewer leads and higher CPL while improving sales quality. Compare both funnel volume and the qualified or purchased outcome before deciding that shorter is always better.
Join Ad Delivery, Subscriber, Bot, and CRM Outcomes
No single source owns the entire funnel. Build the report from three layers:
|
Data layer |
Typical fields |
Source of truth |
|
Media delivery |
campaign, creative, placement, spend, impressions, clicks when available |
Telegram Ads, MangoAds, publisher report, or another buying platform |
|
Audience and product behavior |
invite-link ID, channel join or leave, bot start, onboarding events, internal user ID, timestamps |
Channel administrator bot, bot backend, or Mini App backend |
|
Business outcome |
lead status, booking, order, revenue, refund |
CRM, billing system, or payment provider |
Join aggregated media data to the invite-link or token mapping by campaign, creative, placement, and reporting period. Join user-level channel, bot, and CRM data with your own internal identifiers. Do not assume that an aggregated Telegram Ads result can always be matched to individual users.
The official Telegram Ads statistics page reports views and the number of users who joined a channel or started a bot after viewing the sponsored message. Use that figure as the platform's attributed result. Use membership updates as the count of joins confirmed through your tracked links and your bot backend as the count of starts it actually received. The totals can differ because definitions, attribution windows, time zones, filtering, forwarded links, missing tokens, and buying routes differ.
Reconcile the systems daily during a new launch:
- compare spend and impressions with the buying dashboard;
- compare platform-attributed joins with tracked invite-link joins;
- report invalid, missing, and unknown tokens separately;
- check delayed CRM updates before closing a cohort;
- keep refunds and duplicate suppression visible.
Do not silently force the totals to match. A discrepancy is a diagnostic signal.
Calculate CPS, Cost per Start, CPL, and CPA
Use unique, validated conversions for the same spend period or acquisition cohort.
CPS = Ad spend / Unique attributed channel joins
Cost per bot start = Ad spend / Unique attributed bot starts
Onboarding completion rate = Unique onboarding completions / Unique bot starts x 100%
Lead rate = Unique qualified leads / Unique bot starts x 100%
CPL = Ad spend / Unique qualified leads
CPA = Ad spend / Unique target actions
Suppose a hypothetical campaign spends $1,200 and produces:
- 200,000 impressions;
- 960 unique attributed bot starts;
- 576 onboarding completions;
- 72 qualified leads;
- 9 new customers.
The results are:
Cost per bot start = $1,200 / 960 = $1.25
Onboarding completion rate = 576 / 960 x 100% = 60%
Lead rate = 72 / 960 x 100% = 7.5%
CPL = $1,200 / 72 = $16.67
Customer CPA = $1,200 / 9 = $133.33
These numbers are a calculation example, not Telegram benchmarks. If the buying route does not expose reliable clicks, do not invent CTR, CPC, or click-to-start rate. Optimize with the stages you can verify.
Use the same cost and conversion scope. If spend includes three placements but the lead query includes only two tokens, CPL is wrong. If customers convert 20 days after starting the bot, use acquisition cohorts and wait for the agreed window to mature. The MangoAds guide to CPC and CPM explains the upstream cost math, while the A/B testing guide shows how to compare variants without changing several conditions at once.
Choose and Document an Attribution Rule
Attribution is a reporting rule, not an observable law. A user may see an official sponsored message, click a channel post later, reopen the bot from search, and buy after a sales call. Your data can record several touches, but the campaign report still needs one declared method.
Common choices include:
- first touch for measuring original acquisition;
- last paid touch for deciding which recent campaign receives credit;
- cohort reporting, where every later outcome stays attached to the user's first attributed start;
- multi-touch analysis for investigation, kept separate from finance totals.
For campaigns that send users to a bot, preserve first touch permanently and store every later paid touch. For channel growth, keep the original invite-link cohort even if a member leaves and later rejoins. Use first-touch cohorts for acquisition cost and retention, then add a last-paid-touch view for campaign optimization. State the attribution window, time zone, conversion status, rejoin rule, and refund treatment beside the report.
A simple documented model is more useful than a complex model nobody can reproduce. Start with one finance view and one optimization view. Add multi-touch analysis only when the event volume and decision value justify the extra maintenance.
Sara Al MansooriAdTech Strategist at MangoAds.
Use Telegram Pixel Where a Website Is Part of the Journey
If your approved buying route sends traffic to a website and your account exposes Pixel controls, use the pixel to measure the browser stage. The implementation pattern is familiar:
- create the pixel or event source in the available Telegram Ads interface;
- place the base code according to the current account documentation;
- fire the conversion event only after the website confirms success;
- associate the eligible event with the relevant ad where the interface allows it;
- test in a browser and check the event status before spending.
Do not fire a lead event on the form button alone. The button can be clicked while client validation fails, the network request times out, or the backend rejects the submission. Trigger the event after the server confirms the lead, or load a unique success state that appears only after acceptance.
Keep your own website analytics and backend records. Browser pixels can be blocked, delayed, duplicated, or prevented by consent choices. The pixel dashboard and CRM therefore answer related but different questions. Telegram's bot developer terms also require an accessible privacy policy, data minimization, appropriate retention, deletion handling, and secure storage. Review the rules that apply to your markets and implementation rather than treating this guide as legal advice.
For a Mini App, use the startapp token and validated server events as the durable attribution layer. A Mini App uses web technology, but do not assume that every website pixel or consent setup behaves identically inside Telegram's webview. Test the actual clients, account permissions, and event delivery before launch.
QA the Entire Path Before Buying Traffic
Run a test matrix across mobile, desktop, new users, and returning users. Telegram's ad rules require destination bots to respond properly on mobile and desktop, so measurement QA should cover both experience and data.
|
Test |
Expected result |
|
Join through a tracked channel invite link |
One attributed channel_join is stored with the correct invite-link ID |
|
Leave and rejoin the channel |
Original acquisition remains; membership history records both state changes |
|
Open valid tagged bot link as a new user |
Start button appears; one attributed bot_start is stored after it is pressed |
|
Open the same link twice |
Raw restart may be logged; unique acquisition start is not duplicated |
|
Open a second campaign link as a returning user |
First touch remains; latest touch updates according to policy |
|
Use an invalid or expired token |
Bot still works; event goes to an explicit invalid_token bucket |
|
Complete onboarding |
Each milestone appears once and in the correct order |
|
Submit invalid lead data |
Validation error is logged; no qualified lead is created |
|
Complete payment or refund |
One transaction event is stored; refund updates net results |
|
Retry the same webhook update |
Idempotency prevents duplicate events |
|
Reconcile the dashboard |
Spend, starts, leads, and customers use the same date and token scope |
Also test untagged paths. Users can find a channel or bot through search, shares, profile links, or old messages. Record those joins and starts as organic, direct, or unattributed according to a fixed rule. Never assign them to a paid campaign simply because that campaign was active.
Turn Conversion Data Into Campaign Decisions
The most useful report is a funnel by campaign, creative, placement, and acquisition date. Read it from the bottom up.
- High cost per start can point to weak creative, poor placement fit, or expensive delivery.
- Low CPS with high 24-hour churn points to a mismatch between the ad promise and the channel experience, or to low-quality traffic.
- Similar CPS with different 7-day retention favors the source that produces the stronger retained cohort.
- Healthy start volume with low onboarding completion points to the bot experience or a mismatch between ad promise and first screen.
- Strong onboarding with weak qualification suggests the questions or targeting admit low-intent users.
- Good CPL with poor customer CPA shifts attention to lead quality, sales follow-up, pricing, or product fit.
Change one major variable at a time and preserve its token. The article on how to run Telegram ads compares official, manual, and automated buying routes. If you buy direct placements, also vet inventory before scaling; clean conversion tracking cannot repair fabricated reach or an irrelevant audience.
MangoAds distributes CPM ads across matched Telegram channels. It does not place ads inside Telegram bots. If an ad sends users to your channel or bot, connect MangoAds delivery records to your invite-link map, bot event log, and CRM outcomes. MangoAds supplies channel placement and top-of-funnel reporting; your membership, bot, and business systems supply the conversion truth needed for CPS, CPL, and CPA decisions.



