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

Подписочный софт строится вокруг карты на файле, с которой деньги списываются автоматически. С криптой так не получится: каждый платёж клиент отправляет сам. Это звучит как проблема, но многие SaaS продают тем, кто не может или не хочет платить картой, и рабочая модель проста: один счёт на каждый расчётный период. В материале показано, как её собрать, чего ждать и чем она отличается от карточного биллинга.
Зачем SaaS добавляет крипту
Карты это стандарт, поэтому для крипты нужна причина. Обычно такие:
- Клиенты, которым карточные рельсы не подходят. Команды в странах, где не работает ваш процессор, или те, чьи карты отклоняют за международный софт, всё равно могут платить долларовым стейблкоином.
- Годовые и крупные счета. Клиент, оплачивающий большой годовой счёт, нередко предпочитает перевод карте, а перевод стейблкоина окончателен без банковского операционного дня.
- Нет чарджбэков. Криптоплатёж отправитель отменить не может, поэтому «дружественное мошенничество» на подписке без присутствия карты не беспокоит.
- Приватность и крипто-аудитория. У инструментов для разработчиков, инфраструктуры и хостинга много пользователей со стейблкоинами, которые любят ими платить.
Важно понимать границу: крипта добавляет способ оплаты для этих клиентов и не заменяет карточный биллинг для остальных.
Модель: счёт на период
Карточный биллинг списывает деньги с сохранённой карты по расписанию. Криптоплатёж должен начать клиент, поэтому естественная модель это предоплаченные счета:
- Незадолго до конца периода ваша система создаёт счёт на следующий.
- Клиент получает счёт со ссылкой на оплату, открывает страницу оплаты, выбирает актив и сеть и платит.
- Когда платёж завершён, система помечает счёт оплаченным и продлевает подписку.
Сохранённого способа оплаты и автоматического списания нет. 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 криптоплатежей.
// 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 о завершении не придёт. Оставьте счёт открытым и попросите доплатить либо отмените и верните деньги. Подписку не продлевайте.
Можно ли задавать цены тарифов в долларах?
Да. Цена задаётся в долларах США, а клиент платит эквивалент в выбранном активе и сети по курсу, зафиксированному на один час.


