How to track Telegram joins from Meta ads
Your ads send people to Telegram, but Ads Manager only sees the click. This guide shows how to give Meta the event it is missing: a confirmed join, tied to the ad that brought it.

Why the pixel stops at the click
The Meta pixel is a piece of JavaScript. It runs in a browser, on a page you control. A t.me link does the opposite: it hands the visitor over to the Telegram app, where no pixel can run.
So Meta records a link click, maybe a page view, and then nothing. It never learns who joined your channel, who changed their mind on the way, or which clicks came from people who don't even have Telegram installed.
That gap matters more than it looks. When a campaign optimizes for link clicks, Meta goes looking for people who click. It has no reason to look for people who join.
What to measure instead
Three numbers tell you what an ad is really worth:
- Clicks on your tracked link, counted by your own redirect rather than by Meta.
- First joins: people who joined for the first time. Someone who left last week and comes back is a rejoin, not a new subscriber.
- Still there after 24 hours, or after 7 days. Paid traffic always brings some people who join and leave a minute later.
Divide your spend by first joins and you get the cost of a new subscriber. That is the number worth bidding on. The math is in Cost per Telegram subscriber.
How join tracking works
Telegram doesn't pass ad data along, so the link has to carry it. The method has three parts.
- The click goes through a tracking link. The link keeps the Meta click ID (
fbclid) and sends the visitor to an invite link for your channel. - Your bot watches the channel. A bot that is an admin of the channel gets an update each time someone joins, and Telegram includes the invite link the person used.
- The join is matched and sent to Meta. The tracker connects the invite link to the click, then sends a server event through the Conversions API with the click ID. Meta credits the conversion to the ad, the ad set and the campaign.
Good to know. Meta expects the click ID in its fbc format: fb.1., then the click time in milliseconds, a dot, and the fbclid value. A raw fbclid on its own matches less often.
A bot sees joins as they happen, but it can't download the member list of a channel. That is why tracking has to be in place before the traffic starts: past joins can't be matched later.
Set it up step by step
- Create a bot with @BotFather and add it to your channel or group as an admin. It needs the right to invite users via link.
- Connect your pixel with a Conversions API access token, which you generate in Events Manager.
- Create one tracked link per ad set, or per ad if you test creatives. One shared link for everything tells you nothing about which ad works.
- Pick one event for a join, such as Lead, and keep it the same across campaigns so Meta keeps learning from the same signal.
- Put the tracked link in the ad as the website URL, and keep the URL parameters Meta adds.
- Test with a real phone. Click the ad, join, then look for the event in Events Manager, where server events are listed apart from browser events.
Mistakes that break attribution
- The bot isn't an admin, or lacks the invite permission. It sees nothing, and every join looks organic.
- Rejoins counted as new people. Your cost per subscriber looks better than it is.
- The event fires at the click. Then Meta optimizes for clicks again, under another name.
- Testing with your own account. After the first try you are a rejoin, and your tests stop showing up as first joins.
- A redirect that drops parameters. If a link shortener or a landing page removes
fbclid, the join is still counted but can no longer be matched to an ad.
Doing it with TrackJoin
TrackJoin creates the tracked links, watches your channels through your bot, and sends each confirmed join to Meta, Google Ads or a postback. A rule can also wait 24 hours and send the event only for people who stayed, so Meta learns from the subscribers worth paying for.

