Фильтры и сегментация
Фильтры позволяют выбирать подмножество данных для анализа. С их помощью вы можете сегментировать пользователей, отбирать определённые события и строить сложные условия.
Что такое фильтры?
Фильтр — это набор условий, которые определяют, какие события или пользователи будут включены в анализ. Фильтры работают на уровне SQL-запросов (но вам не нужно знать SQL), обеспечивая быстрое и эффективное выполнение.
Структура фильтров
Фильтры в Metriox имеют иерархическую структуру:
- Фильтр
- Логика — AND или OR
- Предикаты
- Предикат 1
- Предикат 2
- и так далее
Логика фильтров
Определяет, как комбинируются условия:
- AND — все условия должны выполняться
- OR — хотя бы одно условие должно выполняться
Типы предикатов
Предикат — это отдельное условие фильтра. Он состоит из:
- Тип — событие, свойство или пользователь
- Оператор — операция сравнения
- Значение — с чем сравниваем
- Отрицание — NOT (опционально)
Эти четыре части собираются в одну строку в конструкторе фильтров. Так он выглядит на странице События: переключатель НЕ, поле, оператор и значение, а меню Добавить тип фильтра добавляет следующий предикат.

Предикаты для событий
Фильтрация по названию события:
Event Name equals "button_click"
NOT Event Name equals "button_click"
Event Name contains "purchase"
Event Name startswith "pay"
Операторы для событий:
equals— точное совпадение!=— не равноcontains— содержит подстрокуstartswith— начинается с (только в строке выражения)
Примеры:
| Условие | Что попадёт в выборку |
|---|---|
Event Name equals "purchase_completed" | Только события с названием purchase_completed |
Event Name contains "button" | События button_click, button_view, share_button и другие с этой подстрокой |
NOT Event Name equals "bot_started" | Все события, кроме bot_started |
Предикаты для свойств
Фильтрация по свойствам событий:
plan equals "premium"
NOT plan equals "free"
price > "100"
Операторы зависят от типа данных свойства.
Предикаты для пользователей
Отбирают не отдельные события, а пользователей целиком. В конструкторе это один тип Пользователь: в первом списке строки выберите, что проверить. Список разбит на две группы, и они отвечают на разные вопросы.
| Группа | Вопрос | Пример |
|---|---|---|
| Профиль (сейчас) | кто этот человек | «с Telegram Premium», «язык интерфейса ru», «пришёл по диплинку promo» |
| Активность за период | что он делал за выбранный период | «нажимал кнопки минимум в 5 разных дней», «потратил больше 10 000» |
Пока в списке ничего не выбрано, условие не применяется.
Профиль (сейчас)
Атрибуты профиля Telegram: Telegram Premium, язык интерфейса, юзернейм, имя, фамилия, Telegram ID и параметр диплинка. Ниже, в группе «Найдено у этого бота», перечислены остальные свойства профиля, которые встречаются у вашего бота.
- Значение берётся на сегодня. Профиль хранит только последнее известное значение. Поэтому условие «Premium» в отчёте за прошлый месяц отбирает тех, у кого Premium сейчас, а не тогда.
- Операторы:
equalsиnot equals. Для имени, фамилии, юзернейма и параметра диплинка есть ещёcontains: в именах бывают эмодзи и разный регистр. - «Без Premium» и
not equals«Premium» — разные выборки. «Без Premium» отбирает только тех, про кого известно, что Premium у них нет.not equals«Premium» добавляет к ним людей, чей флаг так и не записался, а на многих ботах таких большинство. - Не больше 4 условий по профилю в одном фильтре. Когда их уже четыре, в новой строке группа «Профиль» недоступна и в списке написано почему. Группа «Активность» остаётся доступной.
В строке выражения над конструктором такое условие выглядит так:
profile $tg.is_premium = "true"
Активность за период
Такое условие сначала считает показатель по каждому пользователю, а потом оставляет тех, кто проходит по порогу. Оно состоит из четырёх частей:
| Часть | Что задаёт | Пример |
|---|---|---|
| Показатель | что считать по пользователю | Количество событий, Дней с активностью, Сумма свойства |
| Считать события с именем | какие события учитывать | successful_payment |
| Окно | считать за весь период или по самому активному дню | Всего / В самый активный день |
| Порог | оператор и число | > 10000 |
Укажите имя события. Без него условие не применяется: «больше 5» чего? Условия в основном конструкторе на счёт не влияют. Считаются только события с именем из этого поля, за выбранный период.
Показатель «Сумма свойства» дополнительно требует числовое свойство и источник — по той же причине, что и метрика Sum: события одного платежа могут прийти от двух источников, и без привязки к одному сумма удвоится. Подробнее: Метрики. Порог для суммы может быть дробным, у остальных показателей — целым.
Окно различает два разных вопроса. «Всего» — это сумма за весь период («потратил больше 10 000 за
месяц»). «В самый активный день» — это максимум по дням: с > это «хотя бы в один день потратил больше
1 000», с < это «каждый день меньше». Для показателя «Дней с активностью» это окно недоступно: внутри
одного дня он всегда равен 1.
Переключателя НЕ у этого типа нет. Чтобы найти тех, кто ни разу не покупал, задайте порог = 0, а не
NOT вокруг > 0. = 0 отбирает только людей, а NOT захватил бы и события групп и каналов, у которых нет
пользователя. В строке выражения NOT перед условием профиля не принимается, а перед условием активности
принимается, но отвечает на этот более широкий вопрос.
Примеры:
| Сегмент | Показатель | Считать события с именем | Окно | Порог |
|---|---|---|---|---|
| Постоянные пользователи (нажимали кнопки минимум в 5 разных дней) | Дней с активностью | callback_query | Всего | >= 5 |
| Платящие | Сумма свойства ($tg.total_amount, Bot API) | successful_payment | Всего | > 10000 |
| Крупная разовая покупка | Сумма свойства ($tg.total_amount, Bot API) | successful_payment | В самый активный день | > 5000 |
| Ни разу не платили | Количество событий | successful_payment | Всего | = 0 |
В строке выражения такое условие выглядит так:
Event Count where "successful_payment" (Total) > 3
Строка выражения
Над конструктором есть строка, в которой тот же фильтр записан текстом. Его можно скопировать, вставить или поправить вручную. Изменения применяются по Enter или когда курсор уходит из строки. Если строка не разбирается, под ней появится причина, а фильтр останется прежним.
- Поле события пишется так:
Event Name,Event Type,Source,Origin,Text,User ID. - Свойство — ключ точно так, как он записан в списке полей:
plan,$tg.chat_type. - Условие по профилю начинается со слова
profile:profile $tg.is_premium = "true". - Значение всегда в кавычках, даже число:
price > "100". Кавычку внутри значения пишите как\", обратную косую черту — как\\:plan equals "say \"hi\"". - Число — с точкой:
"10.5". Логическое значение —"true"или"false". ANDиORможно писать в любом регистре, но в одной строке — только что-то одно.NOTставится перед условием:NOT Event Name equals "bot_started".- Для
User IDдоступны толькоequalsи!=: идентификатор сравнивается целиком, безcontains. - Условие активности обязательно называет событие:
Event Count where "purchase" (Total) >= 2.
Строка — это запись того, что собрано в конструкторе, а не отдельный фильтр. Условие, которое нельзя записать строкой (например, вложенную группу из API), конструктор показывает только для чтения, и на это время строка становится недоступной для правки.
Операторы по типам данных
String (Строка)
Операторы:
equals— точное совпадениеcontains— содержит подстрокуstartswith— начинается с (только в строке выражения)!=— не равно. События, в которых этого свойства нет вовсе, тоже попадут в выборку, как и с переключателем НЕ.
Примеры:
| Условие | Что попадёт в выборку |
|---|---|
plan equals "premium" | Только события с plan = "premium" |
button_name contains "buy" | button_name: "buy_now", "buy_premium", "buy_subscription" |
NOT language equals "en" | Все языки, кроме английского, и события, где язык не записан |
Number (Число)
Операторы:
=— равно!=— не равно>— больше<— меньше>=— больше или равно<=— меньше или равно
Число пишется в кавычках и с точкой: "10.5", а не "10,5".
Примеры:
| Условие | Что попадёт в выборку |
|---|---|
price > "100" | Цена больше 100 |
quantity = "1" | Количество равно 1 |
age >= "18" | Возраст 18 и старше |
NOT rating < "4.0" | Рейтинг 4.0 и выше, а также события, в которых рейтинга нет вовсе |
Дата и время
Сравнивать даты в фильтре пока нельзя. Дата, которую бот отправляет в свойстве, например
"2026-03-01T00:00:00Z", попадает в список полей как строка, и для неё доступны только строковые
операторы: equals найдёт точное совпадение, но «после 1 марта» так не спросить.
Для вопросов «когда» используйте период отчёта. Для «что человек делал за последние N дней» — условие Пользователь → Активность за период.
Boolean (Логический)
Операторы:
equals— равно (true/false)not equals— не равно
Примеры:
| Условие | Что попадёт в выборку |
|---|---|
is_subscriber = "true" | Только подписчики (своё свойство события) |
email_verified = "false" | Email не подтверждён |
NOT has_completed_onboarding = "false" | Завершили онбординг (true или null) |
Комбинирование условий
Логика AND
Все условия должны выполняться одновременно.
Пример:
- AND
Event Name equals "purchase_completed"amount > "500"currency equals "RUB"
В выборку попадут покупки на сумму больше 500 рублей.
Логика OR
Хотя бы одно условие должно выполняться.
Пример:
- OR
Event Name equals "purchase_completed"Event Name equals "subscription_renewed"Event Name equals "trial_started"
В выборку попадёт любое событие монетизации.
AND и OR вместе
В конструкторе весь фильтр соединяется одним способом: либо все условия через AND, либо все через OR. Вложить группу OR внутрь AND в конструкторе нельзя. Такой фильтр можно передать через API; конструктор покажет вложенную группу только для чтения и сохранит её как есть, но редактировать её там не получится.
Частый обходной путь для «одно из нескольких событий» — общий фрагмент в названии:
Event Name contains "click" вместо двух условий через OR.
Отрицание (NOT)
Добавьте NOT к предикату события или свойства для инверсии условия. У предикатов типа Пользователь в конструкторе переключателя NOT нет: используйте оператор not equals или пороги = 0 и < (см. выше).
| Условие | Что попадёт в выборку |
|---|---|
NOT Event Name equals "bot_started" | Все события, кроме bot_started |
NOT plan equals "free" | Все, у кого план не free, включая события, где плана нет вовсе |
NOT age < "18" | Возраст 18 и старше, а также события без возраста — инверсия условия «меньше 18» |
Примеры фильтров
Простые фильтры
Все покупки:
Event Name equals "purchase_completed"
Пользователи с Telegram Premium:
profile $tg.is_premium = "true"
Premium — атрибут профиля, а не свойство события, поэтому это условие типа Пользователь, а не Свойство.
Покупки дороже 1000 руб:
- AND
Event Name equals "purchase_completed"amount > "1000"
Сложные фильтры
Новые премиум-пользователи:
- AND
Event Name equals "subscription_started"plan equals "premium"is_trial = "false"
Нажатия кнопок живыми людьми:
- AND
Event Name contains "button"NOT is_bot = "true"
Проблемные транзакции:
- AND
Event Name equals "payment_failed"attempt_number > "2"amount >= "500"
Сегментация пользователей
Молодая аудитория из России:
- AND
age < "25"country equals "RU"language equals "ru"
High-value пользователи:
- AND
total_spent > "5000"is_subscriber = "true"Event Count where "successful_payment" (Total) >= 3
Применение фильтров
Каждый виджет имеет свои фильтры:
- Виджет «Премиум покупки»
- Тип — Series
- Метрика — Events
- Фильтр
- AND
Event Name equals "purchase_completed"plan equals "premium"
- AND
Фильтр, который нужен в нескольких местах, сохраните как сегмент: его можно применить в отчётах и вставить в аудиторию рассылки, не собирая условия заново.
Технические детали
Компиляция в SQL
Фильтры компилируются в условия SQL WHERE.
Фильтр:
- AND
Event Name equals "purchase_completed"amount > "500"
SQL (концептуально):
WHERE event_name = 'purchase_completed'
AND JSONExtractFloat(props, 'amount') > 500
Вам не нужно знать SQL — Metriox автоматически преобразует ваши фильтры в оптимизированные запросы.
Производительность
Metriox использует ClickHouse для быстрого выполнения запросов:
- Индексация по
event_name - Эффективная работа с JSON свойствами
- Параллельное выполнение запросов
Оптимизация:
- Фильтруйте по событиям в первую очередь
- Используйте
equalsвместоcontainsгде возможно - Ограничивайте временной диапазон
Лучшие практики
Построение фильтров
- Начинайте с фильтрации по событиям
- Добавляйте условия по свойствам
- Используйте NOT осторожно (может быть медленнее)
Тестирование
- Проверяйте фильтры на небольших временных диапазонах
- Сравнивайте результаты с ожидаемыми
- Используйте таблицы для проверки деталей