Первое сообщение в личку: подключение бота к Telegram Business

Человек, который кликнул рекламу и написал сразу менеджеру, до сих пор был невидим. Трекер знает тех, кто нажал /start у бота, а тот, кто бота обошёл, не оставлял строки нигде. Telegram Business это меняет: бот, подключённый к личному аккаунту менеджера, получает сообщения тех чатов, которые ему отдали, и первое входящее сообщение от нового человека становится событием first_dm, привязанным к клику. Этот гайд - весь обмен целиком: что обязан сделать менеджер, что бот получает, во что это обходится и чего всё равно не даёт.

Что делает менеджер в своём Telegram

Подключение происходит вне Leadgram, на стороне менеджера: Настройки → Telegram Business → Чат-боты, добавить вашего бота и выбрать чаты, которые он обслуживает. Сделать это за менеджера снаружи нельзя.

Проверить снаружи тоже нельзя. О подключении мы узнаём только из апдейта, который Telegram присылает боту в момент подключения, поэтому пока апдейт не пришёл, карточка Первое сообщение в личку на странице Боты говорит, что бот не подключён ни к одному аккаунту, - и это честно про всё, что нам известно.

Второй шаг наш и лежит на той же карточке: Режим сбора у каждого бота заведён в положении Выключено, и пока он там стоит, событий по этому боту не пишется. Сделать нужно оба шага. Пропустите любой - счётчик останется на нуле, и ни одна сторона не сообщит об ошибке.

Ретроспективы нет. Сообщения, отправленные до подключения, Telegram не отдаёт, поэтому первый день сбора начинается с нуля, а не дозаполняет прошлую неделю.

Telegram Premium для этого не нужен

Подключение бизнес-бота не требует Telegram Premium - Telegram документирует подключаемых ботов как доступных и пользователям без Premium. Premium нужен менеджеру для остальных business-функций: рабочие часы, быстрые ответы, приветствия, business chat links. Отдать боту чаты в их число не входит.

Так что если менеджер подключиться не может, Premium - не первое, куда стоит смотреть. Первое - следующий раздел.

Один бизнес-бот на аккаунт и Business Mode

К одному аккаунту Telegram можно подключить только одного бизнес-бота. Если у менеджера уже подключён другой - CRM, автоответчик, ассистент, - нашего он в списке либо не увидит, либо получит отказ при подключении; сначала нужно отключить прежнего. Чаще всех в это упираются агентства, по очевидной причине: у них скорее всего уже работает бот на этом аккаунте.

Второе требование лежит не на аккаунте, а на боте. Business Mode должен быть включён у него в @BotFather, и пока он выключен, бота просто нет в списке чат-ботов Telegram Business, сколько бы менеджер его там ни искал. Этот признак мы читаем у Telegram при добавлении бота, поэтому карточка называет такой случай, когда знает ответ, - и молчит, а не гадает, когда не спрашивала.

Что бот получает и что мы обрабатываем

Это то, что клиент обязан прочитать до подключения бота. Тот же абзац печатает карточка подключения, слово в слово:

Подключив бота к своему аккаунту Telegram Business, вы даёте ему доступ к сообщениям в тех чатах, которые выбрали сами: бот получает каждое сообщение из этих чатов, пока подключение включено. Обрабатываем только первое входящее сообщение от нового человека и берём из него метку клика; остальные отбрасываются сразу после проверки. Текст сообщений мы не сохраняем и никуда не передаём: в отчёте остаётся идентификатор отправителя и время. Вы можете отключить бота в любой момент в настройках Telegram, и поток прекратится немедленно.

Приём и обработка - разные слова, и это намеренно. Подписки «только первое сообщение» у Telegram нет: подключённому боту приходит каждое сообщение выбранных клиентом чатов, а «первое» определяется на нашей стороне, нами, на каждом пришедшем сообщении. Кто обещает, что бот читает только первое, описывает то, чего Telegram не предлагает.

Может ли бот отвечать - отдельный переключатель в настройках самого менеджера, и на приём он не влияет. Как он выставлен у подключённого аккаунта, написано на карточке.

Ссылка-черновик

Атрибуции нужно что-то в самом сообщении. Целевым URL кампании становится ссылка-черновик Telegram:

https://t.me/<manager_username>?text=lg-{click_id}

{click_id} подставляется на редиректе; человек попадает в чат с уже набранным lg-cm4x8... в поле ввода и отправляет его первым сообщением. Эта метка - единственное прямое доказательство связи лички с кликом, а Доставка конверсий показывает, какая доля первых сообщений приехала с ней.

Условий к ней три:

  • Менеджеру нужен публичный @username. Черновик открывается только по нему. Без юзернейма ссылку собрать не из чего, и карточка говорит об этом прямо, а не печатает нерабочую.
  • Кириллицу в тексте черновика нужно процент-кодировать самостоятельно. Редирект собирает адрес из строки как она написана, намеренно без повторной сериализации, чтобы не ломать чужие макросы. Не-ASCII в query уезжает ровно в том виде, в котором вы его набрали.
  • Человек может стереть черновик до отправки. Тогда метки нет, и личка падает на догадку по тому, что ещё известно про этот аккаунт Telegram. Часть личек остаётся без атрибуции навсегда. Это форма Telegram, а не дефект, который когда-нибудь починят.

Что это меняет в счёте

first_dm - платный тип события, и он приносит класс списаний, которого до включения не было.

  • Человек, приехавший сразу в личку, - новый платный подписчик. Тот, за кого вы уже платили (он когда-то нажал /start у бота), закрывается как бесплатный: аккаунт Telegram сопоставляется один раз на рабочее пространство и без срока давности. А тот, кто писал только менеджеру, не тарифицировался никогда - по простой причине: трекер его не видел. Теперь видит, и списание идёт как за любое первое платное событие.
  • Личка, присланная без Telegram-id, бесплатной не становится сама собой. Из подключённого бота идентификатор отправителя есть всегда, поэтому это касается только событий, которые вы шлёте сами через API. В зависимости от того, как настроено списание по слабой идентичности, такое событие либо закрывается бесплатным, либо тарифицируется по слабой лестнице - кука, устройство или клик. Какой из двух режимов включён у вашей рабочей области, скажет поддержка.

Пуши на first_dm

first_dm умеет запускать пуш и остаётся триггером - но прочитайте, что нужно доставке, прежде чем строить на нём цепочку. Пуш доставляется через подписчиков бота, по паре (бот, чат). У человека, который писал только менеджеру, такой строки нет: вашего бота он не открывал. Пуш, вооружённый на его first_dm, вооружится и не уйдёт.

То есть триггер полезен для тех, кто сделал и то и другое - написал менеджеру и когда-то запустил бота, - и инертен ровно для той аудитории, ради которой фича и заведена. Об ошибке никто не сообщит, потому что ничего не сломалось: адреса для отправки просто нет. Остальные правила доставки - в гайде Пуши.

MTProto: наша позиция

Второй способ увидеть первое сообщение в личке - пользовательская сессия, MTProto, тот же протокол, на котором говорят сами приложения Telegram. Пользовательских сессий мы не держим и держать не будем. Это позиция, а не пункт бэклога.

Пользовательская сессия - это номер телефона клиента, код входа и пароль второго фактора, лежащие на нашем сервере. Украденная сессия - полный захват личного аккаунта, а не потеря токена бота: переписка, контакты, все остальные чаты, всё целиком. У продукта есть выстроенная посадка для токенов ботов - шифрование при хранении, отпечаток и ограничение аллоулистом методов Telegram, - и нет ничего похожего для сессий: ни хранилища, ни аллоулиста методов, ни модели отзыва. Плюс Telegram может заблокировать сам аккаунт клиента за автоматизацию.

Дыра, которая от этого остаётся, реальна и названа выше: человека, стёршего черновик и никогда не касавшегося вашего бота, к клику привязать нечем. Мы предпочтём честно показать эту долю на странице Доставка конверсий, чем держать личный аккаунт клиента у себя на диске.