Группы клиентов
Источник требований
Референс
YumaPOS — customers-groups (главный источник для правил автозаполнения)
Группы клиентов — инструмент сегментации. Владелец франшизы объединяет клиентов в группы вручную или по правилам, чтобы потом таргетировать промо-кампании, скидки и рассылки (модули Phase 3, начиная с BR 3.4).
Одна группа принадлежит одной франшизе. Между франшизами группы не пересекаются.
Две категории групп
| Категория | Как формируется | Когда применять |
|---|---|---|
| Статическая | Админ явно добавляет/удаляет клиентов | «VIP-клиенты по личному приглашению», «Участники закрытого клуба» — списки где критерий не формализован |
| Динамическая | Система пересчитывает членство по правилам | «Именинники декабря», «Клиенты с чеком > 5000 ₽», «Не были более 60 дней» — где есть измеримый критерий |
Принципиально: в одной группе членство либо полностью ручное, либо полностью автоматическое. Нельзя в одной группе одновременно добавлять вручную и по правилам.
Сущность «Группа»
Правила автозаполнения (для динамических групп)
Админ описывает условия, по которым клиенты попадают в группу. Несколько условий объединяются логикой 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))
Механика пересчёта динамических групп
Членство клиента в динамической группе вычисляется на бэке и кэшируется для быстрого чтения в админке.
Когда пересчитывается
- Раз в сутки по расписанию (03:00 МСК) — полный пересчёт всех динамических групп всех франшиз. Гарантирует что даже при сбое очереди событий группы в корректном состоянии к утру
- Триггерно по событию
customer.updated— если клиент изменился (новые адреса, новое имя, ДР) — пересчитывается только для этого клиента, только для затронутых групп - Триггерно по событию
order.closed— при закрытии заказа пересчитывается только для клиента этого заказа (если клиент прикреплён)
Что значит «пересчитывается для клиента»
- Система проверяет: подходит ли клиент под правила каждой динамической группы его франшизы
- Если клиент раньше был в группе, а теперь не подходит → исключается (членство снимается)
- Если клиент раньше не был, а теперь подходит → добавляется
Для админа
- В карточке группы есть кнопка «Пересчитать сейчас» — триггерит ручной пересчёт членства (на случай если ждать до утра нельзя)
- В карточке группы видна дата последнего пересчёта: «Последний пересчёт: 2026-04-20 03:15»
Бизнес-правила
- Один клиент — в нескольких группах одновременно. И статические, и динамические. Принадлежность не взаимоисключается.
- Уникальность имени группы per
franchise_idприdeleted_at IS NULL. Две активные группы с одним именем — нельзя. - Soft delete группы —
deleted_at = now(). Членство клиентов (customer_group_members) сохраняется в истории, но в UI фильтруется поdeleted_at IS NULL. При восстановлении группы (если понадобится) членство не пересчитывается автоматически — админ должен жать «Пересчитать» (для dynamic) или добавить вручную (для static). - Удалить группу с активными промо/скидками нельзя — если группа используется как аудитория в активной промо-кампании (BR 3.4+) или в скидке (BR 3.3+) — сначала отвязать. В MVP этой проверки нет (нет ещё промо/скидок), но заложить в будущих BR.
- Максимум 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%)