Crypto payments for SaaS
Let customers pay each billing period in USDT and other crypto. You create a payment per invoice through the API, send the link and extend access when the webhook says the payment is complete.
- One invoice per billing period
- A payment per invoice through the API
- Access extended by webhook
When crypto fits a SaaS business
Crypto is a second way to pay, next to cards, for the customers the card rails fail:
- teams in countries your card processor does not serve, or whose cards are declined for foreign software;
- companies that prefer to pay a large annual invoice by transfer rather than by card;
- developer, infrastructure and hosting buyers who already hold dollar stablecoins.
A crypto payment cannot be reversed by the sender, so there are no card chargebacks on these invoices. It adds a payment method; it does not replace card billing for everyone else.
The model: one invoice per billing period
Card billing charges a stored card automatically. A crypto payment has to be started by the customer, so the model that works is a prepaid invoice for each period:
- Shortly before the period ends, your system creates an invoice and a Qvard payment for it.
- The customer gets a link to the hosted payment page, picks an asset and a network and pays.
- When the payment is complete, Qvard calls your webhook and you extend the subscription.
There is no stored payment method and no automatic charge. Qvard does not offer recurring billing as a product, so renewal reminders, the grace period and plan changes are your own logic.
How it works
Create the payment from your backend with one POST to https://api.qvard.com/api/v1/payment: your key in the x-api-key header, your invoice number as id and the amount as price, in US dollars unless you send currency, for example INR. The response contains a redirectUrl, the address of the hosted payment page; put it in the invoice email.
When the payment is complete, Qvard sends a webhook with your id and the status completed. Check the x-api-key header, mark the invoice paid only if it is not paid yet, answer exactly HTTP 200 and extend the subscription. The exchange rate on the payment page is fixed for one hour.
// A few days before a period ends: create the invoice and its payment.
async function createRenewalInvoice(sub) {
const invoice = await db.invoices.create({ subscriptionId: sub.id, amountInr: sub.planPriceInr, status: 'open' });
const res = await fetch('https://api.qvard.com/api/v1/payment', {
method: 'POST',
headers: { 'x-api-key': process.env.QVARD_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ id: String(invoice.id), price: invoice.amountInr, currency: 'INR' })
});
const { redirectUrl } = await res.json();
await mailer.send(sub.email, 'Your renewal invoice', 'Pay here: ' + redirectUrl);
}
// In the webhook handler, when status is "completed" (and the x-api-key header matches).
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');
}What stays on your side
Be clear about what you build and what the gateway does for you.
- You: invoices, reminders, the grace period, upgrades and downgrades, refunds and accounting.
- The gateway: the payment page, addresses, network monitoring, payment statuses and the webhook.
If a customer pays only part of an invoice the payment gets the partial status and no completion webhook is sent; keep the invoice open and ask for the rest. Return URLs after payment are not available yet, so give customers a billing page that shows the real invoice status.
Money and fees
There is no subscription fee for the gateway. The commission is individual to your project and, per the pricing page, starts at 1% and can go down to 0.1%. Funds sit on your Qvard balance and you withdraw them to your own wallet; the withdrawal costs only the network fee. Withdrawal to a bank account in fiat is not available. Pricing stays in dollars; customers pay the equivalent in the asset and network they choose.
What is ready today
The integration is through the API, which takes a developer; there is no ready-made billing plugin yet, and payment links and a separate sandbox are in development. Read the full guide in crypto payments for SaaS, the invoicing side in crypto invoicing for B2B SaaS and the webhook rules in how to secure crypto payment webhooks. The request formats are in the developer documentation, and a demo invoice shows what your customer sees.
FAQ
A quick overview of how Qvard handles payments, integration and merchant operations.
What is Qvard?
Qvard is a custodial crypto payment gateway for businesses that need hosted checkout, invoices, API payments and merchant balances.
Which assets are supported?
You can accept USDT, USDC, BTC, LTC, TRX, BNB and ETH. USDT is available on several networks, so customers can pay through the route they already use. TON and USDT on TON are coming soon.
Is it good for developers?
Yes. The integration is built around creating a payment, redirecting the customer to redirectUrl and receiving a final webhook status, so orders in your system update automatically.
Can I customize checkout?
Yes. You can set the shop name, logo, button color and localized texts so the payment page feels like part of your product. Custom return URLs (successUrl/failUrl) are coming soon.
What do I need to get started?
Create a merchant account and complete business verification. After testing a demo invoice, connect hosted checkout or the API and start accepting real payments.
How do withdrawals work?
Funds are tracked in merchant balances separated by asset and network. You can withdraw manually or set up withdrawal rules for automatic payouts.