Campaigns and Funnels: Structure That Shows the Money

A campaign is one traffic stream: its own tracking link, its own pixel and conversion IDs, its own redirect rule. Funnels group campaigns - every setup built around one offer, for example. The point is simple money math: a clean per-campaign split shows which combination prints and which one burns; without it, optimization is guesswork.

Create a campaign

  1. On Campaigns, click New Campaign.
  2. Enter a name - it's used in reports and lists and can be edited later.
  3. Pick the ad platform. It decides which ID field the dialog shows: Meta Pixel ID or Google conversion action ID (numeric). TikTok is in the picker too but disabled (Coming soon) - a TikTok Pixel ID can only be attached later, from the Edit dialog. All optional: a campaign without an ID tracks browser-pixel events only.
  4. Optionally link the campaign to a Funnel, a Bot, and a Channel. Each picker defaults to None, which leaves it unbound. Binding a Bot is worth doing beyond bookkeeping: it becomes the fallback the Telegram webhook uses to match a click when someone opens the bot without the deep-link payload attached, so attribution survives a broken /start link.
  5. Optionally set a Redirect URL (https://, tg:// or t.me). Clicks then skip the hosted landing and go straight there.
  6. Click Create. The campaign is Active immediately: its brandless tracking link is provisioned in the same step and accepts clicks from the first second.

Credentials never live on the campaign. Meta needs a CAPI access token added on Facebook; Google needs no token at all, just the numeric conversion action ID plus Standard access granted to the platform's service account on Google (conversions ship server-side through the Google Data Manager API); TikTok server-side delivery is coming soon. While you type an ID, a live indicator under the field shows whether it matches a connected CAPI account. After saving, a banner repeats the verdict: matched (server-side events will fire) or browser-only.

Lifecycle: pause, archive, unarchive

Each row has an actions menu: Edit, Pause for an active campaign, Activate for drafts and paused ones, Unarchive for archived, and Archive. (Draft is a legacy status no normal flow produces - both the dialog and the API create Active campaigns; it only shows up on rows written straight to the database.) Two things worth knowing:

  • Pause stops traffic for real. The tracking link answers 404 and the click is never recorded, effective immediately, with no caching to wait out.
  • Archive is soft. Existing clicks and attribution stay intact; the link stops accepting clicks. Unarchive returns the campaign to Active.

Editing: multi-platform IDs and redirect macros

The edit dialog shows all three ID fields at once: a campaign can post conversions to Meta and Google in parallel. An empty field removes that platform. The same Funnel, Bot, and Channel pickers from creation live here too; switching one back to None unbinds it. The Redirect URL supports the {click_id} and {campaign_id} macros, substituted on every redirect - the standard way to hand the click id to an external tracker. Unknown {tokens} pass through untouched so the next tracker's macros keep working.

Finding campaigns

Search by name (server-side, debounced as you type) plus a status filter with the default All except archived - archived rows stay hidden until you ask for them. Filters live in the URL, so a filtered view can be shared as a link. The table's Funnel column shows the linked funnel's name, and the Tracking URL column keeps copy and open buttons one click away.

Campaigns list with search and status filterCampaigns list with search and status filter

Funnels: grouping campaigns

  1. Open Funnels and click New Funnel: a name plus an optional description of what the funnel groups together.
  2. The Campaigns column counts non-archived campaigns linked to that funnel. A campaign gets counted here as soon as you set its Funnel picker to that funnel, whether in the create or the edit dialog.
  3. Edit renames a funnel; deleting unlinks, never deletes - attached campaigns keep running without a funnel.

Common pitfalls

  • Google ID mismatch. The conversion action ID on the campaign must match the ID entered on the connected Google CAPI account, or events are not delivered.
  • Browser-only surprise. A pixel ID with no CAPI account behind it means no server-side events. Watch the post-create banner.
  • Redirect URL replaces the hosted landing. The built-in Start deep-link disappears with it - your own lander must carry {click_id} into Telegram, or attribution ends at the click.
  • Edits replace integrations wholesale. Clearing a field removes that platform from the campaign; only blank it if that's what you mean.
  • "My campaign vanished." The default filter hides archived rows; switch the status filter to Archived or All.