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.

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, gbraid and wbraid (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-Country header 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

  1. Open Clicks. The Unique counter shows the volume under your current filters.
  2. Narrow the set with the status and campaign filters and a UTC date range; search covers ID, campaign, sub1 and geo.
  3. 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.
  4. 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.

Clicks table with filters and status columnClicks table with filters and status column

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.