Заказчик лил рекламу на телеграм-бота из четырёх каналов и не понимал, какой из них окупается.
В кабинетах площадок он видел клики, в выписке платёжки видел деньги, сходились они только у него в голове.
Заявки в боте приходили обезличенными: человек нажал старт, а откуда пришёл, спрашивать уже поздно.
На сайте стояла Метрика, но она обрывалась ровно на переходе в Telegram.
Задача - дотянуть цепочку от объявления до оплаты и считать по каждому объявлению стоимость заявки и возврат вложений.
Разметка построена на deep-link: каждое объявление получает свою ссылку вида t.me/bot?start=код.
Payload у команды старт короткий и кириллицу не принимает, поэтому в ссылку уходит короткий код, а расшифровка кампании лежит в базе - новые метки заводятся в панели, без деплоя.
Метка присваивается человеку при первом касании и дальше не переписывается, повторный старт атрибуцию не ломает.
С сайта источник переносится так-же: utm с лендинга подставляются в кнопку перехода в бота.
Каждое событие - шаг анкеты, заявка, счёт, оплата - пишется с тем же идентификатором. События лежат в PostgreSQL сырыми, чтобы воронку можно было пересобрать задним числом и не переписывать историю при смене отчёта.
Оплаты подтягиваются из ЮKassa по API и сводятся с заявками по номеру заказа.
Расходы по каналам заносятся в панель раз в неделю руками - по API их отдают не все площадки.
Дашборд на FastAPI и React: заявки и оплаты по источникам, воронка по шагам с отвалом на каждом, стоимость заявки и стоимость оплаты, окупаемость за выбранный период, выгрузка в Excel.
Через три недели данных стало видно, что два канала из четырёх дают заявки и почти не дают оплат.
Бюджет с них сняли, при том же месячном расходе оплат стало больше примерно на треть.
Воронка вскрыла ещё одно: четверть людей уходила на шаге, где бот просил телефон до показа цены. Шаги поменяли местами, доходимость до заявки поднялась с 38 до 52 процентов.
Отчёт за период заказчик снимает сам, вместо ручного сведения кабинетов и выписки.
Осталось у клиента: панель с логинами, база событий, инструкция как завести метку под новое объявление.
Позже прикрутили дневную сводку в Telegram - заявки, оплаты и расход за вчера одним сообщением.