Accepting stablecoin payments: a practical setup

A wallet layout, matching rules and settlement schedule for taking USDT and USDC payments, plus the shortcut of hosted checkouts if you'd rather not build the screen.

The Valtu team

Taking stablecoin payments looks simple: show an address, wait for the money. Doing it reliably for thousands of customers takes a little more structure. This is the setup we recommend.

The fastest path: hosted checkouts

If you don't need your own payment screen, use a checkout. Create one per order with an amount and your externalId, and redirect the customer to its URL. The payer picks a network, pays to a fresh address, and you get a webhook when it's paid, underpaid or expired. Everything below is done for you.

Build it yourself when you want your own screen. Here's how.

Wallet layout

WalletTypePurpose
One per paying customeruserReceives payments; the same address every time for that customer
SettlementtreasuryCollects all sweeps; kept off the API for sending
RefundsoperationalA small float for refunds, and the gas wallet

Per customer or per order? Per customer is simpler: one wallet, reused, and you match payments to open orders. If customers pay many invoices at once, or amounts are ambiguous, create a wallet per invoice instead. Wallets are free to create.

Showing the payment details

Always show the network name next to the address and QR code, along with the exact amount. Paying USDT on the wrong network is the most common customer mistake, and it's avoidable with clear labelling.

Matching payments to orders

Mark an order paid only on deposit.confirmed. Then:

  • Exact amount: mark it paid.
  • Less than due: mark it underpaid and ask for the rest, or refund.
  • More than due, or no open order: send it to a review queue.

Never guess. A review queue costs minutes; a wrong credit costs money.

Settlement

Sweeps collect funds from customer wallets into your settlement wallet. Hourly suits most volumes, daily if payments are small. Set a minimum, for example $50, so you never pay more in network fees than you sweep. Turn on an alert for when the gas wallet runs low or a sweep fails.

Refunds under approval

Refunds are payouts from the refunds wallet, so your policies apply. A typical pair of rules: small refunds made by your API key go through automatically, and unusual refund volume in a day needs a person to approve.

Before going live

  • Network name and coin shown next to every address and QR code
  • Orders marked paid only on deposit.confirmed
  • A review queue for under-, over- and unmatched payments
  • A sweep minimum so fees never exceed what's swept
  • A funded gas wallet on every network you accept, with a low-balance alert
  • Customer screening and a refund policy in place

The full guide, with code, is in Payment acceptance.

Keep reading

More from the blog

payments · stablecoins Deposit addresses or payment links: two ways to take stablecoin payments A permanent address per customer suits top-ups and balances. A payment link suits invoices and checkouts. Here is when to use each, and how both work with Valtu. product · security Introducing Valtu: wallet infrastructure you can verify Wallets for every customer, deposits that are credited only when final, payouts your own team approves, and keys held in hardware enclaves you can check yourself. bitcoin · payouts Stuck Bitcoin payouts: how replace-by-fee gets them moving When Bitcoin fees jump after a payout is sent, it can sit unconfirmed for hours. Replace-by-fee resends the same payment with a higher fee, without paying twice.

Start with a test workspace today.

Same dashboard, same API, free test coins. Go live when your team is ready.