Настройка продажи подписок на веб-сайте SaaS-продукта часто превращается в набор костылей: тарифы растут, пользователи жалуются на сбои, биллинг ломается в самый неподходящий момент. Мы решаем эту задачу под ключ, интегрируя Stripe Billing, Paddle или Chargebee — без самописных велосипедов. Наш опыт: более 50 успешных проектов, 5+ лет в разработке биллинговых систем. Такой подход снижает churn rate на 10–15% и экономит до 40 часов разработки на стартапе. Потери из-за необработанных вебхуков могут достигать $5,000 в месяц, поэтому автоматизация критична. Кроме того, правильная интеграция экономит до $3,000–$5,000 ежемесячно на ручном управлении.
Как интегрировать биллинг?
Не реализовывайте биллинг самостоятельно — используйте Stripe Billing, Paddle или Chargebee. Они берут на себя: повторяющиеся платежи, неудавшиеся транзакции, dunning-механики, налоги по регионам. Мы настраиваем полный цикл: от создания клиента до обработки вебхуков. Как отмечается в документации Stripe, пробные периоды настраиваются просто и гибко.
Интеграция со Stripe Billing
class SubscriptionService
{
public function createSubscription(User $user, string $priceId, array $options = []): Subscription
{
// Создаём Stripe Customer если нет
if (!$user->stripe_customer_id) {
$customer = $this->stripe->customers->create([
'email' => $user->email,
'metadata' => ['user_id' => $user->id],
]);
$user->update(['stripe_customer_id' => $customer->id]);
}
$subscriptionData = [
'customer' => $user->stripe_customer_id,
'items' => [['price' => $priceId]],
'trial_period_days' => $options['trial_days'] ?? 0,
'payment_behavior' => 'default_incomplete',
'expand' => ['latest_invoice.payment_intent'],
];
$stripeSubscription = $this->stripe->subscriptions->create($subscriptionData);
return Subscription::create([
'user_id' => $user->id,
'stripe_subscription_id' => $stripeSubscription->id,
'plan' => $options['plan'],
'status' => $stripeSubscription->status,
'trial_ends_at' => $stripeSubscription->trial_end
? Carbon::createFromTimestamp($stripeSubscription->trial_end)
: null,
'current_period_end' => Carbon::createFromTimestamp($stripeSubscription->current_period_end),
]);
}
public function cancel(Subscription $subscription, bool $immediately = false): void
{
if ($immediately) {
$this->stripe->subscriptions->cancel($subscription->stripe_subscription_id);
} else {
// Отмена в конце периода
$this->stripe->subscriptions->update($subscription->stripe_subscription_id, [
'cancel_at_period_end' => true,
]);
}
}
}
Какие тарифные планы можно настроить?
Поддерживаются любые лимиты: количество проектов, объем хранилища, число API-вызовов. Реализуем гибкую систему проверки лимитов с апгрейдом и даунгрейдом. Для безлимитных планов используем значение -1.
class PlanLimits
{
private array $limits = [
'free' => ['projects' => 1, 'storage_gb' => 1, 'api_calls_month' => 1000],
'starter' => ['projects' => 5, 'storage_gb' => 10, 'api_calls_month' => 10000],
'pro' => ['projects' => 20, 'storage_gb' => 50, 'api_calls_month' => 100000],
'enterprise' => ['projects' => -1, 'storage_gb' => -1, 'api_calls_month' => -1],
];
public function check(string $plan, string $feature, mixed $currentUsage): bool
{
$limit = $this->limits[$plan][$feature] ?? 0;
if ($limit === -1) return true;
return $currentUsage < $limit;
}
}
Webhook обработчик событий биллинга
Route::post('/webhooks/stripe', function (Request $request) {
$event = \Stripe\Webhook::constructEvent(
$request->getContent(),
$request->header('Stripe-Signature'),
config('services.stripe.webhook_secret')
);
match($event->type) {
'customer.subscription.created' =>
HandleSubscriptionCreated::dispatch($event->data->object),
'customer.subscription.updated' =>
HandleSubscriptionUpdated::dispatch($event->data->object),
'customer.subscription.deleted' =>
HandleSubscriptionCancelled::dispatch($event->data->object),
'invoice.payment_failed' =>
HandlePaymentFailed::dispatch($event->data->object),
'invoice.payment_succeeded' =>
HandlePaymentSucceeded::dispatch($event->data->object),
default => null,
};
return response('ok');
});
Сравнение биллинговых систем
| Система | Модель ценообразования | Dunning | Налоги | Пробный период |
|---|---|---|---|---|
| Stripe Billing | 2.9% + 30¢ за успешный платеж | Встроенный | Автоматический | Да |
| Paddle | 5% + 50¢ за транзакцию | Встроенный | Автоматический (включает НДС) | Да |
| Chargebee | от $49/мес + комиссия | Встроенный | Автоматический (доп. модули) | Да |
Stripe Billing лучше для стартапов — низкая комиссия, гибкая настройка. Paddle удобен для продажи по всему миру — сам рассчитывает налоги. Chargebee подходит для сложной биллинговой логики с несколькими провайдерами.
Почему стоит доверить биллинг профессионалам?
Профессиональная интеграция биллинга гарантирует обработку всех пограничных случаев: отмена в середине пробного периода, частичное возмещение, переход на тариф с пробным периодом. Самостоятельная реализация часто приводит к утечке данных или некорректному учёту налогов. Мы закладываем обработку всех событий вебхуков и тестируем сценарии с аномальными данными.
Что делать при сбоях в обработке платежей?
При сбоях, таких как ошибка карты или превышение лимита, Stripe Billing автоматически запускает dunning-процесс с повторными попытками. Мы дополнительно реализуем уведомления пользователя через email и интерфейс, приостанавливаем доступ до успешного платежа. В случае неудачных выплат система отправляет администратору алерт, чтобы вручную связаться с клиентом.
Типичные ошибки при интеграции и их решение
| Проблема | Решение |
|---|---|
| Не обрабатываются вебхуки при смене тарифа | Настройте события customer.subscription.updated и invoice.payment_succeeded |
| Пробный период не синхронизирован с доступом | Проверяйте trial_ends_at и блокируйте доступ после окончания |
| Лимиты не обновляются после апгрейда | Реализуйте проверку лимитов в реальном времени через middleware |
| Ошибки при отмене подписки | Используйте cancel_at_period_end для мягкой отмены |
Что входит в работу по настройке продажи SaaS-доступа
- Интеграция с выбранной биллинговой системой (Stripe, Paddle, Chargebee).
- Настройка тарифных планов с любыми лимитами.
- Реализация пробного периода, апгрейда, даунгрейда и отмены подписки.
- Обработка вебхуков и синхронизация с вашей базой данных.
- Документация по API и коду.
- Доступы к тестовому и рабочему окружению.
- Обучение вашей команды (до 2 часов).
- Поддержка в течение 3 месяцев после запуска.
- Настройка мониторинга статусов подписок и оповещений о сбоях.
Процесс работы
- Аналитика — изучаем вашу модель монетизации, требования к тарифам, аудируем текущую инфраструктуру.
- Проектирование — разрабатываем архитектуру биллинга, выбираем систему, проектируем схему БД.
- Реализация — пишем код интеграции, настраиваем вебхуки, тестируем критичные сценарии.
- Тестирование — проверяем оплату, отмены, пробные периоды, обработку ошибок.
- Деплой — разворачиваем на боевом сервере, настраиваем мониторинг платежей.
Сроки и как начать
SaaS-биллинг со Stripe, тарифными планами и управлением подписками: 14–20 рабочих дней. Срок может варьироваться в зависимости от сложности тарифной сетки и необходимости интеграции с другими сервисами.
Чтобы обсудить ваш проект, свяжитесь с нами — оценим задачи и предложим решение за 1 день. Гарантируем прозрачность и фиксированную стоимость после утверждения ТЗ. Закажите консультацию — получите коммерческое предложение. Мы всегда рады помочь вам с настройкой биллинга.







