Меры Superset — Sina Gear
Срез 29.09.2026. Выражения ниже — это поле SQL expression меры датасета, не отдельный запрос. Датасет указан в заголовке раздела. Формат D3 ставится в настройке меры.
Живые витрины уже собраны в clickhouse-sina. Описание колонок: clickhouse-schema.md. Текст сборки: sql/007_dds.sql, sql/008_mart_fct_sales.sql, sql/009_smm_mart.sql, sql/010_mart_cohort.sql.
Как устроены слои
Сделка меняет стадию. Поэтому витрины — обновляемые целиком представления (REFRESH), а не дописка строк. Иначе вчерашняя стадия оставалась бы рядом с сегодняшней.
Порядок ключа: сначала воронка или сеть (мало значений), потом дата, потом id. Партиций нет: объём — тысячи и десятки тысяч строк, старые куски по месяцам не удаляются.
Доли (выкуп, ER, churn) в витрине не хранятся. В таблице лежат слагаемые, долю считает Superset. Иначе среднее по уже посчитанным процентам врёт.
Деньги и счётчики LiveDune — Float64, как в уже открытых витринах.
close_month пустой, пока сделка не закрыта. Так же устроена close_date. Пустая дата здесь значит «события ещё не было».
Две гранулы продаж
sina_mart.fct_sales — товар в сделке. Выручку строк складывают по line_amount. Поле amount на каждой строке повторяет сумму всей сделки.
sina_mart.fct_deal — одна строка на сделку, включая сделки без товаров (lines = 0). Средний чек, когорту и конверсию «дошёл до стадии» считают здесь.
sina_mart.fct_client — один контакт. Сделки с contact_id = 0 сюда не входят. is_new_client — галочка Calltouch на первой сделке контакта. Ноль значит «галочки нет».
sina_mart.fct_stage_path — каждый заход сделки в стадию. hours_in_stage у текущего шага равен 0. is_current = 1 — стадия, на которой сделка стоит сейчас.
Флаги сделки
Один список на все витрины, представление sina_dds.stage_flag.
| Флаг | Когда 1 |
|---|---|
stage_group | 10 макро-этапов по имени стадии. Незнакомое имя — «Нераспределенное». На 29.09 таких сделок нет, в справочнике 79 стадий |
is_preorder | C1:42 или имя «Предзаказ». Резерв и ожидание поставки в этот флаг не входят, они в группе 4 |
is_in_transit | вся группа «6. Логистика (В пути)»: доставка, ПВЗ, курьер, проблема доставки. Раньше флаг смотрел только на C1:40, на этой стадии сделок не было |
is_refusal | «Отказ при вручении» и «Возврат товара». Остальной провал (спам, цена, нет в наличии) в группу 10 входит, в этот флаг нет |
is_paid_full | C1:32 «Доставлен полностью» |
is_paid_partial | C1:38 «Клиент забрал часть заказа» |
is_paid | полный или частичный выкуп |
is_confirmed | C1:WON «Подтвержден» |
is_new_client | галочка Calltouch calltouch_first_order |
reached_* | сделка когда-либо была в этой стадии, либо стоит в ней сейчас. Поле есть на fct_deal |
Выкуп в этих флагах — только B2C. «Оплачено» B2B и «Доставлено» Озон лежат в группе «7. Успех и Выкуп» и в is_paid не входят.
close_date у открытой сделки — плановая дата Битрикса. Срок до закрытия (days_to_close) заполнен при closed = 1. У открытой сделки там 0.
На 29.09.2026 по строкам товаров: выкуп 646 сделок и 17 348 633 ₽, в пути 18 сделок и 452 363 ₽, предзаказ 990 250 ₽.
Когорта и путь
Когорта сделки — месяц created_date (cohort_month на fct_deal). Когорта клиента — месяц первой сделки (cohort_month на fct_client).
Путь до закрытия: строки fct_deal с closed = 1, столбцы cohort_month и close_month, мера deals. UTM на той же витрине уже в нижнем регистре. Покрытие метки у выкупа — мера utm_coverage.
На 29.09: 4 231 сделка, у 476 нет контакта, у 3 243 пустой utm_source, история стадий есть у всех сделок. Повторных контактов 391 из 2 900. Среди контактов, у которых первая сделка отмечена Calltouch как первый заказ (2 268), вернулись 287.
Шаг воронки по истории — fct_stage_path. Текущая стадия на fct_sales показывает, где сделка стоит сейчас, а не где она побывала.
Продажи — sina_mart.fct_sales
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
revenue_fact | Выручка (факт) | Сумма строк товаров в полном и частичном выкупе B2C | sumIf(line_amount, is_paid = 1) | ,.0f |
revenue_transit | Выручка (в пути) | Сумма строк, которые сейчас в логистике: доставка, ПВЗ, курьер | sumIf(line_amount, is_in_transit = 1) | ,.0f |
revenue_preorder | Сумма предзаказов | Только стадия «Предзаказ», без резерва и ожидания поставки | sumIf(line_amount, is_preorder = 1) | ,.0f |
revenue_potential | Выручка (потенциал) | Факт + в пути + предзаказ. Резерв и ожидание поставки сюда не входят | sumIf(line_amount, is_paid = 1 OR is_in_transit = 1 OR is_preorder = 1) | ,.0f |
revenue_reserve | Ожидание поставки и резерв | Группа 4 без предзаказа: товар ещё не в пути и не выкуплен | sumIf(line_amount, stage_group = '4. Наличие, Резерв и Предзаказ' AND is_preorder = 0) | ,.0f |
buyout_rate_money | Процент выкупа, деньги | Факт / (факт + отказ при вручении + возврат). Спам и «купил в другом месте» в знаменателе нет | sumIf(line_amount, is_paid = 1) / nullIf(sumIf(line_amount, is_paid = 1 OR is_refusal = 1), 0) | .2% |
buyout_rate_units | Процент выкупа, штуки | Те же стадии, в штуках quantity | sumIf(quantity, is_paid = 1) / nullIf(sumIf(quantity, is_paid = 1 OR is_refusal = 1), 0) | .2% |
refusals_deals | Отказы и возвраты, сделки | Число сделок на отказе при вручении или возврате | uniqExactIf(deal_id, is_refusal = 1) | ,.0f |
paid_deals | Сделки выкупа | Сделки с полным или частичным выкупом | uniqExactIf(deal_id, is_paid = 1) | ,.0f |
Карточка «Отказы и возвраты» на дашборде Sales сейчас делает SUM(is_refusal) и считает строки товаров. Для числа сделок берите refusals_deals.
Сделка — sina_mart.fct_deal
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
deals | Сделки | Одна строка = одна сделка | count() | ,.0f |
avg_check | Средний чек | Выручка строк выкупа / число сделок выкупа, у которых есть товары | sumIf(line_amount, is_paid = 1 AND lines > 0) / nullIf(countIf(is_paid = 1 AND lines > 0), 0) | ,.0f |
basket_depth | Глубокий чек | Штук в выкупе на одну сделку выкупа | sumIf(quantity, is_paid = 1 AND lines > 0) / nullIf(countIf(is_paid = 1 AND lines > 0), 0) | .2f |
days_to_close_avg | Дней до закрытия | Среднее только по закрытым. Ноль у открытой сделки в среднее не входит | avgIf(days_to_close, closed = 1) | .1f |
utm_coverage | Покрытие UTM у выкупа | Доля выкупленных сделок с непустым utm_source | countIf(is_paid = 1 AND has_utm = 1) / nullIf(countIf(is_paid = 1), 0) | .2% |
conv_to_paid | Конверсия в выкуп | Доля сделок, которые когда-либо были в полном или частичном выкупе. В знаменателе все сделки, включая спам | countIf(reached_paid = 1) / nullIf(count(), 0) | .2% |
conv_to_transit | Конверсия в доставку | Доля сделок, которые когда-либо были в логистике | countIf(reached_transit = 1) / nullIf(count(), 0) | .2% |
conv_transit_to_paid | Из доставки в выкуп | Среди дошедших до логистики — доля дошедших до выкупа | countIf(reached_transit = 1 AND reached_paid = 1) / nullIf(countIf(reached_transit = 1), 0) | .2% |
conv_confirmed_to_paid | Из «Подтвержден» в выкуп | Среди побывавших на C1:WON — доля побывавших в выкупе | countIf(reached_confirmed = 1 AND reached_paid = 1) / nullIf(countIf(reached_confirmed = 1), 0) | .2% |
Когортная таблица: строки cohort_month, столбцы close_month, мера deals, фильтр closed = 1. Рядом тот же срез с разрезом utm_source.
Доля сделок, которые сейчас стоят на макро-этапе: группировка stage_group, мера deals. Это склад на сегодня, не прохождение воронки. Прохождение — меры reached_* и витрина fct_stage_path.
Клиент — sina_mart.fct_client
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
clients | Клиенты | Контакты, у которых есть хотя бы одна сделка | count() | ,.0f |
new_client_return_rate | Возвратность новых | Среди контактов, чья первая сделка отмечена Calltouch как первый заказ, доля тех, у кого сделок две и больше | countIf(is_new_client = 1 AND is_returned = 1) / nullIf(countIf(is_new_client = 1), 0) | .2% |
repeat_rate | Повторные контакты | Доля контактов с двумя и более сделками, без оглядки на галочку Calltouch | countIf(is_returned = 1) / nullIf(count(), 0) | .2% |
Когорта клиента: группировка cohort_month, мера new_client_return_rate или repeat_rate. UTM первой сделки — колонка utm_source.
Путь — sina_mart.fct_stage_path
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
stage_hours | Часов на стадии | Медиана часов между входом в стадию и входом в следующую. Текущая стадия не входит: у неё часы ещё не закрыты | medianIf(hours_in_stage, is_current = 0) | ,.0f |
deals_reached_group | Сделки, побывавшие на этапе | Уникальные сделки в выбранной stage_group | uniqExact(deal_id) | ,.0f |
Соцсети — что достали из payload
На 29.09.2026 в JSON нет поля сохранений (saves, bookmarks). В витрины вынесены поля, которые в сырье были и не лежали отдельной колонкой.
Пост (fct_smm_posts): голоса votes, пересылки Telegram forwards, просмотры Reels reels_views, views_best (просмотры поста, а если их нет — Reels), длительность, охват подписчиков / виральный / рекламный, клики по ссылке, в группу, скрытия, отписки, жалобы, флаг is_deleted. Колонка reposts уже складывает репосты и шары VK, второй раз шары не прибавляют.
День (fct_smm_daily): посты и их просмотры, сторис и просмотры сторис, ролики и video_views, Reels, охват подписчиков, клики, вступления, скрытия, отписки, жалобы, followers_open = подписчики − пришло + ушло. У части дней followers_open отрицательный: остаток и приток в API не сходятся. Churn на это поле не делит.
Сторис (fct_smm_stories): ответы, шары, баны, подписки, открытия ссылки. На 29.09 в кабинете 8 сторис.
Видео (fct_smm_videos): просмотры из impressions.views (в сырой колонке views до следующей загрузки лежит 0), лайки, комментарии, шары.
Аудитория (fct_smm_audience): пол и возраст, длинная строка на корзину. API отдал демографию только VK. is_latest = 1 — последний день аккаунта. Сумма people по всем дням умножает аудиторию на число суток.
Период (fct_smm_period): одна строка на аккаунт и окно тарифа. er и er_views — числа LiveDune уже в процентах (2,03 значит 2,03%, не 203%). Ноль значит, что API отдал ноль: у Telegram Sina Gear ER в этом окне пустой по данным LiveDune.
Пост — sina_mart.fct_smm_posts
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
post_er_views | ER поста по просмотрам | (лайки + комментарии + репосты + пересылки + голоса) / просмотры. Удалённые посты не входят. Знаменатель — views_best | (sumIf(likes, is_deleted = 0) + sumIf(comments, is_deleted = 0) + sumIf(reposts, is_deleted = 0) + sumIf(forwards, is_deleted = 0) + sumIf(votes, is_deleted = 0)) / nullIf(sumIf(views_best, is_deleted = 0), 0) | .2% |
post_er_reach | ER поста по охвату | Та же сумма реакций / охват. Охват в сырье есть в основном у VK, на остальных сетях мера пустая | (sumIf(likes, is_deleted = 0) + sumIf(comments, is_deleted = 0) + sumIf(reposts, is_deleted = 0) + sumIf(forwards, is_deleted = 0) + sumIf(votes, is_deleted = 0)) / nullIf(sumIf(reach, is_deleted = 0), 0) | .2% |
post_views | Просмотры | Просмотры поста, для Reels без обычных просмотров — просмотры Reels | sumIf(views_best, is_deleted = 0) | ,.0f |
post_reach | Охват постов | Сумма охвата | sumIf(reach, is_deleted = 0) | ,.0f |
post_forwards | Пересылки | Пересылки Telegram. Это не сохранения | sumIf(forwards, is_deleted = 0) | ,.0f |
День — sina_mart.fct_smm_daily
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
follower_net | Прирост подписчиков | Пришло минус ушло за выбранные дни. Складывается по аккаунтам и по дням | sum(gained) - sum(lost) | ,.0f |
churn_rate | Churn подписчиков | Ушедшие за период / средний дневной остаток followers. Для одного аккаунта это отток за выбранный срок. По нескольким аккаунтам каждый день каждого аккаунта входит в среднее отдельно. Отрицательный followers_open в знаменатель не берётся | sum(lost) / nullIf(avgIf(followers, followers > 0), 0) | .2% |
reach_sum | Охват | Сумма дневного охвата | sum(reach) | ,.0f |
impressions_sum | Показы | Сумма дневных показов | sum(impressions) | ,.0f |
video_views_day | Просмотры видео за день | Дневные просмотры роликов из истории аккаунта | sum(video_views) | ,.0f |
story_views_day | Просмотры сторис за день | Дневные просмотры историй | sum(story_views) | ,.0f |
churn_rate на карточке без разреза по аккаунту смешивает каналы разного размера через простое среднее дней. Для сравнения каналов группируйте по account_name.
Аккаунт за окно тарифа — sina_mart.fct_smm_period
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
account_er | ER аккаунта | ER LiveDune к подписчикам за окно date_from–date_to. Уже в процентах. Мера для разреза по аккаунту: на общей сумме каналов её не складывают | max(er) | .2f |
account_er_views | ER аккаунта по просмотрам | ER LiveDune к просмотрам, уже в процентах | max(er_views) | .2f |
Считаемый ER по постам за произвольный период — post_er_views, не это поле.
Видео, сторис, аудитория
| Ключ меры | Метка | Бизнес-смысл | SQL-код для Superset | Формат D3 |
|---|---|---|---|---|
video_views | Просмотры видео | Сумма просмотров роликов. Датасет fct_smm_videos | sum(views) | ,.0f |
video_er | ER видео | (лайки + комментарии + шары) / просмотры. Датасет fct_smm_videos | (sum(likes) + sum(comments) + sum(shares)) / nullIf(sum(views), 0) | .2% |
story_views | Просмотры сторис | Датасет fct_smm_stories | sum(views) | ,.0f |
story_link_rate | Клики сторис | Открытия ссылки / просмотры. Датасет fct_smm_stories | sum(open_links) / nullIf(sum(views), 0) | .2% |
audience_people | Аудитория | Сумма людей в корзинах пола и возраста на последнем дне. Датасет fct_smm_audience. Без is_latest сумма размножает аудиторию по дням | sumIf(people, is_latest = 1) | ,.0f |
audience_women_share | Доля женщин | Доля корзины «женщины» на последнем дне. Датасет fct_smm_audience | sumIf(people, is_latest = 1 AND gender = 'женщины') / nullIf(sumIf(people, is_latest = 1), 0) | .2% |
После появления новых колонок в Superset датасет нужно обновить (Refresh columns). Старые меры дашборда Sales, которые ссылаются на is_paid_full, is_paid_partial, is_in_transit, is_preorder и is_refusal, продолжают работать: «в пути» с 29.09 включает всю логистику, не только курьера.