Обзор
Промо-система включает три связанных механизма:- Промокоды — одноразовые/многоразовые коды для бонусов
- Промо-группы — тарифные группы со скидками и приоритетами
- Персональные промо-предложения — адресные акции от администратора
Промокоды
5 типов промокодов
Создание промокода (админ)
- Выбор типа (5 вариантов)
- Ввод кода (3-20 символов,
[A-Za-z0-9_-], уникальный) - Параметры в зависимости от типа:
- Balance: сумма в рублях (1-10 000)
- Days / Trial: дни (1-3650)
- Discount: процент (1-100)
- Group: выбор из существующих промо-групп
- Максимум использований (0 = безлимит)
- Срок действия в днях (0 = бессрочно)
- Для discount: длительность скидки в часах (0 = до первой покупки)
Активация пользователем
Пользователь вводит код через кнопку “Промокод” в главном меню. Проверки перед активацией:- Формат кода: 3-50 символов,
[A-Za-z0-9_-] - Rate limiting: максимум 5 неудачных попыток за 5 минут
- Дневной лимит: максимум 5 успешных активаций за 24 часа
- Код существует, активен, не исчерпан
- Пользователь еще не использовал этот код
- Для
first_purchase_only— пользователь не имел платной подписки
Эффекты при активации
Если у промокода любого типа указан promo_group_id, промо-группа назначается дополнительно при активации.
Управление (админ-панель)
- Список промокодов с пагинацией (10 на страницу)
- Детали: тип, статус, использования, срок
- Редактирование: срок, максимум использований, сумма/дни
- Переключение
first_purchase_only - Статистика: общее число, сегодня, история активаций с именами
- Удаление с подтверждением
Промо-группы
Что такое промо-группы
Промо-группы — это тарифные уровни, определяющие скидки для пользователей. Каждый пользователь может состоять в нескольких группах, а основная определяется по приоритету (чем выше — тем важнее).Типы скидок
Пример period_discounts:
{60: 10, 90: 20, 180: 40, 360: 70} — 10% за 60 дней, 70% за год.
Скидки для базовой группы
Для пользователей без промо-группы (или в группе по умолчанию) доступны базовые скидки за период:Ограничение серверов
Промо-группы могут ограничивать доступные серверы через связь с server_squads. Если привязаны серверы — пользователь видит только их.Скидки на аддоны
Флагapply_discounts_to_addons (по умолчанию true) определяет, применяются ли скидки группы к дополнительным покупкам (трафик, устройства).
Автоматическое назначение по тратам
Промо-группы с полемauto_assign_total_spent_kopeks автоматически назначаются пользователям при достижении порога трат:
- После каждого платежа проверяется порог
- Система находит лучшую подходящую группу (порог меньше или равен тратам пользователя)
- Группа добавляется (не заменяет другие)
- Администратор получает уведомление
Управление (админ-панель)
- Создание: название, приоритет, скидки (трафик, серверы, устройства), период-скидки, авто-порог
- Редактирование: все поля, переключение скидок на аддоны
- Просмотр участников с пагинацией
- Удаление: с подтверждением, участники переносятся в группу по умолчанию. Группу по умолчанию удалить нельзя.
Персональные промо-предложения
Типы предложений
Как работают
- Администратор выбирает шаблон предложения
- Выбирает сегмент пользователей или конкретного пользователя
- Система создает индивидуальные записи DiscountOffer с ограниченным сроком действия
- Пользователям отправляется сообщение с кнопкой CTA
- Пользователь нажимает кнопку и предложение активируется
Тестовый доступ к серверам
Предложение test_access:- Указываются серверы (UUID) и длительность (часы)
- При активации создаются записи SubscriptionTemporaryAccess
- Серверы добавляются в подписку пользователя и синхронизируются с RemnaWave
- По истечении срока доступ автоматически убирается фоновой задачей
Шаблоны предложений
Шаблоны содержат:- Текст сообщения (с плейсхолдерами:
{discount_percent},{valid_hours},{test_duration_hours},{server_name}) - Текст кнопки
- Срок действия предложения (часы)
- Процент скидки или длительность тестового доступа
- Список серверов (для test_access)
Отправка предложений
По сегменту:- Выбор шаблона, выбор сегмента, массовая отправка
- Для test_access: фильтруются пользователи, уже подключенные к целевому серверу
- Батчевая отправка: 100 за раз, параллелизм до 20
- Поиск пользователя, детальный профиль, подтверждение, отправка
Журнал операций
Все действия логируются в PromoOfferLog:- claimed — пользователь принял предложение
- consumed — предложение использовано
- disabled — предложение деактивировано (вручную или по истечении)
