На Битрикс нет встроенного механизма регулярных платежей. Каждый проект подписок требует кастомной разработки — от проектирования таблиц до интеграции с платёжными шлюзами. За 5+ лет мы реализовали более 30 подписочных проектов: от доступа к закрытому контенту до автоматической доставки товаров. Например, для интернет-магазина косметики построили систему ежемесячных подписок на наборы. Она обрабатывает 5 000 активных подписок с автосписанием через ЮKassa, успешность списаний — 95%+. Подписка — бизнес-модель, при которой клиент регулярно платит за продукт или услугу. Если вы столкнулись с нехваткой функционала — вы не одни. Типовые решения не дают гибкости: нужно хранить статусы, управлять периодами, обрабатывать отмены. Мы предлагаем готовую архитектуру на базе ORM Битрикс, которая закрывает эти задачи.
Какие типы подписок бывают на Битрикс?
Прежде чем проектировать, важно понять бизнес-модель. Выделяют три основных типа:
| Тип подписки | Описание | Техническая реализация |
|---|---|---|
| Доступ к контенту | Платный раздел, закрытые материалы | Группы пользователей + ограничение доступа |
| Товарная подписка | Регулярная доставка товаров | Автоматическое создание заказов |
| Сервисная подписка | SaaS, лицензия, техподдержка | Статус аккаунта + автопродление |
Все три типа имеют общее: периодическое списание денег и управление статусом доступа.
Архитектура хранения данных и агенты
Ядро системы — таблица подписок. Создаётся через ORM Битрикс (наследование от \Bitrix\Main\ORM\Data\DataManager). Новая архитектура на ORM в 1.5 раза быстрее в разработке по сравнению с прямыми SQL-запросами.
class SubscriptionTable extends DataManager { public static function getTableName(): string { return 'b_local_subscription'; } public static function getMap(): array { return [ new IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new IntegerField('USER_ID', ['required' => true]), new IntegerField('PLAN_ID', ['required' => true]), new EnumField('STATUS', ['values' => ['TRIAL', 'ACTIVE', 'PAST_DUE', 'CANCELLED', 'EXPIRED']]), new DatetimeField('CURRENT_PERIOD_START'), new DatetimeField('CURRENT_PERIOD_END'), new DatetimeField('TRIAL_END'), new StringField('PAYMENT_TOKEN'), new IntegerField('PAY_SYSTEM_ID'), new StringField('CANCEL_REASON'), new DatetimeField('CANCELLED_AT'), new DatetimeField('CREATED_AT'), ]; } } class SubscriptionPlanTable extends DataManager { // ID, NAME, PRICE, CURRENCY, PERIOD_DAYS, TRIAL_DAYS, // IBLOCK_SECTION_IDS, FEATURES (JSON) } Для обработки подписок каждый день запускается cron-скрипт — агент. Он находит подписки с истекшим периодом и пытается списать средства:
$expiring = SubscriptionTable::getList([ 'filter' => [ 'STATUS' => ['ACTIVE', 'PAST_DUE'], '<=CURRENT_PERIOD_END' => new DateTime(), ] ])->fetchAll(); foreach ($expiring as $sub) { try { $result = chargeSubscription($sub); if ($result->isSuccess()) { SubscriptionTable::update($sub['ID'], [ 'STATUS' => 'ACTIVE', 'CURRENT_PERIOD_START' => new DateTime(), 'CURRENT_PERIOD_END' => (new DateTime())->modify('+' . $planPeriodDays . ' days'), ]); } else { handlePaymentFailure($sub); } } catch (\Exception $e) { logError($e, $sub); } } Как настроить рекуррентные платежи?
Самая сложная часть — автоматическое списание. Мы подключаем ЮKassa или CloudPayments — обе поддерживают сохранение карты и повторные платежи через API. Для выбора сравните характеристики:
| Параметр | ЮKassa | CloudPayments |
|---|---|---|
| Простота интеграции | Высокая | Средняя |
| Гибкость настройки ошибок | Базовая | Расширенная |
| Комиссия за успешный платёж | 2.5-3.5% | 2.3-3.2% |
Процесс:
- Первый платёж — обычная оплата, получаем payment_method_id.
- Сохраняем токен в SubscriptionTable.PAYMENT_TOKEN.
- При наступлении CURRENT_PERIOD_END вызываем API с токеном.
$payment = new \YooKassa\Client(); $payment->setAuth($shopId, $secretKey); $response = $payment->createPayment([ 'amount' => ['value' => $plan->getPrice(), 'currency' => 'RUB'], 'payment_method_id' => $subscription->getPaymentToken(), 'capture' => true, 'description' => 'Подписка ' . $plan->getName() . ' #' . $subscription->getId(), ]); Подробнее об обработке ошибок списания
Дополнительно реализуем обработку неуспешных списаний с эскалацией: после 3 неудачных попыток подписка переводится в PAST_DUE, клиенту отправляется уведомление. Это снижает риск неожиданной блокировки.
Как управлять доступом по подписке?
Для подписок типа «доступ к контенту» используем группы пользователей Битрикс. Каждому плану — отдельная группа. При активации добавляем пользователя, при истечении удаляем. Права на инфоблоки настраиваются через права групп. Для товарных подписок — автоматическое создание заказов через корзину. Решение масштабируется до 10 000 активных подписок без просадки производительности.
CUser::SetUserGroup($userId, array_merge( CUser::GetUserGroup($userId), [$plan->getGroupId()] )); Управление подписками: личный кабинет и уведомления
Минимальный функционал страницы /personal/subscription/:
- Текущий план и статус.
- Дата следующего списания и сумма.
- История платежей.
- Кнопка «Отменить» (с опциональным вопросом о причине).
- Смена плана (апгрейд/даунгрейд).
- Обновление платёжных данных.
При отмене подписки доступ сохраняется до конца оплаченного периода — клиент получает то, за что заплатил. После истечения периода он удаляется из группы доступа. Статус меняется на CANCELLED, затем EXPIRED.
Обязательные почтовые события:
- SUBSCRIPTION_CREATED — подтверждение подписки.
- SUBSCRIPTION_PAYMENT_SUCCESS — успешное списание.
- SUBSCRIPTION_PAYMENT_FAILED — ошибка списания.
- SUBSCRIPTION_TRIAL_ENDING — за 1-3 дня до конца трайла.
- SUBSCRIPTION_CANCELLED — подтверждение отмены.
- SUBSCRIPTION_EXPIRED — доступ закрыт.
Триальный период
При создании подписки с триалом:
$trialEnd = (new DateTime())->modify('+' . $plan->getTrialDays() . ' days'); SubscriptionTable::add([ 'USER_ID' => $userId, 'PLAN_ID' => $planId, 'STATUS' => 'TRIAL', 'TRIAL_END' => $trialEnd, 'CURRENT_PERIOD_END' => $trialEnd, ]); Агент за 1 день до окончания трайла уведомляет пользователя. В день окончания — попытка первого списания. Если карта не привязана — подписка переводится в EXPIRED.
Что входит в разработку системы подписок
- Проектирование архитектуры БД и бизнес-логики.
- Реализация ORM-сущностей и агентов.
- Интеграция с платёжной системой (ЮKassa / CloudPayments).
- Настройка прав доступа и групп пользователей.
- Разработка личного кабинета (/personal/subscription/).
- Конфигурация почтовых событий.
- Документация и обучение администраторов.
- Пост-релизная поддержка 30 дней.
Сроки и стоимость
| Вариант | Состав | Срок |
|---|---|---|
| Без рекуррента | Подписка с ручной оплатой, управление доступом | 5-7 дней |
| С рекуррентными платежами | Автосписание через ЮKassa или CloudPayments | 10-14 дней |
| Полная платформа | Несколько планов, трайл, ЛК, аналитика | 15-20 дней |
Стоимость рассчитывается индивидуально — зависит от сложности бизнес-логики и количества интеграций. Оставьте заявку — мы оценим ваш проект за 1 рабочий день.
Почему стоит работать с нами
- Использование готового модуля сокращает время разработки на 40% по сравнению с типовыми решениями.
- Глубокое понимание ограничений Битрикс и способов их обхода.
- Более 30 подписочных проектов в портфолио.
Получите консультацию по вашей задаче — свяжитесь с нами через форму на сайте или по почте. Закажите разработку системы подписок под ключ.







