SaaS и счета

Криптоинвойсы для B2B SaaS

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

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

Зачем SaaS-компании криптосчета

Крипта редко бывает основным способом оплаты для SaaS, и это нормально. Она полезна как дополнительный вариант, когда:

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

Для остальных оставьте карты и банковские переводы. Крипта это ещё одна строка в списке «как оплатить» на вашем счёте.

Чем счёт отличается от кассы

Касса магазина создаёт платёж в момент покупки. Счёт выставляется заранее, а оплачивается через дни или недели, часто финансовой командой по внутреннему процессу. Из этого следует:

  • Сумма зафиксирована в долларах, а не в монетах. Вы выставляете счёт в долларах, а плательщик отправляет эквивалент в используемом активе.
  • Курс нельзя держать неделями. В Qvard курс закрепляется на один час с момента создания платежа. Курс на момент выставления счёта к моменту оплаты давно устарел бы.
  • Нужна ссылка на счёт. Финансовым командам нужен номер счёта в каждом платеже, чтобы сверять.
  • Плательщики работают по согласованиям. Они могут платить частями или с задержкой, поэтому нужны чёткие правила для частичных оплат.

Создавайте платёж, когда клиент готов платить

Главное решение: не создавайте криптоплатёж при выставлении счёта. Создавайте его, когда клиент решил платить.

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

Номер счёта в роли id даёт два преимущества. Если клиент нажмёт дважды или ваш запрос повторится, Qvard вернёт уже созданный платёж для того же id и способа оплаты, а не создаст дубль. А webhook с результатом приходит с тем же id, поэтому вы находите счёт без таблицы соответствий.

Node.jspay-invoice.js
// 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. Вы можете оставить счёт открытым до поступления разницы либо принять платёж в пределах допуска, который задаёте сами; укажите правило на счёте.

Можно ли списывать подписку автоматически?

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

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

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