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

Часть B2B-клиентов хочет оплачивать ваши счета в крипте: международные команды, компании с банковскими ограничениями, криптонативные фирмы. Поддержать их несложно, но счёт ведёт себя иначе, чем касса магазина, и несколько решений определяют, будет ли ваша финансовая команда довольна. Этот материал о таких решениях.
Зачем SaaS-компании криптосчета
Крипта редко бывает основным способом оплаты для SaaS, и это нормально. Она полезна как дополнительный вариант, когда:
- клиенты находятся в странах, где карты или банковские переводы медленные, дорогие или ненадёжные;
- покупатель криптонативная компания, которая уже платит поставщикам стейблкоинами;
- вам нужны платежи, которые не зависят от часов работы банков и не могут быть опротестованы.
Для остальных оставьте карты и банковские переводы. Крипта это ещё одна строка в списке «как оплатить» на вашем счёте.
Чем счёт отличается от кассы
Касса магазина создаёт платёж в момент покупки. Счёт выставляется заранее, а оплачивается через дни или недели, часто финансовой командой по внутреннему процессу. Из этого следует:
- Сумма зафиксирована в долларах, а не в монетах. Вы выставляете счёт в долларах, а плательщик отправляет эквивалент в используемом активе.
- Курс нельзя держать неделями. В Qvard курс закрепляется на один час с момента создания платежа. Курс на момент выставления счёта к моменту оплаты давно устарел бы.
- Нужна ссылка на счёт. Финансовым командам нужен номер счёта в каждом платеже, чтобы сверять.
- Плательщики работают по согласованиям. Они могут платить частями или с задержкой, поэтому нужны чёткие правила для частичных оплат.
Создавайте платёж, когда клиент готов платить
Главное решение: не создавайте криптоплатёж при выставлении счёта. Создавайте его, когда клиент решил платить.
Поставьте на страницу счёта кнопку «Оплатить криптой». Когда клиент нажимает её, бэкенд создаёт платёж с номером счёта в качестве id и суммой к оплате в долларах, а затем перенаправляет клиента на страницу оплаты. Курс фиксируется на следующий час, а это как раз то окно, которое нужно клиенту, чтобы отправить перевод.
Номер счёта в роли id даёт два преимущества. Если клиент нажмёт дважды или ваш запрос повторится, Qvard вернёт уже созданный платёж для того же id и способа оплаты, а не создаст дубль. А webhook с результатом приходит с тем же id, поэтому вы находите счёт без таблицы соответствий.
// Runs when the customer clicks "Pay with crypto" on invoice INV-2026-0142,
// not when the invoice is issued: the exchange rate is fixed for one hour.
async function payInvoiceWithCrypto(invoice) {
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: invoice.number, // "INV-2026-0142": clicking twice returns the same payment
price: invoice.amountUsd // amount due, in US dollars
})
});
if (!res.ok) throw new Error('Qvard ' + res.status);
return (await res.json()).redirectUrl; // open this payment page for the customer
}Сверка через webhook
Когда платёж завершён, Qvard отправляет на ваш сервер webhook с id (номером вашего счёта) и статусом. Обработчик помечает счёт оплаченным и записывает транзакцию. Три привычки делают это надёжным:
- Сверяйте подпись в заголовке
X-Qvard-Signature, который приходит с webhook (HMAC-SHA256 вашим секретным ключом), и отклоняйте несовпадения. - Отвечайте ровно HTTP 200, иначе уведомление повторяется, до пяти попыток примерно за шесть минут.
- Делайте обработчик идемпотентным, чтобы повторное событие не записало платёж дважды.
Webhook сообщает о платеже, а не о счёте, поэтому храните рядом со счётом id платежа, дату и статус. Тогда у бухгалтеров будет одна строка на платёж для сверки с выпиской. Полный обработчик приведён в материале как принимать криптоплатежи на сайте.
Недоплаты и комиссии бирж
Самая частая причина обращений в поддержку при криптосчетах это недоплата: плательщик отправил чуть меньше нужного, и счёт не закрыт. Типичные причины:
- клиент платил с биржевого аккаунта, и биржа вычла комиссию за вывод из отправленной суммы;
- клиент округлил сумму;
- клиент отправил перевод двумя частями.
Недоплата приходит со статусом partial. Заранее определите политику и напишите её на счёте: либо счёт остаётся открытым, пока не придёт разница, либо вы принимаете платежи в пределах небольшого допуска. Пусть страница счёта показывает, сколько получено и сколько осталось, чтобы клиент мог доплатить без обращения в поддержку.
Подсказка, которую можно напечатать на счёте: если платите с биржи, добавьте комиссию за вывод к сумме.
Продления и подписки
Картой подписка списывается автоматически. С криптоплатежом иначе: клиент каждый раз отправляет перевод сам, поэтому продление нельзя «вытянуть» из его кошелька.
Практичная схема: вы выставляете счёт на продление как обычно и отправляете клиенту ссылку на оплату, с той же кнопкой и тем же созданием платежа, что и для первого счёта. Qvard создаёт один платёж на каждый ваш запрос; регулярными списаниями управляет ваша биллинговая система, которая создаёт новый платёж на каждый период. Напоминайте клиенту до срока оплаты и, если даёте скидку на годовой тариф при оплате криптой, показывайте её в счёте.
Возвраты и кредит-ноты
Подтверждённый криптоперевод окончателен, поэтому возврат это новый перевод от вас клиенту. Согласуйте адрес с клиентом письменно: перевод на неверный адрес вернуть нельзя. В API Qvard есть вызов выплаты для отправки средств с вашего баланса на адрес, со своим id, чтобы повтор не отправил деньги дважды; можно также вывести вручную из кабинета.
Отразите возврат относительно исходного счёта и выпустите обычную кредит-ноту, чтобы в ваших книгах была та же история, что и в блокчейне.
Чек-лист для бухгалтерии
Вопросы, которые зависят от вашей страны, уточните у бухгалтера, а данные, которые ему понадобятся, настройте заранее:
- номер счёта,
idплатежа, дата, сумма в долларах, актив и сеть; - как вы учитываете поступление и возможную конвертацию в фиат;
- как учитывается комиссия сети, которую оплатил клиент;
- как и когда вы выводите на свой кошелёк.
Это общая информация, а не налоговая или юридическая консультация.
Где здесь Qvard
Qvard это кастодиальный криптоплатёжный шлюз: вы создаёте платёж через API, клиент платит на размещённой странице в USDT или USDC в основных сетях (либо в BTC или LTC), а финальный статус приходит на ваш сервер через webhook. Средства зачисляются на баланс мерчанта, а вы выводите их на кошелёк. Для SaaS-команд отдельно: криптоплатежи для SaaS; основы в материале что такое криптоплатёжный шлюз.
FAQ
Можно ли выставлять счета в крипте, а не в долларах?
Вы выставляете счёт в долларах США, а плательщик отправляет эквивалент в выбранном активе. Так цены стабильны, а учёт остаётся в одной валюте.
Сколько действует курс?
В Qvard курс закрепляется на один час с момента создания платежа. Создавайте платёж, когда клиент готов платить, а не при выставлении счёта.
Что будет, если клиент заплатил меньше суммы счёта?
Платёж придёт со статусом partial. Вы можете оставить счёт открытым до поступления разницы либо принять платёж в пределах допуска, который задаёте сами; укажите правило на счёте.
Можно ли списывать подписку автоматически?
Нет. Криптоплатёж отправляет сам клиент, поэтому его нельзя автоматически списать с кошелька. Ваша биллинговая система выставляет каждое продление и отправляет клиенту ссылку на оплату.


