18 KiB
Общее описание системы
Система для владельцев каналов позволяющая удобно систематизировать информацию о закупках рекламы и предоставляющая удобный интерфейс для анализа проведенных рекламных компаний
Термины и определения
«Целевой канал» — канал, в который мы приводим подписчиков. Им владеет пользователь (владелец проекта) и именно для него считаем подписки.
«Внешний канал» — сторонний канал, в котором покупаем размещение рекламы выбранного креатива. Пользователю он не принадлежит, бот туда не добавляется.
«Креатив» — сущность/шаблон текста сообщения, привязанная к целевому каналу.
«Закуп» — факт размещения креатива во внешнем канале. Для каждого закупа создаётся отдельная invite-ссылка в целевой канал.
CPF — Cost Per Follower — метрика отражающая стоимость привлечения одного подписчика
CPM — Cost Per Mile — метрика отражающая стоимость 1000 просмотров
Функционал
1. Авторизация/регистрация через телеграмм
Пользователь в веб-панели нажимает «Войти через Telegram». Его перенаправляет к боту по ссылке вида https://t.me/example_bot?start=login. Бот возвращает одноразовую ссылку вида https://app.example.com/auth/complete?token=<one_time_login_token>. Сайт обменивает токен на сессию. Если пользователя не существовало — создаётся новый профиль; если существовал — выполняется вход.
Сценарии использования
Новый пользователь
- Пользователь жмёт «Войти через Telegram» на сайте.
- Редирект в Telegram к боту:
/?start=login. - Создается новый пользователь с данными из события (Telegram ID, username, ФИО)
- Бот генерирует одноразовый токен для пользователя
- Бот отправляет кнопку «Войти» со ссылкой вида
/auth/complete?token=.... - Пользователь переходит по ссылке и авторизуется.
Существующий пользователь
- Пользователь жмёт «Войти через Telegram».
/?start?login→ бот генерирует ссылку вида/auth/complete?token=....- Пользователь переходит по ссылке и авторизуется.
2. Подключение целевых каналов
Пользователь вручную добавляет бота в свой Telegram-канал с правами администратора (минимум: право создавать инвайт-ссылки и видеть вступления). Бот получает событие, валидирует, что канал новый/принадлежит пользователю, и регистрирует канал в системе. В веб-панели доступен список подключённых каналов.
Сценарии использования
Подключение нового канала
- Пользователь в веб-панели жмёт «Подключить канал» → видит инструкцию «Добавьте бота в нужный канал с правами администратора».
- Пользователь добавляет бота в канал.
- Бот получает событие о добавлении в канал
- Бот создаёт/обновляет запись канала, привязывая её к пользователю.
- Канал отображается в списке каналов пользователя
Ошибки (кратко): нет прав администратора → канал не регистрируется; канал уже подключён → пропускаем, возвращаем «уже в системе».
Просмотр (и отключение) каналов
- Пользователь открывает раздел «Каналы».
- Система показывает список: название, @username, ссылка
- Пользователь при необходимости жмёт «Отключить» → система помечает канал как отключённый (и предлагает вручную снять бота из админов в самом канале).
Результат: список актуален; отключённые каналы не участвуют в аналитике и создании инвайт-ссылок.
3. Каталог внешних каналов
Описание
Пользователь ведёт собственный список внешних каналов (куда планирует покупать размещения) для целевого канала.
Список можно редактировать вручную и импортировать из Tgstat (Excel).
Каждый внешний канал может быть привязан к одному или нескольким целевым каналам. При добавлении внешнего канала пользователь указывает, к каким целевым каналам его привязать.
Основные действия доступные для каталога каналов
- Просмотр списка внешних каналов для выбранного целевого канала.
- Добавление/удаление внешнего канала.
- Импорт из Excel (tgstat) с валидацией и дедупликацией.
Требования к данным
Внешний канал и Целевой канал связаны через M2M связь
4. Креативы
Креатив — это шаблон рекламного сообщения, используемого при закупке рекламы во внешних каналах, содержащий переменную, куда нужно вставить ссылку на целевой канал.
Каждый креатив связан с одним целевым каналом и может быть использован в нескольких закупах.
На этапе первой версии поддерживается только текстовый формат без медиафайлов.
Сценарии использования
Создание нового креатива
- Пользователь открывает раздел «Креативы» и нажимает «Создать креатив».
- Указывает:
- Название креатива (для внутреннего использования),
- Текст сообщения,
- Целевой канал, к которому креатив относится.
- Сохраняет запись.
- Креатив появляется в списке и доступен для выбора при создании закупа.
Результат: создан новый креатив, связанный с выбранным целевым каналом.
Просмотр и редактирование креативов
- Пользователь открывает список креативов.
- В таблице видны: название, целевой канал, дата создания и количество связанных закупов.
- При необходимости пользователь может:
- открыть креатив,
- изменить текст,
- переименовать,
- архивировать
- удалить (если не используется в активных закупах).
Результат: список актуальных креативов; изменения сохраняются без потери связей с закупами.
5. Закупы
Описание
Закуп — это факт размещения выбранного креатива во внешнем канале.
Для каждого закупа создаётся уникальная пригласительная ссылка в целевой канал, по которой отслеживаются подписки.
Закуп связывает между собой три сущности:
- целевой канал (куда ведём трафик),
- внешний канал (где размещаем рекламу),
- креатив (что публикуем).
Пользователь может создавать, редактировать и просматривать закупы, а также видеть их основные показатели эффективности
Сценарии использования
Создание нового закупа
- Пользователь открывает раздел «Закупы» и нажимает «Создать закуп».
- Указывает:
- Целевой канал,
- Внешний канал,
- Креатив,
- Дату размещения (планируемую или фактическую),
- Стоимость закупа (опционально),
- Комментарий,
- Ссылка на рекламное сообщение во внешнем канале (для получение информации о просмотрах).
- Тип ссылки (открытая/с одобрением ботом)
- После сохранения система создаёт уникальную публичную или приватную invite-ссылку (в зависимости от настройки закупа “тип ссылки” п.2) в целевой канал через Telegram Bot API.
- Закуп появляется в списке с возможностью скопировать текст для рекламного сообщений и доступен для просмотра аналитики.
Результат: создан новый закуп с уникальной ссылкой для отслеживания переходов и подписок.
Просмотр и обновление закупов
- Пользователь открывает список закупов (таблица).
- В таблице отображаются: целевой канал, внешний канал, креатив, дата, стоимость, количество подписок.
- Пользователь может:
- изменить данные закупа (например, обновить стоимость, комментарий или дату),
- удалить закуп (с предупреждением о невозможности восстановления данных),
- архивировать закуп (убрать из статистики и аналитики)
- перейти к просмотру аналитики по конкретному закупу.
6. Обработка события подписки пользователя в целевой канал через Telegram Bot API
Бот — администратор целевого канала. При вступлении пользователя Telegram шлёт одно из двух событий (ChatMemberUpdate, ChatJoinRequest) по которым мы однозначно маппим подписку к закупу
Сценарии использования
Подписка по открытой ссылке
- Для закупа создана уникальная invite_link.
- Пользователь переходит и сразу вступает в канал.
- Бот получает событие
ChatMemberUpdated - По
invite_linkнаходим закуп и сохраняем информацию о подписке - Инкрементируем метрики закупа (подписки, конверсия).
Результат: подписка учтена и привязана к конкретному закупу.
Запрос на вступление в канла
- Для закупа создана уникальная
private_invite_link. - Пользователь переходит по ссылке и отправляет
ChatJoinRequest. - Бот получает событие
ChatJoinRequest - По
invite_linkнаходим закуп и сохраняем информацию о подписке - Инкрементируем метрики закупа (подписки, конверсия).
Результат: подписка учтена и привязана к конкретному закупу.
7. Получение информации о кол-ве просмотров через Telegram API
Описание
Система должна уметь подтягивать число просмотров рекламного поста по ссылке на сообщение внешнего канала.
Технически корректный способ — через Telegram API (или MTProto/TDLib): для публичных каналов можно читать сообщения и их поле views без добавления бота в канал.
Поддерживаемые форматы ссылок:
- https://t.me/<username>/<message_id>
- https://t.me/c/<internal_chat_id>/<message_id> (для приватных каналов с доступом — см. ограничения ниже)
Метрика хранится как снимки (time series) с периодическим опросом (раз в час), чтобы видеть динамику добора просмотров.
💡Тут надо подумать, как частно нужно получать эти данные и как их надо агрегировать, так как у телеграмма как-то заковыристо считается и показывается кол-во просмотров
Сценарии использования
Успешное получение просмотров (публичный канал)
- В карточке закупа пользователь добавляет ссылку на пост (t.me/<username>/<message_id>).
- Бэкенд через TDLib/MTProto вызывает channels.getMessages и читает поле views.
- Сохраняет снэпшот: views=12345, fetched_at=....
- Планировщик повторяет опрос по расписанию, строится кривая добора просмотров.
Результат: в аналитике закупа и сводках отображается актуальный счётчик просмотров и стоимость подписчика с учётом просмотров (пока — только CPS/CPF, просмотры — справочно).
Недоступно (приватный канал / нет прав / битая ссылка)
- Пользователь добавляет ссылку t.me/c/.../123.
- Запрос через TDLib возвращает «нет доступа» или «не найдено».
- Система помечает источник как unavailable и предлагает:
- добавить доступ (пригласить учётку чтения), или
- указать просмотры вручную, или
- загрузить из отчёта Tgstat/экселя.
Результат: закуп помечен как недоступный для авто-сбора; допускается ручной ввод/импорт.
8. Просмотр аналитики по целевым каналам, внешним каналам, креативам и закупам
- Отображать средний CPF в списках закупов, креативов и внешних каналов
- Отображать средний CPM в списках закупов, креативов и внешних каналов
- Отображать столбчатую диаграмму с объемом закупок с группировкой по дате (день, неделя, месяц, квартал, год) и возможностью фильтрации по целевым каналам на отдельном экране “Аналитика” → “Затраты”