Друзья, приветствую! Сегодня покажу софтину, которую я написал под вполне конкретную боль: как оптимизировать рекламу в Facebook на факт подписки на Telegram-канал или вступление в группу.
Сколько людей доходит из клика по кнопке до реальной подписки, знает каждый, кто лил на тг. Доходит хорошо если треть. Остальные потерялись по дороге: не захотели ставить Телеграм, отвлеклись, передумали. А фэбэ, если мы льём тупо на преленд и отстреливаем событие пикселя при нажатии на кнопку, фб считает всех кликнувших конверсиями и оптимизируется на них. В итоге алгоритм находит вам людей, которые любят кликать по кнопкам. Любителей подписываться он найти не может, потому что вы ему о них не сообщаете. Да и как о них сообщить?
Сама идея
Идею схемы подал ещё в далёком 2023м Адам в своём тг-канале. См. пост про пролив за подписки, и разбор механики с инвайт-линками вот тут. Вкратце суть там в том, что мы можем отслеживать юзеров, вступающих по инвайт-линку и связывать их с нужным id клика, после чего отправлять постбэк в трекер.
Вариант Адама собирался так: на прокладке ротируются безлимитные инвайт-ссылки, скрипт на Telethon раз в 30 секунд читает админский лог канала, по хэшу ссылки понимает, кто вступил, достаёт из трекера сохранённый fbclid и шлёт событие в ФБ по CAPI. Схема рабочая, но с нюансами, и Адам сам их честно перечисляет: прилка Telegram с сессией на реальном номере, аккаунт должен быть владельцем канала, ротация ссылок на лендинге, возможный разлогин всех сессий.
Мне идея понравилась, а вот возня с Telethon и опросом лога не вдохновила. Я пошёл другим путём и убрал всё это из уравнения: вместо опроса админского лога — вебхук бота-админа, вместо ротации безлимитных ссылок — персональный инвайт на каждый клик, вместо прилки с сессией — обычный бот от BotFather. Встречайте: TG.JoinProof

Как работает связка по шагам:
- Человек кликает по рекламе и попадает в трекер. В моём случае это Yellow TDS, но подойдёт любой, кто умеет принимать постбэки: AIO, Binom, Zeus и так далее.
- Трекер делает редирект на системную ссылку TG.JoinProof, подставляя в неё свой click ID:
https://yourdomain.com/subscribe.php?target=-1003410571937&click_id={clickid} - Система запоминает click ID, создаёт через Bot API персональную инвайт-ссылку на одного пользователя и редиректит человека уже по ней, в Telegram.
- Человек вступает в канал. Бот-администратор канала ловит это событие, система по вебхуку получает апдейт, сопоставляет инвайт-ссылку с сохранённым click ID.
- Система отправляет в трекер постбэк: конверсия, статус lead. Дальше трекер может скормить событие Фейсбуку через CAPI, например через PixelLink. И вуаля: теперь алгоритм учится на тех, кто реально подписался.
Зачем инвайт-ссылки персональные
Тут есть пара приятных мелочей, которые получились сами собой из механики.
Инвайт создаётся с лимитом на одного участника и сроком жизни 24 часа. Как только человек вступил, ссылка сразу отзывается. То есть спарсить вашу рекламную ссылку и, например, налить в канал ботов по ней не выйдет: каждая ссылка умирает после первого использования.
По одному click ID конверсия засчитывается один раз. Если человек прошёл по ссылке второй раз, его отправит на fallback: для публичного канала это обычная ссылка t.me/username, для приватного система заранее создаёт отдельный общий инвайт без отслеживания. Дублей в статистике не будет. И ещё момент: конверсия фиксируется только при реальном переходе из состояния «не участник» в «участник». Человек, который уже состоит в канале, события не создаст.
Где взять и куда поставить
Всё лежит на Гитхабе, бесплатно: github.com/dvygolov/TG.JoinProof
Технически это PHP 8.1+ и SQLite. Никаких внешних библиотек. Заливаете файлы, правите файл .env, открываете панель, и всё: база и таблицы создадутся сами при первом заходе. Ставится на любой shared-хостинг типа Beget, отдельный VPS не нужен (но при желании никто не мешает завести и на нём). Полная инструкция по развёртыванию есть в README репозитория, расписывать её здесь не буду, там всё по шагам.
Настройка
Сначала идём к @BotFather и создаём бота, как обычно. Потом добавляем этого бота администратором вашего канала или чата. Единственное право, которое ему нужно, это «Приглашение пользователей» (в апи оно зовётся can_invite_users). Остальные галочки можно не трогать.
Дальше открываем админку системы, логинимся паролем из .env и добавляем бота: название плюс токен от BotFather. Система токен проверит.

Теперь добавляем цель: выбираем бота, вбиваем числовой ID канала или чата (либо паблик юзернейм) и вставляем постбэк-ссылку трекера. При сохранении система сама проверит тип цели и права бота, и зарегистрирует вебхук.

Всё, цель добавлена, жмём кнопку копирования у канала/чата и получаем системную ссылку.

Эту системную ссылку ставим в кампанию трекера как редирект.
Проверка в бою
Я прогнал этот флоу через Yellow TDS на тестовый канал. Кликнули с телефона по ссылке, Telegram открылся по инвайту, вступили в канал.

В админке системы сразу появилась конверсия:

А в Yellow TDS прилетел лид:


Работает, гайз!
Что ещё можно передать в трекер
Помимо click ID, в постбэке доступны макросы с данными вступившего пользователя. Telegram присылает их вместе с событием, и можно сразу нарезать статистику:
{is_premium}: есть ли у юзера Telegram Premium;{language_code}: язык приложения;{user_id},{username},{first_name},{last_name}: идентификаторы и имя.
Пример полного постбэка:
https://tracker.example/postback?click_id={clickid}&status={status}&premium={is_premium}&lang={language_code}&username={username}
Премиум-подписчики это, как правило, более платёжеспособная и живая аудитория. Можно пролить пару дней траф, посмотреть по срезу, с каких крео и кампаний идёт больше премиумов, и перекидывать бюджет туда.
Технические требования
Коротко, что нужно для работы софта:
- Публичный HTTPS-адрес с нормальным сертификатом: Telegram шлёт вебхуки только на https.
- Один бот равно один вебхук. Если этого же бота подключить куда-то ещё, где тоже вызывается setWebhook, вебхуки перезапишут друг друга. Заведите отдельного бота под систему.
- Инвайт-ссылка живёт 24 часа. Кликнувший сегодня и подписавшийся послезавтра это экзотика, но просто имейте в виду, что у ссылки есть срок.
Всё остальное, включая повторные попытки доставки постбэка (до трёх раз, если трекер лежит), система берёт на себя.
Выводы
Если льёте траф на тг — всё это можно оптимизировать по нормальному: FB учится на тех, кто реально подписался, трекер видит настоящие конверсии, а вы получаете стату по параметрам аудитории, которых раньше не было.
Софт бесплатный, забирайте с Github. И ещё раз спасибо Адаму за идею.
На связи был Жёлтый Веб, лейте в плюс, господа!

