Методология
Методология сквозной аналитики
5 KPI и их формулы
| KPI | Определение | Формула | Ограничения |
|---|---|---|---|
| Охват | Уникальные компании, активные в ≥ 1 канале за 30 д | COUNT DISTINCT(companies WHERE last_signal >= today−30d) |
Сигнал = email open/click OR site visit OR TG activity OR webinar |
| Глубина | Из охвата — компании, активные в 2+ каналах | COUNT DISTINCT(companies WHERE channels_active_30d >= 2) |
Измеряет кросс-канальную интеграцию. Не «во всех каналах» — структура каналов разная |
| Вовлечение | Взвешенный open rate финализированных кампаний (snapshot 7d), окно [-30, -7] д | SUM(opens_unique_7d) / SUM(sent) × 100 |
Apple MPP и Gmail image-prefetch инфлируют open rate на iOS. CTOR точнее. БПС: атрибуция в разработке |
| Действие | Уникальные клики из email на статьи magazine.sibur.ru / sibured.ru/businesspractices за 30 д | COUNT(clicks WHERE host IN (content_sk, content_bps) AND date >= today−30d) |
В Google Sheet G5 считается с шумом (ya.ru, соцсети, foquz) — там 654. Категории разделены: content_sk (magazine.sibur.ru) и content_bps (sibured.ru/businesspractices) — блок «Топ-темы» имеет чип СК/БПС. |
| 🔥 Горячих → KAM | Компании сегмента Горячий: composite_score ≥ 0.5 | COUNT DISTINCT(companies WHERE segment = 'Горячий') |
Передаются менеджерам отношений (Key Account Managers) |
5 каналов и их статус
startURLPath=@'/businesspractices', 6 658 визитов за 30д.Composite score и сегментация
composite = Σ W[ch] × score[ch] по каналам email / tg / webinar / site
W = FULL_WEIGHTS {email 0.3, site 0.2, tg 0.2, webinar 0.3}, нормированные
по активным каналам → сейчас email 0.375 · tg 0.25 · webinar 0.375 (site не активен)
email_score = [ log1p(clickers_90d) + 0.15 × log1p(max(0, openers_90d − clickers_90d)) ]
× 0.5^(days_since_last_event / 60)
tg_score = max(legacy, telethon)
legacy = min(1, msgs_lifetime/5 + rx_on_admin/20) × 0.5^(days_since_last_seen / 60)
telethon = min(1, (group_msgs_30d + 2×private_msgs_30d)/20 + reactions_30d/30)
× 0.5^(days_since_last_msg / 60)
webinar_score = log1p(visits_90d) × 0.5^(days_since_last_visit / 30)
Log-шкала без capping. Крупные компании не «слипаются» в 0.99 — сохраняется разрешение в топе, топ-5 реально ранжируется.
Decay 60 дней. B2B-цикл, а не 14 дней как для consumer-email: клиенты СИБУРа реагируют медленнее, решение о закупке занимает недели.
Ratio click:open = 6.7×. Кликер весомее просто открывателя в 6.7 раза (1 / 0.15), потому что клик = интент.
SIBUR-домены отфильтрованы. 696 адресов из внутреннего домена не участвуют в email_score (иначе искажали бы топ).
Снапшоты email-кампаний 24h / 72h / 7d
Зачем нужны. Метрики email «дотекают» первые 3 суток — открытия, клики и отписки приходят волной. Нельзя сравнивать open rate новой кампании (2 часа назад) с ней же через неделю: это будут разные цифры для одного и того же события.
Как работает. Коллектор dashamail_snapshots.py фризит значения
в трёх точках: +24h, +72h, +7d после send_date.
Записывает 21 колонку в data_campaigns
(opens/clicks/ctor/unsub/bounce × 3 точки + служебные).
Финальные метрики. Все цифры на Dashboard считаются только по _7d,
и только для кампаний в окне [today−30, today−7] — чтобы у каждой было
не меньше 7 суток «дотекания».
Preliminary. Кампании младше 7 дней помечаются «предварительно» и показываются отдельным блоком, чтобы не искажать weighted average.
Три источника TG-сообщества
is_in_community и tenure_days.Ограничения и честные оговорки
- Apple MPP / Gmail image-prefetch инфлируют open rate на iOS — авто-открытия без участия человека.
- Δ (динамика за 30 дней) — для каждого из 5 KPI сравнение с snapshot'ом 30-дневной давности.
Snapshot'ы хранятся в
state/kpi_snapshots.jsonlи обновляются ежедневно после прогона пайплайна (шагsnapshot_kpiвrun_pipeline.sh). Если истории меньше 30 дней — берётся самый старый доступный snapshot, фактический интервал виден в полеkpi.delta_base_daysdata.json. Для процентных метрик Δ — в процентных пунктах (↑ +1.3 пп), для остальных — целое со знаком (↑ +12/↓ −3/— 0). Если истории ещё нет — вездеnull, UI рендерит «Δ —». - Email-атрибуция БПС через master-файл коллеги + domain-fallback. ~35% эмейлов атрибутируются к компании; остальные с публичными доменами (mail.ru/gmail) остаются без company.
- Вебинары БПС — токен МТС Линк получен 28.04, коллектор в работе. После подключения добавится ~30 событий/мес.
data_companies.last_signalхранится как дата черезRAW+ numberFormat. Без этого Google Sheet превратил бы дату в serial 46129.xx при пересчёте.
Словарь русификации
| Open rate | % открытий |
| CTR | % кликов |
| CTOR | % кликов от открытий |
| Unsub rate | % отписок |
| Bounce | % отказов |
| Reach | Охват |
| Depth | Глубина |
| Risers | Активизировались |
| Tier | Сегмент |
| Hot / Warm / Cold | Горячий / Тёплый / Холодный |
Почему так — 6 ключевых архитектурных решений
- Одна Google-таблица, не PG. MVP-подход — пользователь видит данные сразу, без деплоя БД и фронта. Миграция на PostgreSQL возможна при превышении ~1 млн строк.
- Мульти-базные рассылки = 1 строка с конкатенацией имён баз. Согласовано 18.04. Альтернатива (строка-per-база) дала бы дубли в weighted averages.
-
Resends = отдельные строки с
parent_campaign_id. Видно uplift от досылки; при этом фильтр поsend_type=originalдаёт чистые метрики оригинальной рассылки. - Классификация по базам, не по subject. БПС часто шлёт без префикса в теме («Вебинары в апреле»), а имя базы всегда содержит «бпс» — надёжнее.
-
Сайт БПС = только
/businesspractices. Без фильтра ловит весь sibured.ru — корпоративный трафик к нашей аудитории отношения не имеет. -
Контент СК и БПС — раздельные категории URL.
magazine.sibur.ru→content_sk,sibured.ru/businesspractices→content_bps. Раньше оба попадали в один бакет, и блок «Топ-темы» врал — заголовок обещал СК, а top-N мог быть БПС. Теперь в data.json у каждой темы полеproject, UI фильтрует чипом. -
Email-фильтр SIBUR — 696 адресов не попадают в
email_score. Иначе сотрудники СИБУРа, массово открывающие внутренние рассылки, инфлировали бы сегмент «Горячих».