Tracking Links and Clicks: Every Visit, Measured
The tracking link is the front door of your funnel. Every paid visit passes through it, picks up a click id in milliseconds, and everything that happens later - the Start tap, the registration, the deposit - attaches to that id. If clicks are captured sloppily, nothing downstream is fixable: this is the money layer of the whole setup.
What a tracking link is
Every campaign gets a personal brandless hostname the moment it is created: a random eight-character subdomain on a neutral domain, so your ad URL carries no tracker branding (a moderation-friendly detail). Any path on that host resolves to the same campaign, and the classic /r/campaign_id URL keeps working as a permanent fallback for older ad creatives. Grab the link on Campaigns: the Tracking URL column shows the hostname with copy and open buttons; copying fetches the canonical URL from the server ("Tracking URL copied").
What a click captures
- sub1-sub5 and ref_id query params, capped at 255 characters each - put your creative, adset, source labels or an external tracker's id there. A click is never rejected for a long param; anything past the limit just gets truncated.
- Platform click ids:
fbclid(Meta),gclid,gbraidandwbraid(Google, including iOS-privacy traffic that skips gclid),ttclid(TikTok) - these are what later let server-side conversions match the ad click. - User agent, captured on every click. Geo is meant to be a two-letter country code, but it depends on an
X-Geo-Countryheader that production doesn't currently set, so in practice the geo column comes back empty - treat it as not populated yet rather than something wrong with a specific campaign.
sub4, sub5, ref_id and the platform click ids don't show up in the Clicks table or the CSV export - those only surface sub1-sub3. To confirm a click actually captured an fbclid or a gclid, check it downstream instead: postback URL templates accept {sub4}, {sub5}, {platform}, {fbclid}, {gclid}, {gbraid}, {wbraid} and {ttclid} as macros, and they resolve from whatever the click actually recorded.
The redirect itself is a 302 built around a sub-10ms budget - the click row is written asynchronously so the visitor never waits on the database. If the campaign has a Redirect URL, the visitor goes straight there with {click_id} and {campaign_id} substituted; otherwise they land on the hosted page, where tapping through opens Telegram with the click id folded into the bot's start link. Only active campaigns accept clicks: a paused or archived campaign answers 404 and no click is recorded.
Working the Clicks page
- Open Clicks. The Unique counter shows the volume under your current filters.
- Narrow the set with the status and campaign filters and a UTC date range; search covers ID, campaign, sub1 and geo.
- Filters live in the URL, so copying the address bar hands a teammate the exact same slice - "campaign X, FTDs, last week" becomes a link instead of a set of instructions.
- Table columns: Created, Campaign (shown by name), Sub1-Sub3, Geo, Status. Pagination: 25/50/100 rows or All.
The status filter lists Clicked, Landed, Started, Lead, Deposit and FTD. Registered is a real step in the funnel below, but there's no filter chip for it yet - export the CSV and filter the status column if you need to isolate it.
Click statuses
A click walks the funnel: Clicked → Landed → Started → Registered → Lead → Deposit → FTD. Status only moves forward - a late or duplicate event can never downgrade an FTD back to Lead. Statuses advance from events: fire them from a flow's event nodes, or report them server-to-server through the events API.
CSV export
Export CSV pulls every row matching the current filters, not just the visible page, with columns id, campaignId, sub1-sub3, geo, status, createdAt. Handy for pivoting spend against FTD by sub1 in a spreadsheet.
Common pitfalls
- "The link suddenly died." Check the campaign status first - pausing or archiving makes the link answer 404 immediately, by design.
- Truncated sub params. Anything beyond 255 characters per param is cut and the click still goes through - keep labels compact.
- Rate limit while testing. The click endpoint allows 60 requests per minute per IP; hammering it from one machine returns 429 and says nothing about real traffic.
- Search vs. filters. The search box only filters rows already loaded on the page; status/campaign/date filters query the server. On big accounts, filter first, then search.
- Empty geo column. Country capture isn't wired up on production yet, so the geo field on clicks and in the CSV export comes back blank - that's expected right now, not a per-campaign issue.
- Bridging to an external tracker. If clicks bounce onward to Keitaro or similar, put
{click_id}into the campaign's Redirect URL so you can send the conversion back later.