Лояльность

демо UI/UX · Этап 0 · реализация после утверждения

Настройки лояльности

Программа лояльности заведения. GET/PUT /loyalty/settings. Режим — один на заведение.
Уровни включены
Выключить — уровни/кешбек не считаются (isEnabled)
Режим вознаграждения · mode
Скидка %Кешбек %
Что дают уровни: скидка на заказ сразу или кешбек на баланс после. Переключает подписи во всём разделе.
Окно расчёта трат, мес · windowMonths Скользящее окно 1–60, дефолт 6. Траты старше окна выпадают → уровень может понизиться.
Лимит оплаты кешбеком, % · cashbackPaymentLimitPercent Макс. доля заказа, оплачиваемая кешбеком. 0–100.
Кешбек начисляется на баланс клиента у этого вендора после успешного заказа (баланс — в микросервисе финансов), потратить можно только здесь. Скидка уменьшает сумму заказа сразу.

Уровни лояльности

Уровень — по сумме трат в «Тандыр» за скользящее окно 6 мес. Пересчёт после каждого успешного заказа + ночной крон (окно скользит, уровень может понизиться).
Режим вознаграждения: Кешбек %
Один на заведение. Меняется в Настройках — там же окно трат и лимит оплаты кешбеком.
🥉

Bronze

порог: от 0 c
3% кешбек с заказа
412 клиентов на уровне
🥈

Silver

порог: от 15 000 c
5% кешбек с заказа
86 клиентов на уровне
🥇

Gold

порог: от 40 000 c
8% кешбек с заказа
17 клиентов на уровне
Изменение порогов / удаление уровня. Перед сохранением — предпросмотр: «86 клиентов перейдут с Silver на Bronze». Пересчёт фоновый, кешбек-балансы не трогаем. Удаление уровня с клиентами — только с переносом на соседний.
Скидка уменьшает сумму заказа сразу. Кешбек начисляется на баланс клиента у этого вендора после успешного заказа (баланс живёт в микросервисе финансов) — потратить можно только здесь же.

Клиенты

Существующая страница «Клиенты» — лояльность встраивается во вкладку панели. Зелёным новое помечено то, что добавляет фича.
Айбек Т.
+996 555 12-34-56
Silver новое 4.8
Гульнара С.
+996 700 98-76-54
Gold 4.9
ОсОО «Айдамир»
+996 312 45-67-89
Bronze 4.5
Тимур К.
+996 555 11-22-33
Bronze 4.2
Асель Ж.
+996 770 33-44-55
Bronze 5.0

Заказ #1043 выполнен

06.07 14:02 · Айбек Т. · Silver на момент заказа
Состав и выгоды
Плов «Тандыр»560 c
Салат «Ачичук»320 c
Чай × 2360 c
Промокод WELCOME10 · −10%−124 c
Оплачено кешбеком−460 c
Оплачено деньгами656 c
Кешбек начислен · 5% от 656 c+33 c
Блок «Выгоды» обязателен в карточке заказа — вендор видит уровень клиента и каждую применённую выгоду отдельной строкой: акция, промокод, скидка уровня, оплата кешбеком, начисленный кешбек.
Зафиксировать до реализации: база начисления кешбека — до или после списания кешбека (в демо: после, от оплаченного деньгами); идёт ли кешбек-часть в totalSpent (в демо: нет).

Промокоды

Статус вычисляется: активен → приостановлен (вручную) / истёк (по дате) / исчерпан (по лимиту). Клик по строке — аналитика.
КодВыгодаСрокИсп. / лимитМин. заказСтатус
Гонка на общем лимите. Слот резервируется при применении кода в чекауте (TTL ~10 мин), подтверждается при оплате. Два клиента на последнем слоте → второй видит «код исчерпан» до оплаты, а не после.

WELCOME10 активен

Скидка 10% · 01.06 — 31.07 · лимит 1/клиент · мин. заказ 500 c
Применений
128
96 уникальных клиентов
Сумма заказов
214 500 c
средний чек 1 676 c
Выгода клиентам
18 320 c
8,5% от суммы заказов
Осталось слотов
172 / 300
до 31.07 · 25 дней

Динамика применений по дням

последние 14 дней
23.06 · 4
23
24.06 · 6
24
25.06 · 5
25
26.06 · 8
26
27.06 · 7
27
28.06 · 15
28
29.06 · 17
29
30.06 · 11
30
01.07 · 9
01
02.07 · 12
02
03.07 · 8
03
04.07 · 10
04
05.07 · 16
05
06.07 · 13
06

Конверсия: новые vs существующие

«новый» = первый успешный заказ у вендора с этим кодом
62 новых клиента · 65% 34 существующих · 35%
ROI-строка: выгода 18 320 c принесла 62 новых клиента → CAC ≈ 296 c. Если атрибуция невозможна — блок скрываем (спека: «если возможно»).

Акции и комбо

Акция с условием («закажи на X — получи Y», по minOrderInCents) и скидка на комбо (окно дат). Ограничены датами, можно приостановить.
АкцияТипУсловие → выгодаПериодСтатус
Скидка за чекусловиеот 1 500 c → скидка 10%01.07 — 20.07активна
Комбо «Обед»скидка на комбо560 c → 300 c (новая цена)19.07 — 30.07активна
Сет «Той»скидка на комбо1 200 c → −30%15.06 — 15.07приостановлена
Кешбек-бустерусловиеот 3 000 c → кешбек 15%15.07 — 31.07запланирована
Связь со складом/каталогом. Комбо ушло в стоп-лист (/stop-list-combos) → скидка/комбо автоматически скрывается у клиента, у вендора бейдж «⚠ недоступно».

Как акции видит клиент — карточка заведения

Блок «Акции» в карточке заведения C2C. Полные экраны клиента — «Как видит клиент».

до 20.07
Скидка 10% от 1 500 c
Применится автоматически в корзине
комбо · до 30.07
Комбо «Обед» · 300 c 560 c
Плов + салат + чай — скидка на окно дат
с 15.07
Кешбек 15% от 3 000 c
Анонс — скоро старт

Как видит клиент

Клиентское приложение C2C. Лояльность живёт внутри карточки заведения — у клиента N независимых профилей.
Экраны клиента вынесены в отдельный прототип в дизайне batele-c2c (iPhone-рамки, токены из index.css, паттерны «выбранного флоу»): заведение · мой уровень, все уровни, корзина с промокодом и кешбеком, история кешбека, ошибки кода, пуши. Ниже — оглавление экранов.
Нотификации (вопрос №6). Кандидаты на push: «уровень повышен до Gold 🥇», «+33 c кешбека за заказ», «акция скоро закончится». В демо не зашиты — решить в проработке.

Логика и правила

Всё в разрезе «клиент + вендор»; кешбек — баланс в микросервисе финансов.
Прото старше финального бэка. Часть «открытых вопросов» ниже бэк уже закрыл: режим — один на заведение; траты — скользящее окно windowMonths (не «за всё время»); лимит оплаты кешбеком — cashbackPaymentLimitPercent; уровень+акция+промокод суммируются в totalDiscountInCents. Актуальные открытые вопросы — в комментах issue #464.

Изоляция по вендорам

Клиент · Айбек Т.
один аккаунт C2C
Профиль в «Тандыр»
Silver потрачено 24 300 c · кешбек 460 c
Профиль в «Кофейня Bloom»
Gold потрачено 41 200 c · скидка 7%
Профиль в «Сушистор»
Bronze потрачено 1 900 c · кешбек 12 c

Уровни, траты, кешбек, промокоды и акции никогда не пересекают границу вендора.

Кешбек в микросервисе финансов

начисление

После успешного заказа: % уровня (или кешбек-акции/промокода) от базы начисления → на баланс «клиент + вендор». Идемпотентно по orderId.

списание

Оплата заказа: hold при оформлении → confirm при успехе, release при отмене. Лимит доли оплаты кешбеком — вопрос №3.

откат

Возврат/отмена: снимаем начисленный кешбек (баланс может уйти в минус — гасится следующими начислениями), возвращаем списанный, откатываем totalSpent.

Порядок применения выгод предложение — зафиксировать

каталог
Комбо / спеццена

Заменяет цены позиций набора. База для всего дальнейшего расчёта.

акции
Акция с условием

Проверяем «сумма ≥ X» по сумме после комбо. Скидка акции уменьшает чек.

промокод
Промокод

К сумме после акций. Со скидкой уровня не стекается — действует большая выгода (предложение к вопросу №4).

уровень
Скидка уровня · если режим «скидка»

Если у заведения режим «кешбек» — шаг пропускается, кешбек считается в конце.

финансы
Оплата кешбеком

Списание с баланса — последним, с итоговой суммы. Кешбек-часть не входит в totalSpent и в базу начисления (демо-решение).

финансы
Начисление кешбека

% уровня от суммы, оплаченной деньгами. Округление — до 1 c.

Edge cases

КейсПоведение (предложение)Где видно в UI
Возврат / отмена заказаОткат totalSpent, снятие начисленного кешбека, возврат списанного; уровень может понизитьсядетализация клиента · «откат»
Оплата кешбеком и тратыКешбек-часть не входит в totalSpent и в базу начисления (вопросы №2/№3)детализация заказа · «5% от 656 c»
ОкруглениеКешбек/скидка — до 1 c, в пользу клиента не накапливаемчекаут · «+33 c»
Вендор меняет порогиФоновый пересчёт всех профилей + предпросмотр «N клиентов сменят уровень»уровни · warning
Удаление уровняТолько с переносом клиентов на соседний уровень; балансы не трогаемуровни · модалка
Гонка на лимите промокодаРезерв слота в чекауте (TTL 10 мин) → confirm при оплатечекаут · «код исчерпан» сразу
Промокод + оплата кешбекомРазрешено: промокод режет чек, кешбек списывается с остаткачекаут · порядок строк
Комбо-позиция в стоп-листеКомбо скрыто у клиента, у вендора бейдж «⚠ позиция недоступна»акции и комбо

Открытые вопросы решить до реализации

1 · Режим скидка/кешбек. Один на заведение или на каждый уровень? Демо: на заведение.
2 · Период расчёта трат. За всё время или скользящее окно (6 мес) с понижением? Демо: за всё время, понижение только при возврате.
3 · Лимит оплаты кешбеком. 100% чека или потолок (напр. 50%)? Демо: 100%.
4 · Стекинг. Уровень + промокод + акция — приоритеты? Демо: большая из выгод, порядок выше.
5 · Сгорание кешбека. Нужен ли срок жизни баланса? Демо: не сгорает, поле заложить в модель.
6 · Push-уведомления. Повышение уровня, начисление кешбека, конец акции?

Этапы реализации

Акыл · этап 0
Демо UI/UX — этот прототип

Согласование с командой. Реализация не начинается до утверждения демо.

backend
Модель лояльности

Уровни, расчёт скидок/кешбека, интеграция с микросервисом финансов.

backend
Промокоды + аналитика

Лимиты, резервирование слотов, счётчики, конверсия.

backend
Акции и комбо

Условия, наборы, календарь активности, связь со стоп-листом каталога.

frontend
UI админки (web + mobile) и клиентского приложения

Разделы из этого прототипа.

QA
Тестирование edge cases

Возвраты, лимиты, гонки, комбинирование выгод — таблица выше как чек-лист.