Реалізація продажу SaaS-доступу через сайт

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація продажу SaaS-доступу через сайт
Складна
~1-2 тижні
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація продажу SaaS-доступу через сайт

Продаж SaaS-підписок — технічно складніша задача, ніж продаж разових товарів. Потрібні: тарифні плани з різними лімітами, управління підписками (апгрейд, даунгрейд, відмена), біллінг по циклам, пробні періоди.

Архітектура біллінгу

Не реалізовуйте біллінг самостійно — використовуйте Stripe Billing, Paddle або Chargebee. Вони беруть на себе: повторюючі платежі, невдалі трансакції, dunning-механіки, податки по регіонам.

Інтеграція зі 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,
            ]);
        }
    }
}

Тарифні плани з обмеженнями

// Таблиця лімітів планів
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],  // -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;
    }
}

// У контроллері
public function createProject(Request $request)
{
    $user = auth()->user();
    $plan = $user->subscription->plan;

    $currentProjects = $user->projects()->count();

    if (!app(PlanLimits::class)->check($plan, 'projects', $currentProjects)) {
        return response()->json([
            'error' => 'Перевищено лімітом проектів для вашого тарифу',
            'upgrade_url' => route('billing.upgrade'),
        ], 402);
    }

    // Створюємо проект
}

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');
});

Сроки

SaaS-біллінг зі Stripe, тарифними планами та управлінням підписками: 14–20 робочих днів.