Группы клиентов

Источник требований

Референс

YumaPOS — customers-groups (главный источник для правил автозаполнения)

Группы клиентов — инструмент сегментации. Владелец франшизы объединяет клиентов в группы вручную или по правилам, чтобы потом таргетировать промо-кампании, скидки и рассылки (модули Phase 3, начиная с BR 3.4).

Одна группа принадлежит одной франшизе. Между франшизами группы не пересекаются.


Две категории групп

КатегорияКак формируетсяКогда применять
СтатическаяАдмин явно добавляет/удаляет клиентов«VIP-клиенты по личному приглашению», «Участники закрытого клуба» — списки где критерий не формализован
ДинамическаяСистема пересчитывает членство по правилам«Именинники декабря», «Клиенты с чеком > 5000 ₽», «Не были более 60 дней» — где есть измеримый критерий

Принципиально: в одной группе членство либо полностью ручное, либо полностью автоматическое. Нельзя в одной группе одновременно добавлять вручную и по правилам.


Сущность «Группа»

ПолеОбязательностьОписание
НазваниеОбязательноУникально в рамках франшизы при deleted_at IS NULL
ОписаниеНеобязательноКороткое пояснение зачем группа
ТипОбязательноСтатическая / Динамическая
ПравилаОбязательно для dynamicДля dynamic — структура из условий (см. )
Кто создалАвтофлагСотрудник, создавший группу
СтатусОбязательноАктивна / Удалена (soft delete)

Правила автозаполнения (для динамических групп)

Админ описывает условия, по которым клиенты попадают в группу. Несколько условий объединяются логикой AND (все должны выполниться). Максимум 5 условий на одну группу — чтобы не терять прозрачность.

Каталог правил (MVP)

ПравилоПараметрыПримеры использования
Сумма покупок за всё времяоператор (>, >=, <, , between), сумма«LTV от 50 000 ₽» для VIP-группы
Сумма покупок за периодоператор, сумма, N дней«Чек от 5000 ₽ за последние 30 дней»
Сумма покупок в диапазон датоператор, сумма, start_date, end_date«Покупали на 10 000 ₽ в декабре 2025»
Дни без активностиоператор (>, >=), N дней«Не заказывали более 60 дней» (churn-группа)
День рождениямесяц + день ± N дней«Именинники ±7 дней» для промо
Городсписок городов«Клиенты Москвы»
Зона доставкисписок delivery_zone_id«Клиенты зоны Центр»
Полсписок значений«Женщины» для 8 марта
Источник регистрациисписок значений«Только POS-клиенты»
Включение/исключение группсписок group_id с флагом IN/NOT IN«VIP + не включая ‘Сотрудники’»

Отложено (не в MVP)

  • По баллам лояльности (диапазон баланса) — требует Loyalty Service, появится в BR 3.3
  • По оценкам заказов (клиенты, ставящие 4-5 звёзд) — требует системы оценок, отложено
  • Логический OR между условиями (сейчас только AND)
  • Вложенные условия (группа A AND (B OR C))

Механика пересчёта динамических групп

Членство клиента в динамической группе вычисляется на бэке и кэшируется для быстрого чтения в админке.

Когда пересчитывается

  1. Раз в сутки по расписанию (03:00 МСК) — полный пересчёт всех динамических групп всех франшиз. Гарантирует что даже при сбое очереди событий группы в корректном состоянии к утру
  2. Триггерно по событию customer.updated — если клиент изменился (новые адреса, новое имя, ДР) — пересчитывается только для этого клиента, только для затронутых групп
  3. Триггерно по событию order.closed — при закрытии заказа пересчитывается только для клиента этого заказа (если клиент прикреплён)

Что значит «пересчитывается для клиента»

  • Система проверяет: подходит ли клиент под правила каждой динамической группы его франшизы
  • Если клиент раньше был в группе, а теперь не подходит → исключается (членство снимается)
  • Если клиент раньше не был, а теперь подходит → добавляется

Для админа

  • В карточке группы есть кнопка «Пересчитать сейчас» — триггерит ручной пересчёт членства (на случай если ждать до утра нельзя)
  • В карточке группы видна дата последнего пересчёта: «Последний пересчёт: 2026-04-20 03:15»

Бизнес-правила

  1. Один клиент — в нескольких группах одновременно. И статические, и динамические. Принадлежность не взаимоисключается.
  2. Уникальность имени группы per franchise_id при deleted_at IS NULL. Две активные группы с одним именем — нельзя.
  3. Soft delete группыdeleted_at = now(). Членство клиентов (customer_group_members) сохраняется в истории, но в UI фильтруется по deleted_at IS NULL. При восстановлении группы (если понадобится) членство не пересчитывается автоматически — админ должен жать «Пересчитать» (для dynamic) или добавить вручную (для static).
  4. Удалить группу с активными промо/скидками нельзя — если группа используется как аудитория в активной промо-кампании (BR 3.4+) или в скидке (BR 3.3+) — сначала отвязать. В MVP этой проверки нет (нет ещё промо/скидок), но заложить в будущих BR.
  5. Максимум 5 условий в правилах динамической группы — чтобы правило было понятным админу. Если нужно сложнее — создаётся несколько групп с операцией «включение/исключение».

Ролевая матрица

ДействиеВладелец франшизыВладелец партнёраОбычный сотрудникPermission
Список групп в админкеcustomer_groups.read
Карточка группыcustomer_groups.read
Создание группыcustomer_groups.edit
Редактирование (название, описание, правила для dynamic)customer_groups.edit
Добавление/удаление клиентов в статическую группуcustomer_groups.edit
Удаление группыcustomer_groups.edit
Ручной пересчёт динамической группыcustomer_groups.edit

Почему партнёр-франчайзи не управляет группами

Группы — единые на уровне франшизы. Один партнёр не должен влиять на сегментацию, используемую другими партнёрами. Управление группами — в зоне владельца бренда.


Список групп

Колонки

  • Название
  • Тип (Статическая / Динамическая) — chip
  • Количество клиентов (вычисляемое)
  • Дата создания
  • Дата последнего пересчёта (для dynamic; для static — прочерк)
  • Статус (Активна / Удалена — в основном списке скрыто)

Фильтры

  • По типу (Статическая / Динамическая)

Поиск

  • По подстроке названия

Пагинация

  • 20 групп на страницу

Карточка группы

Для статической группы

  • Шапка: название, описание, тип «Статическая», количество клиентов
  • Вкладка «Участники» — таблица клиентов группы с колонками (ФИО, телефон, email, дата добавления в группу)
  • Кнопка «Добавить клиентов» → модалка поиска клиентов по подстроке → multi-select → добавить
  • На строке клиента — кнопка «Убрать из группы»

Для динамической группы

  • Шапка: название, описание, тип «Динамическая», количество клиентов, дата последнего пересчёта
  • Вкладка «Правила» — конструктор:
    • Добавить правило из выпадающего списка
    • Настройка параметров правила
    • До 5 правил
    • Кнопка «Сохранить правила» → триггерит пересчёт
  • Вкладка «Предпросмотр участников» — текущая выборка (read-only, нельзя добавить/убрать вручную)
  • Кнопка «Пересчитать сейчас» рядом с шапкой

Общие действия

  • Кнопка «Редактировать» — изменить название, описание
  • Кнопка «Удалить» — soft delete с подтверждением

Пустые состояния

Групп пока нет

  • «Групп пока нет. Создайте первую группу чтобы сегментировать клиентов»
  • Кнопка «Создать группу»

В статической группе нет участников

  • «В группе пока нет участников. Добавьте клиентов из списка»
  • Кнопка «Добавить клиентов»

В динамической группе нет подходящих клиентов

  • «По текущим правилам ни один клиент не подходит. Проверьте условия или дождитесь пересчёта (последний: …)»

Связи с другими модулями

  • Клиенты — основная связь: группа содержит клиентов; в карточке клиента показывается его принадлежность к группам
  • Торговые точки — правила «по зоне доставки» ссылаются на delivery_zone_id
  • Роли — новые permissions customer_groups.read / customer_groups.edit
  • Промо-кампании (BR 3.4) — группы клиентов как аудитория промо. Ещё не существует модуля, появится позже
  • Скидки (BR 3.3) — скидки могут быть привязаны к группам (например, скидка VIP 10%)

Ссылки