луговкин.dev Открыт к проектам

Модуль • Подписки

Система подписок

Независимые подписки на каждую таблицу, автоматические продления и тарификация диска

WordPress WooCommerce PHP ACF REST API Robokassa JavaScript ES6

Управление подписками в личном кабинете

В рамках технической поддержки сервиса Автозагрузки (https://autozagruzki.ru/) полностью переделал систему оформления подписок.

Было

Одна общая подписка на все таблицы — продлевалась разом, негибко. За время роста сервис многократно дорабатывали, накопились баги:

  • кто-то ухитрялся продлевать тариф бесплатно (дыра в бизнес-логике);
  • кто-то пользовался таблицами сверх оплаченного лимита;
  • дополнительное место на диске нельзя было тарифицировать — выдавалось по запросу и не приносило прибыль;
  • Робокасса перестала корректно обрабатывать вебхуки — менеджерам приходилось вручную продлевать подписки, проверять каждый платёж и править статусы.

Это съедало часы рабочего времени и создавало риск ошибок.

Стало

Независимые подписки на каждую таблицу. Клиент покупает подписку на одну таблицу и в любой момент перекидывает её на другую без обращения в техподдержку. Каждая подписка продлевается отдельно — не нужно тянуть весь пакет.

Менеджеры больше не занимаются ручными продлениями — всё автоматизировано:

  • Робокасса стабильно передаёт статусы оплат;
  • баги с бесплатными продлениями и превышением лимитов устранены — система жёстко контролирует доступ;
  • все старые активные тарифы автоматически перенесены в новую модель — клиентам не пришлось ничего делать.

Каждая подписка отдельно: статус, дата окончания, действия

Сводка по фидам и дисковому пространству

С чем пришлось повозиться

  • Миграция данных — перевёл всех пользователей со старой системы на новую без потери истории и дат окончания. Скрипт перенёс всё автоматически и подсветил проблемные места — дыры в прежней бизнес-логике.
  • Разделение логики — раньше подписка была жёстко привязана к таблице, переписал ядро: подписка стала самостоятельной сущностью, переброс на другую таблицу — в 2 клика.
  • Продление HDD — дополнительное место потребовало отдельной логики: передача объёма в ГБ в корзину и обработка при активации заказа через мета-поля.
  • Интерфейс — кнопки «Привязать» и «Отвязать»: привязка яркая и на видном месте, отвязка спрятана в меню, чтобы случайно не потерять подписку.

Место на диске покупается самостоятельно — выбор объёма в ГБ

Кнопка «Привязать» — назначение подписки без обращения в поддержку

Отвязка спрятана в меню

  • Кеширование — статусы подписок кешируются, чтобы не нагружать базу, с принудительным обновлением при изменении.
  • Задел на будущее — архитектура позволяет подключить к системе подписки на биддеры и другие продукты: константы и хуки готовы.
  • Проблема «пула вместо продления» — часть пользователей вместо продления покупала новые подписки в пул. Добавил яркий алерт с пояснением, как правильно продлевать, и инструктаж через уведомления в личном кабинете.

Алерт: как правильно продлевать подписку

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

Личный кабинет сервиса Автозагрузки

Стек

  • Backend: PHP (WordPress), WooCommerce (кастомные типы подписок), ACF, собственные REST-эндпоинты, файловое кеширование.
  • Frontend: нативный JavaScript (ES6), jQuery, noUiSlider, SweetAlert2, модалки на Bootstrap.
  • Интеграции: Робокасса (статусы оплат через вебхуки), внутреннее API подписок.
  • Архитектура: бизнес-логика вынесена в отдельный плагин, интеграция с темой через хуки и глобальный класс.