Розробка веб-сервісу по підписці
Веб-сервіс по підписці — це будь-який продукт, де користувач платить регулярно (щомісячно, щорічно) за доступ до функцій, контенту або даних. Технічно: управління життєвим циклом підписки (trial → active → past_due → cancelled), обробка невдалих платежів, анти-churn механізми та коректний доступ до функцій в залежності від статусу.
Життєвий цикл підписки
trialing (14 днів)
↓ автоматичний платіж
active
↓ невдалий платіж
past_due → retry 3–4 рази → cancelled
↓ ручна відмена
cancelled → grace period (до кінця періоду)
↓
expired
Кожний переход генерує webhook від платіжного провайдера. Приложение слухає ці события та оновлює статус підписки.
Stripe webhook события:
-
invoice.payment_succeeded→ активуємо/продлюємо -
invoice.payment_failed→ встановлюємоpast_due, відправляємо email -
customer.subscription.deleted→ деактивуємо доступ
Dunning-управління
Dunning — процес роботи з невдалими платежами. Stripe Billing має вбудований Smart Retries (ML-алгоритм вибирає оптимальний час retry). Налаштовується в налаштуваннях біллінгу: 3–4 спроби протягом 7–14 днів.
Паралельно відправляються email-сповіщення з посиланням на оновлення карти. Stripe Billing надає hosted customer portal — сторінку, де клієнт може оновити платіжний метод.
Безплатний пробний період
Два підходи:
- Trial without card — користувач не вводить карту, після закінчення trial потрібно додати оплату. Менше трення при реєстрації, але нижча конверсія в платячих.
- Trial with card — карта додається при реєстрації, списання відбувається автоматично після trial. Вища конверсія, але менше реєстрацій.
Для B2B-SaaS рекомендується trial with card. Для B2C та viral-продуктів — без карти.
Upgrade / Downgrade
Смена плану повинна бути миттєвою й враховувати вже оплачений період. Stripe обробляє це через proration:
await stripe.subscriptions.update(subscriptionId, {
items: [{ id: itemId, price: 'price_premium_monthly' }],
proration_behavior: 'create_prorations',
});
При апгрейді — списується різниця за залишилися дні періоду. При даунгрейді — різниця засчитується як кредит.
Анти-churn: retention механіки
- Cancellation flow: замість кнопки «Відмінити» — діалог з уточняючими запитаннями («Чому ви йдете?»), пропозиція паузи (підписка на 1–3 місяці) або знижки
-
Email-кампанії: серія листів при
past_due, при закінченні trial без конверсії, через 30/60/90 днів після відмени - Win-back offers: спеціальне пропозиція для cancelled користувачів
Доступ до функцій
Перевірка доступу повинна бути централізованою:
// Gate в Laravel
Gate::define('use-advanced-feature', function (User $user) {
return $user->subscription?->active()
&& $user->subscription->plan->hasFeature('advanced');
});
// Використання
$this->authorize('use-advanced-feature');
Сроки
Веб-сервіс з підпиской через Stripe (реєстрація, trial, upgrade/downgrade, portal, базові webhook'и): 2–3 місяці. З розширеною тарифікацією, командами, dunning та analytics: 3–5 місяців.







