Задача
Заказчик лил рекламу на телеграм-бота из четырёх каналов и не понимал, какой из них окупается.
В кабинетах площадок он видел клики, в выписке платёжки видел деньги, сходились они только у него в голове.
Заявки в боте приходили обезличенными: человек нажал старт, а откуда пришёл, спрашивать уже поздно.
Задача - дотянуть цепочку от объявления до оплаты и считать по каждому объявлению стоимость заявки и возврат вложений.
Что сделал
Разметка построена на deep-link: каждое объявление получает свою ссылку на бота со своим кодом.
Метка присваивается человеку при первом касании и дальше не переписывается, повторный старт атрибуцию не ломает.
Каждое событие - шаг анкеты, заявка, счёт, оплата - пишется с тем же идентификатором. События лежат в PostgreSQL сырыми, чтобы воронку можно было пересобрать задним числом и не переписывать историю при смене отчёта.
Дашборд на FastAPI и React: заявки и оплаты по источникам, воронка по шагам с отвалом на каждом, стоимость заявки и стоимость оплаты, окупаемость за выбранный период, выгрузка в Excel.
Результат
Через три недели данных стало видно, что два канала из четырёх дают заявки и почти не дают оплат.
Бюджет с них сняли, при том же месячном расходе оплат стало больше примерно на треть.
Воронка вскрыла ещё одно: четверть людей уходила на шаге, где бот просил телефон до показа цены. Шаги поменяли местами, доходимость до заявки поднялась с 38 до 52 процентов.