Как считать заявки, если клиенты пишут в Telegram, а не звонят
В Узбекистане клиент чаще нажимает «Написать в Telegram», чем звонит или заполняет форму. Для аналитики это чёрная дыра: человек ушёл с сайта, и дальше счётчики его не видят. Показываю, как мы эту дыру закрываем без платных сервисов.
Mirodil OrtiqovБэкенд-разработчик
Знакомая картина: в Google Analytics за месяц ноль конверсий, а менеджер говорит, что не успевает отвечать в Telegram. Обе стороны правы. Просто сайт отдаёт человека в мессенджер, и в этот момент цепочка рвётся. Реклама думает, что не работает. Владелец думает, что работает «сарафан». Бюджет режут не там.
Я бэкенд-разработчик, и эта задача мне нравится, потому что решается она не маркетинговыми инструментами за сотни долларов в месяц, а парой десятков строк кода и дисциплиной. Ниже то, что мы ставим на свои проекты, по шагам.
Где теряется источник
Сначала полезно понять, в каких местах информация «откуда пришёл человек» пропадает. Их три, и для каждого своё решение.
| Где рвётся | Что видно без настройки | Что можно сделать |
|---|---|---|
Клик по ссылке t.me/... на сайте |
Ничего, или «исходящий переход» без деталей | Событие в GA4 и цель в Метрике |
| Человек открыл бота | Факт /start, источник неизвестен |
Start-параметр в ссылке на бота |
| Человек написал менеджеру в личку | Только сам диалог | Спросить, сверить по времени, вести таблицу |
| Форма на сайте | Заявка есть, источник часто теряется | Передавать UTM и страницу вместе с заявкой |
Последняя строка не про Telegram, но мы её добавили, потому что формы, которые отправляют заявку в Telegram-канал, есть почти на каждом нашем сайте, и источник там тоже легко потерять.
Шаг 1. Клик по t.me как событие
Самое простое и самое недооценённое. GA4 с включённой улучшенной статистикой сам записывает клики по внешним ссылкам, но в общей куче, вместе с переходами на Instagram и карты. Метрика умеет автоцель «Переход в мессенджер». Мне этого мало: я хочу видеть отдельное событие с понятным именем, которое потом можно импортировать в Google Ads и Директ.
Минимальный код, который мы вешаем на сайт:
document.addEventListener('click', (e) => {
const link = e.target.closest('a[href*="t.me/"]');
if (!link) return;
const params = { link_url: link.href, page: location.pathname };
window.gtag?.('event', 'telegram_click', params);
window.ym?.(COUNTER_ID, 'reachGoal', 'telegram_click', params);
});
Один обработчик на весь документ, а не на каждую кнопку. Кнопки добавляются, переезжают, дизайнер меняет вёрстку, а событие продолжает работать. GA4 отправляет такие события через sendBeacon, так что они успевают уйти, даже если Telegram открывается в той же вкладке.
Шаг 2. UTM, которые доживают до бота
С ботом можно сделать то, чего нельзя с личным аккаунтом: передать в него метку. Ссылка вида https://t.me/YourBot?start=google_brand откроет бота, и когда человек нажмёт «Старт», бот получит команду /start google_brand. Сам человек этой метки не видит.
Ограничения у start-параметра жёсткие: до 64 символов, только латиница, цифры, _ и -. Знаков = и & там быть не может, поэтому полную UTM-строку туда не положить. Мы сжимаем её в короткий код прямо на сайте:
const p = new URLSearchParams(location.search);
const src = (p.get('utm_source') || 'direct').slice(0, 20);
const cmp = (p.get('utm_campaign') || 'none').slice(0, 30);
const code = `${src}__${cmp}`.replace(/[^A-Za-z0-9_-]/g, '');
document.querySelectorAll('a[href^="https://t.me/YourBot"]')
.forEach((a) => { a.href = `https://t.me/YourBot?start=${code}`; });
А в боте на aiogram 3 метку достаём одним фильтром и сохраняем вместе с пользователем:
@router.message(CommandStart(deep_link=True))
async def start_from_link(message: Message, command: CommandObject):
await save_source(message.from_user.id, command.args) # "google__brand_ru"
await show_main_menu(message)
Дальше всё просто. Когда пользователь оформляет заказ, бот кладёт сохранённый источник в сообщение для операторов. Выглядит это примерно так:
Теперь честно о том, где мы этого не сделали. В боте Chocoberry Queen заказы уходят в канал операторов с адресом, точкой на карте и ссылкой на заказ в админке, но start-параметры мы туда в 2024 году не заложили. На старте это казалось лишним: бот только запускался, и думали мы в первую очередь о каталоге и доставке. Добавить метки можно в любой момент, но историю задним числом не восстановишь: если владелец захочет сравнить, скажем, таргет в Instagram с рекламой у блогеров, данных за первые месяцы у него просто не будет. Теперь start-параметры у нас в шаблоне каждого нового бота с первого дня.
А если клиенты пишут не боту, а менеджеру в личку? Передать метку в личный аккаунт нельзя: у ссылки t.me/username нет start-параметра. Здесь у нас три приёма, и ни один не идеален. Первый: вести рекламу на бота, который здоровается, сохраняет источник и сразу даёт кнопку для связи с живым менеджером. Второй: отдельный рабочий аккаунт под рекламу, чтобы хотя бы отличать рекламные диалоги от остальных. Третий, самый простой: менеджер в первом же ответе спрашивает, откуда человек о вас узнал, и ставит в чате метку-папку. Это ручная работа, но для двадцати диалогов в неделю она занимает пару минут.
Шаг 3. Заявка из формы прямо в Telegram
Даже если основная масса людей пишет в мессенджер, форма на сайте нужна: кто-то не хочет переписываться, кто-то заходит с рабочего компьютера, где Telegram не установлен. Чтобы заявки с формы не терялись в почте, мы отправляем их в Telegram-группу или канал отдела продаж.
Так устроен сайт IBN Express: человек заполняет расчёт перевозки машины (откуда, куда, год, марка, модель, тип перевозки, дата), заявка сохраняется в базе на Django и в ту же секунду уходит сообщением в Telegram-канал продаж. Менеджер видит всё, что нужно для звонка, и не открывает никакую CRM.
Если бы я делал эту форму сегодня, добавил бы в сообщение ещё две строки: страницу, с которой пришла заявка, и UTM-метки. Технически это три поля в запросе: source: location.pathname, utm: location.search и дата. Сейчас это у нас стандарт, а тогда мы думали только о скорости ответа.
Пара практических деталей, на которых мы спотыкались:
- токен бота живёт только на сервере, в переменных окружения. Отправлять сообщения в Telegram прямо из браузера нельзя, токен утечёт в первый же день;
- сообщение в Telegram отправляется после сохранения заявки в базу, а не вместо него. Telegram API иногда отвечает ошибкой, а заявка должна остаться;
- от спама нужна хотя бы скрытое honeypot-поле и reCAPTCHA v3. Без них через месяц канал заваливают ботами.
Таблица, которая заменяет сквозную аналитику
Сквозная аналитика в больших компаниях стоит дорого, потому что связывает рекламу, сайт, звонки и CRM автоматически. Для небольшого бизнеса в Ташкенте, где заявок десятки, а не тысячи, хватает таблицы и пятнадцати минут в неделю.
Что мы делаем каждую неделю на проектах, где ведём рекламу:
- Выгружаем события
telegram_clickи отправки форм из GA4 и Метрики по источникам - Считаем заявки в Telegram-канале продаж, с разбивкой по меткам из бота и формы
- Спрашиваем менеджера, сколько диалогов в личке пришло без меток и откуда, по словам клиентов
- Отмечаем, сколько заявок дошло до оплаты (это знает только менеджер)
- Пишем в таблицу одну строку на источник: клики, заявки, оплаты, расход
- Сравниваем с прошлой неделей и только потом трогаем рекламу
Через месяц такой таблицы вы впервые увидите цену не клика, а оплаченного заказа по каждому каналу. Часто она переворачивает представления: канал с самыми дешёвыми кликами оказывается самым дорогим по оплатам.
Вопрос «откуда вы о нас узнали?» менеджер должен задавать всё равно. Люди не всегда помнят точно, но в сочетании с метками картина складывается.
Если вы ещё решаете, нужен ли вам бот или хватит сайта с кнопкой Telegram, Азамат разбирал это в статье что делать первым: бот или сайт. А если бот уже есть, но метки в нём не передаются, это пара часов работы: напишите в Telegram @Azamat_yamin, посмотрим, или загляните на страницу разработки Telegram-ботов.




