Skip to main content

Режимы продаж

Бот поддерживает два режима продажи подписок. Переключение — через переменную SALES_MODE в .env или в админ-панели: Настройки → Подписки.
Для одновременного использования нескольких тарифов (мультиподписки) см. Мультитарифный режим.

Конструктор (classic)

Режим по умолчанию. Пользователь самостоятельно собирает подписку из компонентов:
  1. Период — выбор из AVAILABLE_SUBSCRIPTION_PERIODS
  2. Трафик — пакет из TRAFFIC_PACKAGES_CONFIG или фиксированный лимит
  3. Серверы — один или несколько (автопропуск при одном сервере)
  4. Устройства — от DEFAULT_DEVICE_LIMIT до MAX_DEVICES_LIMIT

Настройка периодов и цен

Формула расчёта цены

Количество месяцев рассчитывается как round(период_дней / 30), минимум 1. Пример для 180 дней (6 месяцев):

Тарифы (tariffs)

Готовые тарифные планы — пользователь выбирает тариф из списка и период оплаты.
Тарифы создаются и управляются в админ-панели: Админ → Тарифы.

Что входит в тариф

Каждый тариф включает фиксированные параметры:

Расширенные возможности тарифов

Тарифы поддерживают дополнительные настройки, которых нет в классическом режиме:

Триал в режиме тарифов

Если указан ID тарифа, параметры триала (трафик, устройства, серверы) берутся из тарифа. Длительность триала всё равно определяется TRIAL_DURATION_DAYS.

Сравнение режимов


Режимы продажи трафика

Применяются только в режиме конструктора (classic).

Выбираемые пакеты (selectable)

Пользователь выбирает пакет трафика из списка.
Формат каждого пакета: ГБ:цена_копейки:показать_безлимит. Значение 0 ГБ означает безлимит. Цена безлимитного трафика также задаётся отдельно:

Фиксированный лимит (fixed)

Все подписки создаются с одинаковым объёмом трафика.
0 означает безлимит.

Докупка трафика

Позволяет пользователю докупить трафик к существующей подписке. Трафик докупается пакетами на 1 месяц — при следующем сбросе трафика докупленный объём обнуляется вместе с основным.
Докупленный трафик действует до следующего сброса (по стратегии traffic_reset_mode). Это не разовая прибавка навсегда, а месячный пакет.
В режиме тарифов докупка трафика настраивается индивидуально для каждого тарифа: traffic_topup_enabled, traffic_topup_packages, max_topup_traffic_gb.

Сброс трафика

Пользователь может сбросить счётчик использованного трафика за плату.
Режим period может быть использован для абьюза — пользователь с дорогим трафиком будет сбрасывать его по цене 30-дневного периода. Рекомендуется traffic_with_purchased.

Сброс трафика при смене тарифа

При переключении пользователя на другой тариф можно автоматически сбросить накопленный трафик:
Настройка управляется через админ-панель (Настройки → Подписки) или через .env. Применяется ко всем путям смены тарифа: Cabinet, Telegram-бот, MiniApp, админ-действия.

Управление устройствами

В режиме конструктора

Если DEVICES_SELECTION_ENABLED=false, пользователь не видит шаг выбора устройств. Всем подпискам назначается DEVICES_SELECTION_DISABLED_AMOUNT устройств (или DEFAULT_DEVICE_LIMIT, если 0).

В режиме тарифов

Базовое количество устройств задаётся в тарифе (device_limit). Если device_price_kopeks указан — пользователь может докупить устройства до max_device_limit.
При уменьшении количества устройств минимум всегда равен 1. Поле device_limit тарифа определяет количество устройств, включённых при покупке, но не нижнюю границу уменьшения.
Списки устройств пользователя из панели теперь полностью пагинированы (get_user_devices_all), что гарантирует корректное удаление всех лишних устройств при уменьшении лимита.

Простая покупка подписки

Упрощённый режим — кнопка «Купить подписку» без пошагового конструктора. Все параметры фиксированы.
Простая покупка доступна только в режиме конструктора (classic). В режиме тарифов UX и так упрощён — пользователь просто выбирает тариф и период.

Тестовая подписка (триал)

Триал включает:
  • Настраиваемый период, трафик, устройства
  • Уведомления об истечении
  • Автоконверсию в платную подписку
  • Контроль обязательной подписки на канал
  • Платный триал с выбором способа оплаты (если TRIAL_ACTIVATION_PRICE > 0)

Промогруппы и скидки

Промогруппы — основной инструмент скидочной системы. У каждого пользователя может быть несколько промогрупп. Для расчёта скидки используется группа с наивысшим приоритетом.

Параметры промогруппы

Как скидки работают в режиме конструктора

В конструкторе каждый компонент стоимости дисконтируется отдельно:
  1. Цена периода — скидка period_discounts[период_дней]%
  2. Трафик — скидка traffic_discount_percent%
  3. Устройства — скидка device_discount_percent%
  4. Серверы — скидка server_discount_percent%
Пример: промогруппа «VIP» со скидкой 20% на серверы, 15% на трафик, 10% на устройства:

Как скидки работают в режиме тарифов

В тарифном режиме промогруппа применяет скидку за период (period_discounts) к итоговой цене тарифа:
Скидки на серверы, трафик и устройства в режиме тарифов не применяются — эти параметры фиксированы и уже включены в цену тарифа. Пример: тариф «Premium» стоит 5 000 руб/90 дней. Промогруппа с period_discounts: {"90": 20}:

Скидки за период для базовых пользователей

Для пользователей без промогруппы (или в группе is_default=true) можно включить скидки за длительные периоды через .env:
Эти скидки не работают для пользователей в именных промогруппах — у тех свои period_discounts.
BASE_PROMO_GROUP_PERIOD_DISCOUNTS применяются как скидка ко всем компонентам (серверы, трафик, устройства), если у базовой группы server_discount_percent, traffic_discount_percent и device_discount_percent равны 0. Это сделано для упрощения — базовые пользователи получают единую скидку за длительный период.

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

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

Приоритет промогрупп

Пользователь может состоять в нескольких промогруппах (например, назначенная вручную + за лояльность). Для расчёта скидки используется группа с наивысшим priority. При одинаковом приоритете — группа с большим id.

Ограничение тарифов по промогруппам

В режиме тарифов можно ограничить доступ к тарифу по промогруппам. Если у тарифа задан список allowed_promo_groups — его увидят только пользователи из этих групп. Если список пуст — тариф доступен всем.

Модем-подписки

Дополнительный функционал для устройств-модемов.

Сквозная корзина

Система сохраняет выбранные параметры при недостатке баланса:
  1. Пользователь выбирает подписку
  2. Баланса не хватает — корзина сохраняется в Redis (TTL 1 час)
  3. Пользователь пополняет баланс
  4. Кнопка «Вернуться к оформлению» восстанавливает корзину
  5. Подписка оформляется автоматически
Для работы корзины требуется Redis: REDIS_URL=redis://redis:6379/0

Автопродление

Бот автоматически продлевает подписки при наличии средств на балансе:
  • Фоновый сервис мониторинга проверяет подписки по расписанию
  • За N дней до истечения — уведомление пользователю
  • При наличии средств — автоматическое продление
  • При недостатке — уведомление о необходимости пополнения
  • Поддержка настройки дня списания

Промо-коды