SaaS

Криптоплатежи для SaaS

Как SaaS-компании принимать крипту: счёт на каждый период вместо карты на файле, схема продления, частичные оплаты, учёт в долларах и чего не обещать клиентам.

Подписочный софт строится вокруг карты на файле, с которой деньги списываются автоматически. С криптой так не получится: каждый платёж клиент отправляет сам. Это звучит как проблема, но многие SaaS продают тем, кто не может или не хочет платить картой, и рабочая модель проста: один счёт на каждый расчётный период. В материале показано, как её собрать, чего ждать и чем она отличается от карточного биллинга.

Зачем SaaS добавляет крипту

Карты это стандарт, поэтому для крипты нужна причина. Обычно такие:

  • Клиенты, которым карточные рельсы не подходят. Команды в странах, где не работает ваш процессор, или те, чьи карты отклоняют за международный софт, всё равно могут платить долларовым стейблкоином.
  • Годовые и крупные счета. Клиент, оплачивающий большой годовой счёт, нередко предпочитает перевод карте, а перевод стейблкоина окончателен без банковского операционного дня.
  • Нет чарджбэков. Криптоплатёж отправитель отменить не может, поэтому «дружественное мошенничество» на подписке без присутствия карты не беспокоит.
  • Приватность и крипто-аудитория. У инструментов для разработчиков, инфраструктуры и хостинга много пользователей со стейблкоинами, которые любят ими платить.

Важно понимать границу: крипта добавляет способ оплаты для этих клиентов и не заменяет карточный биллинг для остальных.

Модель: счёт на период

Карточный биллинг списывает деньги с сохранённой карты по расписанию. Криптоплатёж должен начать клиент, поэтому естественная модель это предоплаченные счета:

  1. Незадолго до конца периода ваша система создаёт счёт на следующий.
  2. Клиент получает счёт со ссылкой на оплату, открывает страницу оплаты, выбирает актив и сеть и платит.
  3. Когда платёж завершён, система помечает счёт оплаченным и продлевает подписку.

Сохранённого способа оплаты и автоматического списания нет. Qvard не предлагает рекуррентные платежи или подписки как продукт; логика продления, напоминания и льготный период на вашей стороне. Для многих B2B-сервисов и инструментов разработчика этого достаточно, а годовые планы обычно так и оплачиваются. О самих счетах подробно в материале криптовыставление счетов для B2B SaaS.

Создание платежа под счёт

Для каждого счёта создавайте платёж с бэкенда одним POST на https://api.qvard.com/api/v1/payment. В запросе ваш ключ в заголовке Authorization: Bearer и JSON:

  • id: номер вашего счёта строкой. Он вернётся в webhook, поэтому берите то, что можно найти у себя.
  • price: сумма в долларах США.
  • paymentSystemId (необязательно): способ оплаты из вашего проекта, если страница должна открываться с выбранным активом и сетью.

Ответ 201 с redirectUrl, адресом страницы оплаты. Вставьте эту ссылку в письмо со счётом и на страницу биллинга клиента. Если запрос отправлен дважды с тем же id для того же способа оплаты, вернётся уже созданный платёж, поэтому повтор задачи не создаёт дублей.

Цены тарифов задавайте в долларах. Клиент платит эквивалент в выбранном активе по курсу, зафиксированному на один час.

Продление от начала до конца

Для продления нужны два небольших куска кода, они показаны ниже: задача, которая создаёт счёт и платёж, и обработчик, реагирующий на оплату.

Рабочий график:

  • За семь дней до конца: создать счёт и отправить ссылку.
  • За три дня и в последний день: отправить напоминания, если счёт всё ещё открыт.
  • После окончания: оставить аккаунт активным на короткий льготный период по вашему выбору, затем понизить тариф или приостановить. Это ваша политика, а не функция шлюза.
  • Когда пришёл webhook: пометить счёт оплаченным и продлить подписку от конца прошлого периода, а не от даты платежа, чтобы заплатившие заранее не теряли дни.

Webhook отправляется, когда платёж завершён. Ваша точка должна отвечать ровно HTTP 200 (иначе будут повторы: пять попыток примерно за шесть минут) и быть безопасной при двойном запуске, чем в примере занимается шаг markPaidIfOpen. Проверяйте подпись X-Qvard-Signature (HMAC-SHA256 вашим секретным ключом); см. как защитить webhook криптоплатежей.

Node.jsrenew.js
// Called by your billing job a few days before a subscription period ends.
async function createRenewalInvoice(sub) {
  const invoice = await db.invoices.create({ subscriptionId: sub.id, amountUsd: sub.planPriceUsd, status: 'open' });

  const res = await fetch('https://api.qvard.com/api/v1/payment', {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + process.env.QVARD_API_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({ id: String(invoice.id), price: invoice.amountUsd })
  });
  const { redirectUrl } = await res.json();

  await mailer.send(sub.email, 'Your renewal invoice', 'Pay here: ' + redirectUrl);
}

// Called from the webhook handler when status is "completed".
async function onPaid(invoiceId) {
  const invoice = await db.invoices.markPaidIfOpen(invoiceId); // null if already paid
  if (invoice) await db.subscriptions.extend(invoice.subscriptionId, '1 month');
}

Частичные оплаты, смена тарифа и учёт

В реальном биллинге есть особые случаи. Решите их до запуска:

  • Частичная оплата. Если пришло меньше полной суммы, статус partial, а webhook о завершении не приходит. Оставьте счёт открытым, скажите клиенту, сколько не хватает, и дайте доплатить, либо отмените и верните деньги. Не продлевайте подписку по частичному платежу.
  • Повышение и понижение тарифа. Пересчёт это ваша логика. Проще всего выставить новый счёт на разницу или применить изменение со следующего периода.
  • Возвраты. Криптоплатёж не отозвать, поэтому возврат это перевод, который вы отправляете сами. Запишите правило в условиях.
  • Учёт. Выручку проводите в долларах по сумме счёта и храните id платежа рядом со счётом для сверки. Налоговый и бухгалтерский режим криптопоступлений уточните у своих консультантов.

Держите состояний счёта немного и понятных: открыт, оплачен, аннулирован.

Что сказать клиентам и чего не обещать

Описывайте крипту честно на странице тарифов или биллинга:

  • вы оплачиваете каждый период сами, по счёту и ссылке на оплату;
  • какие активы и сети вы принимаете (см. поддерживаемые монеты) и что платить нужно в той сети, которую выбрали на странице оплаты;
  • что доступ продлевается, когда платёж завершён, а не когда клиент сообщил, что заплатил;
  • правило возврата одной строкой.

Не обещайте автопродление, сохранённые крипто-кошельки или карточные повторные списания: в этой модели их нет. Обещайте то, что работает: понятный счёт, страницу оплаты и продление сразу после завершения платежа.

Сколько это стоит и что готово сегодня

Абонентской платы за шлюз нет. Комиссия индивидуальна для вашего проекта, и по странице тарифов начинается с 1%, а может быть снижена до 0,1%. Вывод баланса на ваш кошелёк стоит только сетевую комиссию; вывода на банковский счёт в фиате нет.

Интеграция идёт через API и требует разработчика; готового плагина биллинга пока нет, а после оплаты клиент возвращается на сайт сам, поэтому дайте ему страницу биллинга с реальным статусом счёта. Смотрите сценарий для SaaS, документацию для разработчиков и демо-счёт.

FAQ

Поддерживает ли Qvard рекуррентные платежи или автоматические подписки?

Нет. Криптоплатёж каждый раз отправляет клиент. Рабочая модель это один счёт на расчётный период, а логика продления, напоминания и льготный период остаются на вашей стороне.

Как узнать, что клиент заплатил?

Qvard вызывает ваш webhook, когда платёж завершён, и передаёт id счёта, который вы отправили, и статус. Помечайте счёт оплаченным только по статусу completed и делайте обработчик безопасным при повторном запуске.

Что если клиент оплатил только часть счёта?

Платёж получит статус partial, а webhook о завершении не придёт. Оставьте счёт открытым и попросите доплатить либо отмените и верните деньги. Подписку не продлевайте.

Можно ли задавать цены тарифов в долларах?

Да. Цена задаётся в долларах США, а клиент платит эквивалент в выбранном активе и сети по курсу, зафиксированному на один час.

Похожие статьи

Похожие статьи