Действуй как senior-аналитик и продуктовый дизайнер. Собери мне интерактивный дашборд по прилагаемым выгрузкам аналитической платформы БОТИКА (botica.pro) : она атрибутирует подписчиков каналов в мессенджерах MAX и Telegram к источникам трафика через UTM-метки. Мои файлы CSV-выгрузки БОТИКИ: разделитель «;», кодировка UTF-8 с BOM. Возможные типы (любые могут отсутствовать): • channel_users_stat : подписчики: max_id, UTM-поля (utm_source / medium / campaign / content / term), Подписан/Не подписан (текущий статус), даты подписки и отписки, Количество дней в канале. • subscribe_stat : динамика: Дата, Подписки, Отписки. • postlink_click_stat : клики по трекинг-ссылкам: таймстемп, MaxID, Название поста, Ссылка на пост, UTM-поля. • webappvisit_stat : визиты лендинга: таймстемп, MaxID (заполнен, только если посетитель дошел до MAX), Yandex ClientID (заполнен всегда), UTM-поля, Пост (целевая ссылка). • messages_stat : посты: дата, Ссылка, Просмотры (накопленный счетчик), Текст сообщения. • Мастер отчетов Яндекс Директа (xlsx): шапка со служебными строками, затем таблица «Название кампании · № Кампании · День · Расход · Клики»; строку «Итого» пропускай. Определяй тип каждого файла по имени и заголовкам. Учти: в выгрузке подписчиков поле max_id, в событийных : MaxID. Правила расчетов : соблюдай строго • Сквозной ключ : MaxID. «Переход на канал» = клик по трекинг-ссылке ИЛИ строка вебапп-визита с непустым MaxID. Строки вебаппа без MaxID : только визиты. • Уникальные посетители лендинга : по уникальным Yandex ClientID. • Статус подписки любого события определяй связкой MaxID с выгрузкой подписчиков: «Подписки» = все, кто подписался (включая отписавшихся позже), «Подписаны сейчас» = текущий статус «Подписан». Удержание = подписаны сейчас / подписки. НЕ используй инлайн-поле «Подписка» события : оно отражает момент визита. • В воронках и таблицах считай уникальных людей; в счетчиках событий (клики, визиты) допустимы повторы : всегда подписывай, что считаешь. • Кампании Директа связывай с utm_campaign визитов двумя ключами: по № кампании ИЛИ по названию (без учета регистра и лишних пробелов). Кампании с расходом без связки помечай «нет UTM» и предупреждай, что их атрибуция теряется. • Стоимостные метрики: CPC = расход/клики Директа; цена перехода = расход/переходы; цена подписчика = расход/подписки; цена удержанного = расход/подписаны сейчас. • Просмотры постов : накопленный итог на момент выгрузки, а не за день; при сравнении постов разной давности подписывай это ограничение. • Пустые UTM показывай как «без метки». Длинные списки сворачивай в «прочее». • Ничего не выдумывай: нет данных : ставь «—», нет файла : скрой блок целиком. Структура дашборда Один HTML-файл. Сверху : селектор периода (пресеты «Весь период / 30 / 14 / 7 дней» + произвольные даты; границы из данных; пересчитывает все блоки). Затем: • KPI-карточки: Подписки за период (акцентная; отписки и прирост в подстрочнике) · Визиты лендинга (+уникальные посетители) · Переходы на канал (разбивка: ссылки на посты / вебапп) · Постов за период · Среднее просмотров на пост · Среднее дней в канале. • Динамика по дням: столбцы подписок/отписок, линия накопленного итога (правая ось), пунктир переходов на канал. • Воронка внешнего трафика через лендинг: Визиты → Уникальные посетители → Переход на канал → Подписка → Подписаны сейчас, с конверсией каждого шага, сквозной конверсией и числом отписавшихся во врезке-выводе. • Источники подписок: горизонтальные бары по utm_source из выгрузки подписчиков. • Воронка по источникам с лендинга: таблица utm_source → вложенные utm_campaign: Визиты · Уник. посетители · Переходы · CR · Подписки · CR · Отписки · Retention, строка «Итого». • Кампании: воронка, удержание и стоимость (если есть файл Директа): таблица Кампания · Расход · Клики Директ · Визиты · Переходы · CR · Подписки · Сейчас · CPC · Цена перехода · Цена подписчика · Цена удержанного (акцент на последней) + график «Стоимость удержанного подписчика по кампаниям», отсортированный от дешевой к дорогой. • Площадки и посадочные: график визитов/переходов по utm_term (в РСЯ туда передается площадка); таблица посадочных по полю «Пост» с CR; таблица контента канала (дата, текст до 80 символов, просмотры). • Эффективность трекинг-ссылок: Ссылка · Источник · Клики · Уникальные · Подписаны сейчас · CR. • Удержание по источникам: стек-бары «подписаны сейчас + отписались», % удержания в подписи строки. В описании каждого блока пиши вывод из данных, а не пересказ графика: где узкое место, какая кампания дешевле, куда смотреть. Технические требования • Единый HTML: либо с зашитыми в файл данными из моих выгрузок, либо (если попрошу «универсальный») : с экраном загрузки CSV/XLSX и обработкой в браузере через PapaParse, SheetJS и Chart.js. • Числа в русском формате (пробел : разряды, запятая : дробь), даты ДД.ММ. • Экранируй тексты из выгрузок перед вставкой в HTML. • Адаптивность до мобильного экрана. Оформление Палитра БОТИКИ: фон темно-синий #16243F (карточки #1D2F52), акцент лайм #D9F25C, вторичный розовый #FF4FA3, приглушенный текст #8FA0C2. Заголовки : шрифт Unbounded, текст : системный. Скругления 18-20px. Название «БОТИКА» пиши кириллицей капсом. Не используй тире : только двоеточия и средние точки. Без превосходных степеней и выдуманных цифр. Перед сдачей проверь Суммы KPI сходятся с графиками; воронка сходится с таблицей источников; расход Директа в таблице сходится с «Итого» исходного файла; при отсутствии любого файла дашборд не ломается; период с расходами сопоставлен с тем же периодом воронки. Мои пожелания (заполните или удалите) • Название канала / клиента: ______ • Тема: темная (по умолчанию) / светлая для печати • Убрать блоки: ______ • Добавить: ______ • Комментарий для получателя отчета: ______ Уточнение по совместимости выгрузок Описание полей выше использует MaxID и max_id из выгрузок MAX. Если приложены выгрузки Telegram с другими заголовками, сначала покажи найденные колонки и уточни соответствие идентификаторов. Не объединяй пользователей разных мессенджеров только по совпадению числового ID.