Налаштування продажу підписок на веб-сайті 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 день. Гарантуємо прозорість та фіксовану вартість після затвердження ТЗ. Замовте консультацію — отримаєте комерційну пропозицію. Ми завжди раді допомогти вам з налаштуванням білінгу.







