Your Meta ads send traffic to a Telegram channel, and the channel grows. With a single invite link for the whole campaign, every new member looks like every other: nothing says which ad, which ad set or which creative brought them in. And when that member eventually signs up with a broker, the ad platform knows nothing about it.
Why a shared invite link erases the source
A Telegram invite link tells you that someone joined the channel through that link. It says nothing about the click that came before it. If a thousand people click on three different ads and all arrive through the same link, Telegram shows you a thousand joins through one link.
The click, on the other hand, carries a lot of information when it arrives: the fbclid, the UTM parameters, the ad IDs. But the join happens afterwards, in the Telegram app, outside the page, outside the browser. Between the two, the connection is broken. Creating one link per ad set narrows the problem without solving it: you know which ad set brought the member, not which click, and you still do not have the fbclid to send back to Meta.
One single-use invite link per click
ScaleGram gives every ad click its own Telegram invite link. The link is created with a limit of one use (member_limit 1). When someone joins the channel through that link, the link used points to a single click, and therefore to a single ad, a single ad set and a single campaign.
It is a direct join link, not a join request. The visitor joins the channel without an admin having to approve a request. The flow stays the one users already know: they click, Telegram opens, they join.
The redirect and the link pool
The link placed in the ad does not point straight to Telegram. It goes through a ScaleGram redirect, in the form /go/ followed by the campaign ID. That redirect assigns an invite link at the moment of the click, then sends the visitor on to Telegram.
A redirect has to be instant. It cannot wait for the Telegram API to create a link. Links are therefore created in advance, in a pool specific to each campaign. The pool keeps at least 20 free links and at most 300. Between those bounds, it follows traffic: roughly twice the number of clicks in the last hour. It is topped up every 20 seconds.
If the pool is empty when a click comes in, the visitor is not blocked. They receive the campaign's shared link. Their join is then attributed to the campaign, not to the click: you know which campaign they came from, but not which ad or ad set, and their fbclid is not attached to their join.
A link assigned to a click but never used is revoked after 72 hours, the default value. Dormant links do not stay open indefinitely.
Several common cases are handled so that a link is not wasted or shared by mistake. Link-preview bots, such as facebookexternalhit, TelegramBot or WhatsApp's, do not consume a link. A double click or a back-navigation on the same click returns the same link. Two simultaneous clicks never receive the same link.
What is recorded at the click
When the redirect assigns the link, ScaleGram records the click data:
- the fbclid and the _fbc and _fbp cookies
- the UTM parameters
- the ad, ad set and campaign IDs
- the sub1 to sub5 parameters
- the device type and the country
If the _fbc cookie is missing, the fbc parameter is rebuilt from the fbclid. The click therefore remains usable even when the cookie was not set.
For Meta, you only need to add the following parameters to the ad URL: ad={{ad.id}}&adset={{adset.id}}&camp={{campaign.id}}. Meta replaces these dynamic values with the actual IDs on each delivery, and they arrive with the click.
Raw IP addresses are deleted after 30 days. Only a salted hash is kept beyond that.
How the channel join is recognized
The ScaleGram bot is what recognizes the join. When a member joins the channel, Telegram sends the bot a chat_member event that contains the link used. ScaleGram finds the click that link had been assigned to and attaches the new member to that click.
To receive this event, the bot must be an admin of the channel, with the right to invite users via link. The same right lets it create the links in the pool.
Departures from the channel are recorded too. You can see who arrived through which ad, and who left again.
From member to deposit: the click follows the lead
Once the join is recognized, the original click, with its fbclid, fbc and fbp, is copied onto the lead. As that lead moves through the pipeline and the next events occur, sign-up and then deposit, those events are sent back to the ad platform with that click. The platform can then connect a sign-up with the broker to the ad that brought the person into the channel, and not just to a visit.
Attribution is first-touch. If a member leaves the channel and later rejoins through a different link, their source does not change: it remains the first click. That choice has a consequence: a re-engagement ad that brings back a former member will not get credit for that second join. Keep this in mind when you compare prospecting campaigns with retargeting campaigns.
Other entry points: the bot and direct messages
The channel is not the only possible entry point. An ad can also send people to the bot or to a Telegram account via direct message, and the level of certainty is not the same.
A link to the bot, in the form t.me/<bot>?start=…, gives an exact match. The start parameter passed to the bot identifies the click without ambiguity.
A link to an account via direct message does not allow that precision. The match is probable: ScaleGram takes the most recent click on the campaign within the 30 minutes before the first message. If two people click a few minutes apart and the first one writes after the second, the attribution can be wrong. At low volume the gap is often negligible; at high, concentrated volume it is less so.
What the per-click link does not track
The system has specific limits, and it is better to know them before reading the numbers.
- A join through the public t.me/<channel> link cannot be tracked. No invite link is used, so no click can be found.
- A join through the campaign's shared link, served when the pool is empty, is attributed only to the campaign.
- A direct-message conversation is attached to a click only on a probable basis, within a 30-minute window.
- A per-click link not used within 72 hours, by default, is revoked: a visitor who finds it later will no longer be able to join through it.
Ad tracking is also an option that is enabled per workspace. Until it is enabled, none of these mechanisms work.
The most common limit remains the public link. If your channel is public, some members will find it by its name, through a share or through a creative that shows the channel's @ handle, and will join without going through an invite link. Those joins will have no source. The total of attributed members will therefore always be lower than the channel's total membership, and that gap should not be spread arbitrarily across your ads to make the numbers match.