Skip to content

Instantly share code, notes, and snippets.

@dyrkow
Last active September 14, 2023 13:16
Show Gist options
  • Save dyrkow/0eccda7aa3611245be5ce72fd8a970a7 to your computer and use it in GitHub Desktop.
Save dyrkow/0eccda7aa3611245be5ce72fd8a970a7 to your computer and use it in GitHub Desktop.
Loyalty system
interface ILoyaltySystem {
/**
*/
findMember(search: string): Promise<LoyaltyMember[]>;
registerMember(name: string, phone: string): Promise<id>;
}

Система лояльности

Система лояльности - это комплекс мер, направленных на удержание клиента, увеличение его уровнять доверия к организации и налаживание длительных отношений с клиентом. Каждая система поддерживает множество программ лояльности.

Программа лояльности

Программа лояльности - определяет правила по которым, клиент получит вознаграждение, за сотрудничество с системой.

Программы делятся на 2 категории:

  1. Балансные - в качестве источника скидки/оплаты используется баланс карты/серитфиката
  2. Скидочные - клиент получается определенную скидку в процентах/рублях

Балансные программы

Программы данной категории бывают:

  1. Бонусная программа (bonus) - клиенты копят и тратят бонусы по определенному курсу
  2. Продуктовая программа (product) - клиенты копят количество купленного товара, например "чашки". Далее они могут получить одну "чашку" кофе бесплатно за 5 накопленных, для этого происходит списание баланса.
  3. Сертификаты (certificate) - клиентам выдаются сертификаты на определенную сумму, с которых можно списать сумму целиком либо частично.

Скидочные программы:

Данные программы предоставляют клиенту определенную скидку на весь заказ. Данные программы моегут иметь уровни, которые предоставляются клиенту за определенные достижения, например за определенный период времени он совершил определенное количество покупок на определенную сумму.

Модули системы лояльности

  1. Управляет учетными записями (members/customer) клиентов - регистрация в системе, поиск, блокировка и тд
  2. Позволяет управлять балансом (transactions) - списывает бонусы, копит бонусы
  3. Позволяет управлять уровнями (tiers/level) - выдать/отнять уровень лояльности клиенту
  4. Управление группами покупателей (segments/tags) - сотрудники, клиенты сбербанка и тд
  5. Реферальная система (referred members)
  6. Управление маркетинговыми компаниями (campaigns/rules) - скидка 25% пенсионерам, бесплатная каждая 2 кружка

Участник системы лояльности

Участник системы лояльности (member) - человек, который подтвердил свое участие в системе лояльности.

Функции:

  1. Регистрация участника

Чтобы зарегистрировать клиента, достаточно указать имя и номер телефона (в UDS регистрация не доступна, клиенты регаются сами)

  1. Поиск участника

Искать участника можно по множеству полей:

  • Номер телефона
  • Номер карты
  • track2 номер карты
  • временные коды - в UDS по ним можно найти сертификат, скидочную карту и участника лояльности
  • id - в UDS надо использовать их идентификатор
  1. Расчет размера скидки для продажи

Возвращает размер скидки для данной продажи. Если клиент был найден по скидочной карте, вернется скидка. Если клиент был найден по бонусной карте, вернется количество бонусов Если клиент предоставил сертификат, вернется количество рублей для списания

  1. Проведение операции по лояльности

По сути создание продажи в системе лояльности, при этом указывается подтвержденный размер скидки.

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

Уровни лояности (tier, level) - набор привелегий, купленных/предоставляемых клиенту за определенные достижения

От уровня лояльности может зависить размер скидки

Группы

Группа участников системы лояльности (segment, tags) - метка участинка системы, позволяющая сегментировать привелегии между группами клиентов.

Компании

Маркетинговая компания (compaings, rules) - правило, говорящее о том, что клиенты такой-то группы, такого-то уровня должны получать скидку в таком-то размере. Либо клиенты из такой-то группы за каждыйе 100 рублей получат 1 бонусный балл.

Вопросы:

  1. Расплачиваемся сертификатом

1.1 Кассир забивает товарами заказ
1.2 Кассир переходит на экран оплаты заказа
1.3 Кассир выбирает метод оплаты "Сертификат"
1.4 Кассир видит экран ввода номера сертификата/карты нажимает кнопку дальше
1.5 Кассир видит экран с вводом размера оплаты (вызывается calculate), указывает размер, подтверждает (создается транзакция лояльности)
1.6 Кассир возвращает на экран оплаты и видит оплату сертификатом (оплата сохранилась в заказе)
1.7 Кассир оплачивает заказ остальными методами оплаты

  1. Расплачиваемся бонусами

2.1 Кассир ищет клиента в системе лояльности
2.2 Кассир забивает заказ
2.3 Кассир переходит на экран оплаты
2.4 Кассир выбирает способ оплаты "Бонусы"
2.5 Кассир видит экран с вводом размера оплаты (вызывается calculate), указывает размер, подтверждает (создается транзакция)
2.6 Кассир возвращется на экран оплаты и видит оплату бонусами (оплата сохранилась в заказ)
2.7 Кассир полачивает заказ остальными методами оплаты

  1. Скидочная карта

3.1 Кассир ищет клиента в системе лояльности
3.2 Кассир забивает заказ
3.3 На экране заказа отображается кнопка "Расчитать" напротив поля "Скидка по карте лояльности", он нажимает
3.4 Кассиру расчитывается скидка и она применяется к заказу
3.5 Кассир переходит на экран оплаты

  1. Оплата абонементом (у нас их нет, фантазия)

4.1 Кассир забивает товарами заказ
4.2 Кассир переходи на экран оплаты
4.3 Кассир выбирает способ оплаты "Абонементом"
4.4 Кассир видит сообщение (вызывается calculate), что будет списан 1 что-то из 10 штук на сумму 500 рублей, подтверждает (создается транзакция)
4.5 Кассир видит новую оплату Абонементом на сумму 500 рублей.

  1. Копим бонусы

5.1 Кассир забивает товарами заказ
5.2 Кассир ищет клиента с системе лояльности и добавляет к заказу
5.3 Кассир переходи на экран оплаты
5.4 Кассир оплачивает заказ
5.5 На стороне бэка создается транзакция лояльности на начисление баллов, если есть бонусная карта и нету других транзакций

  1. Кассир редактирует заказ

6.1 Отменяются все типы оплат а так же транзакция лояльности (в том числе зачисление баллов)
6.2 Кассир изменяет состав заказа
6.3 Кассир оплачивает заказ
6.4 Кассир пытается вспомнить что клиент хотел сделать, списать баллы или копить.

  1. Кассир отменяет заказ

7.1 Отменяются все типы оплаты, а так же транзакция лояльности (в том числе зачисление баллов)
7.2 Кассир видет отмененный заказ

Референс

  1. https://docs.maxma.com/api/#tag/Rabota-s-klientskoj-bazoj/paths/~1get-balance/post
  2. https://dev.moysklad.ru/doc/api/loyalty/1.0/#vozwrat
  3. https://frontol.ru/news/frontol-priority-api-ekonomte-na-sistemakh-loyalnosti/?utm_source=google.com&utm_medium=organic&utm_campaign=google.com&utm_referrer=google.com
  4. https://docs.rkeeper.ru/delivery/sozdanie-zakaza-s-loyal-nost-yu-74645587.html
  5. https://dev.wix.com/docs/rest/api-reference/wix-loyalty-program/accounts/get-transaction
  6. https://developer.bigcommerce.com/docs/rest-management/customers
  7. https://api-ru.iiko.services/#tag/Customers/paths/~1api~11~1loyalty~1iiko~1customer~1info/post
  8. https://docs.uds.app/#tag/Operations/paths/~1operations~1{id}/get
  9. https://help.openloyalty.io/members#personal-data
// Участник программы лояльности
type LoyaltyMemberDTO = {
id: string;
name: string;
phone: string;
gender?: string;
birthday?: string;
comment?: string;
level?: LoyaltyMemberLevelDTO;
segments?: LoyaltyMemberSegment[],
balance: number;
}
// Уровень программы лояльности регламентируют уровень привелегий
// уровни преобретаются в бонусной системе за баллы, в скидочной за сумму заказов
type LoyaltyMemberLevelDTO = {
id: string;
name: string;
}
// Сегмент участника программы лояльности
// используется для разделения различных групп пользователей, по определнным признакам
// что позволяет применять различные правила
type LoyaltyMemberSegment = {
id: string;
name: string;
}
// Искать пользователя можно по phone, code, id, track, card_number
enum LoyaltyTransactionStatus {
completed = 'completed';
canceled = 'canceled';
}
// Транзакция распределяется на весь заказ, за исключением не акционных товаров
// Некоторые системы делают скидку на конкретный товар, но надо ее вытаскивать и распределять на все
// так будет проще, либо добавить поддержку такую
type LoyaltyTransaction {
id: string;
status: LoyaltyTransactionStatus;
date: string;
program: LoyaltyProgram;
value: number; // Количество баллов, которые будут списаны/количество стикеров/ рублей из сертификата/ скидка в рублях
}
enum LoyaltyProgramType {
balance = 'balance',
discount = 'discount',
}
type LoyaltyProgram = {
id: string;
name: string;
type: LoyaltyProgramType;
}
type LoyaltyCalculationRequest = {
id: string; // Идентификатор транзакции
auth: LoyaltyAuth, // Данные используются для определения способа индентификации,в зависимости от него будут предприняты меры безопасности
memberId: string; // cardId - по идее надо, но это только для Dooglys
purchase: LoyaltyPurchase;
}
enum LoyaltyAuthType {
NUMBER = 'card_number',
TRACK2 = 'track2',
PHONE = 'phone',
CODE = 'code',
ID = 'id'
}
type LoyaltyAuth = {
type: LoyaltyAuthType;
value: string;
}
type LoylatyTransactionResponse = {
program: LoyaltyProgram; // По какой программе проходит запрос, по ней можно понять, делать скидку или добавить метод оплаты
comment: string; // Доп информация, которую надо показать
value: number; // Размер скидки в рублях, если скидочная программа или Максимальное количество баллов для списания (баланс сертификата или баланс пользователя)
}
type LoyaltyPurchasePosition = {
id: string;
name: string;
price: number;
quantity: number;
}
type LoyaltyPurchase = {
id: string;
number: string; // Номер продажи, некоторые системы поддерживают, можно будет посмотреть
positions: LoyaltyPurchasePosition;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment