Telegram Conversion Tracking
Set up Telegram conversion tracking in one guided flow: per-visitor invite links, join matching, hourly link health checks, and CSV export for Meta.
Telegram conversion tracking turns a Telegram channel join into a conversion your Meta ads can be optimised for. Ott gives every visitor their own invite link, matches the join back to the ad click behind it, sends the conversion to Meta through the Conversions API, and tells you when a link stops working.
Overview
Telegram conversion tracking gives you:
- Channel join tracking: a join through one of your tracking links is recorded against the click that produced it.
- Per-visitor invite links: every visitor gets their own named invite link, instead of one shared public link.
- Meta Conversions API: each join is sent to Meta as a conversion event through the pixel on the link, so Meta can optimise for the people who join.
- Automatic detection: Telegram tells Ott about joins as they happen. There is nothing to click to record one.
- Link health: Ott checks every link once an hour and raises a problem when tracking stops working. See Link health.
Before you set up
You need:
- A workspace where you can manage clients and brands.
- A Telegram bot. You create it yourself with @BotFather, or use one you already have.
- A Telegram channel, and the rights to add an administrator to it.
- A domain or subdomain whose DNS records you can edit, for example
track.yourbrand.com. Your tracking links live on it. - The Pixel ID and a Conversions API access token from the Meta dataset you want the joins reported to.
A link can send its conversions with its own access token, so Telegram tracking does not need a Meta account connected to your workspace. If your workspace does have one, Ott can use that connection instead.
Set up Telegram tracking
Setup is one guided flow: open Connect → Telegram tracking → Setup. It walks you through seven steps, in this order.
- Client — the client the campaign is for.
- Brand — the brand under that client whose Telegram channel you are tracking.
- Bot — the Telegram bot that detects joins.
- Channel — the channel people should land in. Ott checks that your bot is in it as an administrator.
- Domain & link — the domain your tracking links live on, and the slug that identifies this campaign.
- Meta — the Pixel ID and Conversions API token the joins are reported with.
- Launch — Ott saves the link and gives you the URL to put in your ad.
Your progress is saved as you go: leave the flow and reopen it, and it starts on the first step you have not finished.
Creating the bot with BotFather
If you do not have a bot yet, create one in Telegram:
- Open a chat with @BotFather and send
/newbot. - Give the bot a name.
- Give it a username that ends in
bot, for exampleyourbrand_tracking_bot. - Copy the bot token BotFather replies with.
- In your channel, open Administrators → Add administrator and add the bot, with permission to invite users.
- Back in the setup flow, wait for the Bot is in the channel as admin check to go green.
Adding the DNS records
The Domain & link step shows the records to add at your domain provider. DNS changes usually take 5–15 minutes, and Ott re-checks the domain while you wait. If you use Cloudflare, set the record to DNS only — a proxied record often breaks the redirect.
Put the link in your ad
The Launch step gives you your tracking link. It looks like this:
yourdomain.com/t/[slug]
- Use it as the Website URL of the ad, at ad level.
- Meta appends the click ID to it automatically. Do not add anything to the URL yourself.
- At campaign level, set the optimisation goal to Leads or Sales and the conversion location to Website.
Visitors who reach your channel through anything other than this link cannot be attributed to an ad.
How it works
The visitor's journey
- Ad click — someone clicks your Meta ad. Its destination URL is your tracking link, and Meta has appended the click ID to it.
- Tracking link — the visitor lands on your domain at
/t/[slug]. - Invite link — Ott creates a fresh, named Telegram invite link for that visit and sends the visitor to Telegram with it.
- Join — the visitor joins your channel.
- Conversion — Ott matches the join back to the visit and sends a conversion event to Meta.
- Attribution — Meta resolves the click ID to the campaign, ad set and ad that produced it.
What Ott stores with a click
- The click ID Meta added to your tracking link.
- Any UTM parameters you put on the ad's destination URL.
- The URL the visitor came through, their IP address and their user agent.
- The name and expiry of the invite link created for that visit.
Invite links
Every tracking link hands each visitor their own Telegram invite link.
- Named. Each link Ott creates has its own name, and Ott keeps that name on the visit it was created for. The join comes back carrying the name Telegram sends, so it points at one exact link and one exact click — which is why a forwarded link no longer keeps bringing people in, all credited to the first click.
- Short-lived. A link expires 72 hours after the click that created it.
- Single-use. A standard link works for one person, and only once. If that person joins, leaves, and taps the same link again, the link is spent — every new tap on your tracking link mints a fresh one.
- Join-request channels work differently. When a channel uses join requests, the link is named and expires like the rest but is not limited to one person: Telegram does not allow a member limit together with a join request. The moment somebody taps Request to Join is the signal Ott attributes. Join requests are recommended for private channels.
- Telegram's link previews share one link. The link used for previews has a name and an expiry, but it is not single-use.
Invite links created before links were named and expiring are being revoked in the background, so an old forwarded invite link stops working too.
Link health
Tracking rarely breaks loudly. It stops quietly, and the numbers just look wrong. Ott checks every Telegram link once an hour, and when one of these five things is true it opens a problem:
- Conversions are not reaching Meta — a join has been waiting to be sent to Meta long enough that it is missing from what Meta has counted so far.
- Meta is rejecting conversions — Meta sent conversions back as failed rather than accepting them, so the joins behind them were never counted.
- No way to send conversions — this link has visits but no Conversions API token of its own, and the workspace has no working Meta connection to fall back on.
- Visits are not turning into joins — real traffic and no joins, or a join rate far below what that link usually converts.
- Landing page visitors are not reaching Telegram — landing-page views with no click-through to Telegram, measured against that link's own usual rate rather than a fixed number.
Open problems appear on one card at the top of Analyze → Telegram, titled "N links need a look". Each row names the problem, the link, the brand and the date it was first seen, with a button that opens that link. A healthy workspace sees no card at all. The card reports the state right now, so it ignores the date range you have selected.
This is detection and visibility: Ott does not email or message you about a link problem yet.
Export a brand's numbers
Open Analyze → Telegram, then open a brand. The Export menu in the page header downloads the period you are looking at as CSV. These are the three exports it lists, in the app's own words:
- Invite links — Every link Ott handed out (the visits on this page), with who joined through it.
- Joins — Telegram user IDs of everyone who joined: through Ott links (the Members on this page) and through other links.
- Joins with usernames and first names — Same as Joins, plus usernames and first names. Personal data: share it only with the brand. This export is available to workspace owners and admins only.
An export covers the period on screen, up to 93 days. A longer period is refused rather than shortened: the option is unavailable and the menu says "Pick a period of 93 days or less to export."
The row counts match the page. Invite-link rows are the Visits the page counts, and joins through Ott links are its Members. Every export is rate-limited and logged.
Conversion events
Event types
Each link has an event type, which decides what a join is reported as:
- CompleteRegistration — the default.
- Lead
- Subscribe
- Contact
A join-request channel sends Lead when the request arrives, and CompleteRegistration when it is approved. A standard channel sends CompleteRegistration when the person joins.
Event data sent to Meta
- Event name — the event type above.
- Event time — when the conversion happened, not when it was sent: the join, the join request, or its approval.
- Click ID — captured at click time, the same value the page view sends.
- URL — the tracking or landing-page URL the visitor came through.
- Telegram user ID — a hashed Telegram user id, sent as the identifier Meta matches on.
- Additional matching data — the visitor's IP address, user agent and browser ID.
- Action source — the event is sent as a website action.
Meta rejects a conversion whose event time is more than seven days old, so a conversion older than that is not sent.
Troubleshooting
No conversions are being tracked
- Check link health first. Open Analyze → Telegram. An open problem there names what is wrong, and with which link.
- Check the bot. In Connect → Telegram tracking → Bots, the bot's token must be valid and its webhook active.
- Check the bot is a channel admin. The Bot is in the channel as admin check on the Channel setup step says so directly.
- Check the ad's destination URL. It has to be your tracking link. A plain
t.meinvite link carries no click to attribute. - Check the Meta side. The Pixel ID and access token must belong to the dataset you are looking at, and the link needs a token or the workspace needs a working Meta connection.
Missing attribution
- Use the tracking link. Ott can only attribute a join when it handed the visitor the invite link itself.
- Leave the URL alone. Meta appends the click ID to the destination URL; you do not need to add anything.
- Wait for the send. Ott queues a conversion and sends it automatically, retrying a few times if Meta's API is unavailable. Nothing has to be triggered by hand.
- Mind Meta's window. A conversion whose event time is more than seven days old is not sent.
Bot not detecting joins
- Add the bot to the channel. It has to be an administrator with permission to invite users.
- Check the webhook. The bot's page reports whether the webhook is active, and joins are not detected without it.
- Check the channel. The channel the visitor lands in has to be the one the link is set up for.
- Test it yourself. Click your tracking link, join through the invite link it gives you, and watch the brand's page for the visit.
Best practices
- One tracking link per campaign. Each link belongs to one brand. If you run Telegram for several brands, give each its own link so joins land under the right client.
- Use join requests for private channels. The request itself is the signal Ott attributes.
- Let Ott watch the links. The hourly check runs whether or not you are looking; open the card when it appears.
- Test before you launch. The Meta step can send a test conversion; confirm it under Test events in Meta Events Manager.