Вы — SaaS-стартап, и вам нужно внедрить подписки? Или у вас уже есть система, но теряете до 20% выручки из-за проблем с автоплатежами? Реализация подписочной модели требует не просто прикрутить платёжный шлюз — надо продумать жизненный цикл: триал, грациент, обработка отказов, апгрейды и аналитику. Наша команда уже 10 лет строит такие системы для десятков проектов. За 5 лет мы выпустили более 20 подписочных решений — от простых ежемесячных планов до сложных enterprise-схем с мультивалютностью и пробными периодами. В этом материале разберём ключевые технические решения.
Как устроена реализация подписочной модели?
Подписочная модель требует продуманной схемы данных и бизнес-логики. Рассмотрим структуру базы данных и выбор платёжного провайдера.
Модель данных
plans ( id, name, billing_period: monthly | yearly | weekly, price, currency, trial_days, features (jsonb), is_active ) subscriptions ( id, user_id, plan_id, status: trialing | active | past_due | canceled | expired, current_period_start, current_period_end, trial_ends_at, cancel_at_period_end (boolean), canceled_at, payment_method_id, external_subscription_id (id в платёжной системе) ) subscription_invoices ( id, subscription_id, amount, currency, status: draft | open | paid | failed | void, attempt_count, next_attempt_at, paid_at, payment_id ) Выбор платёжного провайдера
| Провайдер | Особенности | Рынок |
|---|---|---|
| Stripe Billing | Встроенное управление подписками, Smart Retries, Customer Portal | Международный |
| ЮKassa | Автоплатежи через сохранённые карты, требуется собственная логика | РФ |
| CloudPayments | Встроенные подписки с Webhooks | РФ |
Stripe Billing — оптимальный выбор для международного SaaS: он сам управляет retry-логикой и предоставляет готовый Customer Portal. Наш опыт показывает: использование Stripe сокращает время разработки на 30% по сравнению с ЮKassa. Для российского рынка ЮKassa тоже подходит, но требует реализации собственного scheduler'а для повторных списаний.
Почему выбор платёжного провайдера критичен?
От правильного выбора зависит сложность разработки и стабильность автоматических списаний. Stripe Dunning Management возвращает до 15% успешных платежей благодаря ML-оптимизации времени retry Stripe. Это позволяет вернуть больше клиентов без вашего участия.
Как работает grace period?
После первого неудачного списания подписка переходит в статус past_due — пользователь сохраняет доступ, но получает уведомления. Повторные попытки:
- +1 день: первый retry
- +3 дня: второй retry с email-напоминанием
- +7 дней: финальная попытка, предупреждение об отключении
- +10 дней: статус
expired, доступ отозван
Stripe Dunning Management делает это автоматически. Сравните с ручной реализацией: в первом случае вы получаете до 15% дополнительных платежей, во втором — 5–7%. Эффект очевиден.
Автоматические списания
При использовании Stripe: подписка создаётся один раз, Stripe сам управляет renewals. При использовании ЮKassa — нужен собственный scheduler:
// Scheduled Job: каждый час $dueSubscriptions = Subscription::where('status', 'active') ->where('current_period_end', '<=', now()) ->get(); foreach ($dueSubscriptions as $subscription) { dispatch(new RenewSubscriptionJob($subscription)); } RenewSubscriptionJob пытается провести списание через сохранённый payment method. При успехе — обновляет current_period_end. При неудаче — переводит в past_due и планирует повторные попытки.
Апгрейд и даунгрейд тарифа
Смена тарифа — нетривиальная задача. Пересчёт суммы выполняется пропорционально остатку периода:
- Апгрейд (на более дорогой тариф): немедленно, доплата за оставшееся время периода
- Даунгрейд (на более дешёвый): вступает в силу с начала следующего периода, кредит учитывается
$unusedDays = $subscription->daysRemainingInPeriod(); $creditAmount = $unusedDays * ($currentPlan->dailyPrice()); $chargeAmount = $unusedDays * ($newPlan->dailyPrice()) - $creditAmount; Клиентский портал и управление подпиской
Пользователь должен иметь возможность:
- Просматривать текущий тариф и дату следующего списания
- Менять тариф (с расчётом пропорции)
- Обновлять платёжный метод (ввод новой карты через hosted fields)
- Отменять подписку с пояснением причины (exit survey)
- Скачивать инвойсы
Stripe предоставляет готовый Customer Portal — hosted-страница для управления. Для кастомного UI на ЮKassa нужно строить своё. В среднем разработка собственного портала занимает 1–2 недели, но мы обычно предлагаем готовое решение на основе Stripe — это дешевле и быстрее на 40%.
Предотвращение churn
Технические решения для снижения отказа от подписок:
- Email за 3 и 7 дней до списания с напоминанием суммы
- Уведомление об истечении карты за 30 дней
- Возможность поставить подписку на паузу (вместо отмены)
- Оффер при отмене: скидка 20% на следующий месяц
Эти меры снижают churn на 15–20% в типовых проектах. Мы гарантируем, что внедрим эти механизмы в вашу систему. Получите консультацию — оценим текущую ситуацию.
Типичные ошибки при реализации подписок
- Не учитывать смену платёжного метода при утере карты — теряются клиенты
- Пропускать дunning с постоянным сроком жизни — уходят деньги
- Игнорировать часовые пояса — списания срабатывают в неудобное время
- Не проверять дубликаты списаний — двойные платежи
Аналитика подписок
Ключевые метрики: MRR (Monthly Recurring Revenue), Churn Rate, LTV, Trial-to-Paid Conversion, Average Revenue Per User. Для расчёта нужны специализированные запросы по историческим данным подписок — не достаточно просто суммировать платежи. Мы строим дашборды на этих метриках, чтобы вы видели реальную картину.
Сроки разработки: 4–6 недель для полной системы с управлением lifecycle, retry-логикой, клиентским порталом и базовой аналитикой. Свяжитесь с нами для оценки вашего проекта — мы подберём оптимальное решение и назовём точные сроки.







