Telegram-боти й канали: одне підключення - повна атрибуція

У Telegram-трафіку бот - це міст атрибуції. Сам по собі клік по рекламі - просто редирект: щойно бота підключено, Leadgram точно знає, який клік натиснув Start, з якої кампанії прийшов підписник, і може передати ці конверсії в Meta або Google, щоб алгоритм закупівлі приводив вам більше користувачів, які реально доходять до конверсії. Десять хвилин налаштування тут роблять вимірним кожен долар спенду потім.

Додавання бота

  1. Відкрийте @BotFather у Telegram, надішліть /newbot і скопіюйте API-ключ, який він поверне (виглядає як 110201543:AAHdqTcv...).
  2. Перейдіть у Боти і натисніть «Додати бота».
  3. Вставте ключ у поле «API-ключ Telegram-бота» - платформа перевірить токен і сама підтягне @username бота.
  4. Натисніть «Додати бота».

Збереження бота водночас реєструє для нього Telegram-вебхук, тож піднімати сервер чи кудись вставляти URL не потрібно. Бейдж статусу показує, чим ця реєстрація закінчилася насправді: «Активний» означає, що Telegram її прийняв, «Очікування» або «Помилка» - що не прийняв: рядок бота зберігся, але /start до вас не доходить. Неактивний рядок так і пише про це на місці й несе кнопку «Зареєструвати вебхук», яка повторює виклик, - звертатися через це в підтримку не треба.

Щойно вебхук запрацював, Telegram надсилає на нього повідомлення й натискання кнопок, і те й те йде у вашу воронку. Зміни складу каналу та заявки на вступ приходять на той самий вебхук і перетворюються на події channel_join / join_request для тих каналів, які ви відстежуєте, - про це нижче.

Список ботів з бейджем «Активний» і типомСписок ботів з бейджем «Активний» і типом

Як бот атрибутує кліки

Ланцюжок виглядає так: трекінг-посилання кампанії → лендинг → deep-link t.me/your_bot?start=click_id. Коли користувач тисне Start, Leadgram зіставляє payload зі збереженим кліком (підійде і ref_id від зовнішнього трекера), запускає активний флоу, прив'язаний до цього бота, з його першого вузла і записує чат у базу підписників бота. Додайте у флоу вузол події «Старт бота» - і клік перейде в статус «Старт» та піде серверною конверсією. Повторний /start завжди перезапускає воронку з початку - саме так користувачі Telegram і очікують від бота.

Видалення бота

Кожен рядок на сторінці Боти має кнопку «Видалити». Підтвердження перелічує, чого видалення торкнеться, і розблоковується лише після того, як ви заново наберете @username бота, - бо за один раз зсуваються одразу чотири речі:

  • Флоу, «Активні» на цьому боті, падають у «Чернетку» і перестають працювати. Прив'яжіть іншого бота і знову увімкніть їх.
  • Список підписників бота видаляється разом із ним. Пушам на цю аудиторію не буде кому йти, а людина повернеться до списку, лише якщо натисне Start в іншому боті.
  • Канали, які активував цей бот, перестають рахувати вступи. Бейдж «Активний» у них залишиться, тож доки ви не активуєте їх заново іншим ботом, тиша нічим себе не викаже.
  • Кліки, кампанії та пуші лишаються - у них лише очищається посилання на цього бота, тому звіти за минулі періоди зберігають свої цифри.

У самому Telegram бота не чіпають: його токен продовжує працювати, тож бота можна підключити сюди знову - або відкликати токен у @BotFather, якщо він більше не потрібен.

Канали та події вступу

Призначте бота адміністратором каналу - і цей канал з'явиться на сторінці Канали з бейджем «Виявлено». Виявлений рядок поки нічого не відстежує, і цей бар'єр зроблено навмисно: додати вашого публічного бота у свій канал може будь-хто. Натисніть «Підтвердити», щоб почати відстеження, або «Відхилити», щоб прибрати рядок: відхилений канал сам собою більше не спливе, а оскільки він нічого й не відстежував, нічого не втрачається.

Канал можна додати й до призначення бота: кнопка «Не бачите свій канал?» просить «Telegram ID каналу» (від'ємне число, що починається з -100 - знайдіть його через @userinfobot або переславши будь-який пост каналу в @JsonDumpBot), назву і тип. Такий рядок чекає у статусі «Очікування». Призначення бота адміністратором одразу його активує, а кнопка «Активувати» робить те саме на вимогу: перевіряє, що бот справді адмініструє канал, і обчислює канонічний chat id, за яким зіставляються вступи.

Відстежується лише канал у статусі «Активний» і лише через того бота, який його активував. Реальний вступ після цього піднімає подію channel_join: її можна пересилати через Постбеки, а при доставці в Meta вона мапиться на подію Subscribe. Якщо в каналі увімкнено схвалення заявок, спершу піднімається join_request, а channel_join приходить уже після схвалення заявки.

Smart Delay (кнопка «Налаштування» в активного каналу) притримує вступ і зараховує його, лише якщо людина досі в каналі, коли вікно закривається, - це фільтр від тих, хто зазирнув і вийшов. Компроміс, який варто знати до того, як ставити довге вікно: подія йде в рекламний кабінет у момент закриття вікна, а не в момент вступу.

Видалення каналу

Рядки каналів теж мають кнопку «Видалити» з тим самим бар'єром «наберіть заново», тільки тут це Telegram ID каналу. Видалення одразу зупиняє відстеження вступів і стирає запис про тих, хто вже вступив. Додасте канал знову - і людина, яка вступила раніше, може бути зарахована як нова конверсія і повторно відправлена в рекламний кабінет (per-user дедуп CAPI, якщо увімкнений у кампанії, повтор подавить). Білінг пам'ятає підписників на рівні організації, тому повторного списання за ту саму людину не буде. Кампанії, що посилалися на канал, продовжують працювати і лише втрачають посилання, уже записані конверсії лишаються у звітах, а налаштування Smart Delay зникає разом із рядком. Сам рядок теж не повернеться: ваш бот уже адміністратор, тож нової події про призначення Telegram не надішле.

Залив на заявку в закритий канал

Якщо закритий канал приймає за заявкою, цільовою дією кампанії може бути сама заявка, а не вступ: людина натискає «Подати заявку» і потрапляє в канал пізніше, коли заявку схвалять. Leadgram рахує це двома різними подіями: заявку - join_request, вступ - channel_join.

Щоб заявка взагалі записалася, потрібні дві речі. Перша - канал у статусі «Активний»: заявки рахує лише той бот, який його активував. Друга - людина, що пройшла через бота за вашим трекінговим посиланням. Сама заявка кліка не несе, Telegram надсилає в ній тільки акаунт людини, тому клік шукається за її недавнім проходом через бота: за запуском флоу або за /start у бота без флоу, не старшим за вікно атрибуції (за замовчуванням 7 днів). Хто прийшов у канал за прямим посиланням-запрошенням, оминувши бота, до жодного кліка не прив'язується: події не буде взагалі, а на сторінці Доставка конверсій виросте рядок «Заявка на вступ» у блоці «Дропи без атрибуції».

Автосхвалення заявок

Налаштування «Автосхвалення заявок» живе в «Налаштуваннях» активного каналу, поруч зі Smart Delay, і за замовчуванням вимкнене. Вимкнене - означає, що заявки висять, доки адмін не схвалить кожну руками в Telegram; до цього моменту людина в канал не вступила, channel_join не піднімається, і конверсії «вступ» не буде ні у звітах, ні в рекламному кабінеті, ні в постбеку. Саме так виглядає воронка, де заявок багато, а вступів майже немає.

Увімкнене автосхвалення схвалює заявки за вас. Поле «Затримка, секунд» приймає ціле число від 0 до 86400 (86400 - це 24 години), де 0 - схвалювати одразу, а будь-яке інше значення - через стільки секунд після заявки. Схвалює лише активаційний бот каналу, і йому потрібне адмін-право «Додавання підписників»: без нього Telegram відмовляє, заявка лишається висіти, і на екрані про це нічого не з'явиться - перевіряти доведеться в самому Telegram.

Дві речі варто знати заздалегідь. Заявка стає в чергу на схвалення раніше, ніж система шукає для неї клік, - схвалять і того, чию заявку не вдалося ні до чого прив'язати. А вимкнене посеред затримки автосхвалення скасовує те, що ще не схвалене: перед кожним схваленням налаштування каналу перечитується, і «вимкнено» перемагає.

Що йде назовні й за що списують

Заявка і вступ - різні події з різними назвами й різним часом, тому при схваленні назовні підуть обидві. У правилі Постбеків заявка стоїть у списку тригерів поруч зі вступом, тож у свій трекер її можна віддати окремим рядком - і не чекати вступу, якого при ручному схваленні може й не бути. Дедуплікація їх не плутає: за замовчуванням вона вимкнена і в правилі постбека, і в кампанії, а режими «Один раз на користувача» та «Один раз на користувача на джерело» тримають тип події частиною ключа. У режимі «Будь-який тип події - один раз на користувача» заявка вступу теж не заважає, але в правилі та в кампанії з різних причин. Правило постбека спрацьовує на одному типі події, тому заявка і вступ завжди лежать у різних правилах і за один ключ не сперечаються: там цей режим працює так само, як «Один раз на користувача», і правило може придушити лише повтор своєї ж події. У кампанії спільний ключ справжній - він один на людину на всю кампанію, незалежно від події, - і заявку з нього виключено. Інакше вона зайняла б ключ і придушила вступ тієї самої людини, а кампанія, оптимізована на вступи, почала б отримувати заявки. Плата за цей виняток прийнята свідомо: у кампанії повторна заявка тієї самої людини піде повторно, бо придушувати її більше нічим. Як кожна з двох подій виглядає на боці площадки, описано в Meta CAPI та Google Ads CAPI.

Заявка безкоштовна: join_request лежить у тому самому списку безкоштовних типів, що й клік, відкриття лендингу та скасування підписки. Платите ви за людину, а не за подію - списання відбувається один раз на пару (ваша організація, людина), на її першій платній події, зазвичай на старті бота або на самому вступі. Тому ланцюжок «заявка → схвалення → вступ» коштує одне списання, а заявки, які ніхто не схвалив, не коштують нічого.

І те, чого заявка не робить: вона не зсуває статус кліка - і вступ, до речі, теж, - тож у списку Кліків людина лишиться в тому статусі, до якого дійшла раніше, а сама заявка видна в історії подій цього кліка. Smart Delay на неї не діє: утримувати нічого, у канал людина ще не вступила, вікно Smart Delay стосується лише вступу.

Де боти трапляються у продукті

  • Флоу - флоу можна створити без прив'язаного бота, але перш ніж перевести його в статус «Активний», бот знадобиться. Селектор бота в діалозі створення флоу показує ботів, доданих тут.
  • Кампанії - бот кампанії проставляється на кожен клік, щоб зіставлення за /start спрацьовувало надійно.
  • Пуші - список отримувачів - це підписники, яких бот зібрав через Start. Із цього списку випадає будь-який чат, якому Telegram відмовився доставити, а таких результатів чотири: людина заблокувала бота, акаунт видалено, діалогу не було ніколи і бота вигнали з групи. Повернути в список може лише новий /start із того самого чату, тому видалений акаунт не повернеться ніколи, а вигнана група - навіть після того, як адмін поверне туди бота. Розбір усіх чотирьох - у гайді Пуші.

Поширені помилки

  • Токен відхилено. Копіюйте ключ від BotFather повністю: цифри, двокрапку і 35-символьний хвіст. Неповна вставка миттєво провалює валідацію.
  • Бот мовчить на Start. Дві різні причини дають однаковий симптом. Найчастіше бот відповідає, лише коли до нього прив'язано флоу зі статусом «Активний» - немає активного флоу, апдейт ігнорується за задумом. Друга причина - вебхук, який так і не зареєструвався: тоді бейдж показує «Очікування» або «Помилка» замість «Активний», а на самому рядку є кнопка «Зареєструвати вебхук» для повтору.
  • Старти без атрибуції. Користувачі, що відкривають бота за username, минають трекінг-посилання, тож у payload немає click id. Весь платний трафік ведіть тільки через трекінг-URL кампанії.
  • Канал застряг на «Очікуванні». «Очікування» означає, що бота ще не підтверджено як адміністратора цього каналу. Призначте його в Telegram або натисніть «Активувати» на рядку і оберіть бота. Доки канал не «Активний», жоден вступ не відстежується.
  • Тестування на живому боті. Тримайте окремого бота для експериментів із флоу. «Живим» бота робить лише те, що на нього вказує реклама, - другий бот, якого немає в жодній кампанії, безпечна пісочниця: зламаний тест ніколи не зачепить живий трафік.
  • Видалення бота нашвидкуруч. Підтвердження недарма перелічує всі наслідки - прочитайте їх до того, як наберете username. Найчастіше пропускають одне: канали, які активував цей бот, продовжують показувати «Активний», нічого при цьому не рахуючи.