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

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

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация продажи SaaS-доступа через сайт
Сложная
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Реализация продажи 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 = unlimited
    ];

    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 рабочих дней.