Customers can pay your payment links and invoices in stablecoins, sent from their own wallet straight to your business wallet. Anytime Capital never holds the funds: we watch the chain, match the transfer to the order, and record the payment once it is final, with a receipt in your branding.
What is accepted
| Network | Tokens | Final after |
|---|---|---|
| Ethereum (ERC-20) | USDC, USDT | 12 confirmations (about 2–3 minutes) |
| Solana (SPL) | USDC, USDT | Finalized (usually under a minute) |
| Tron (TRC-20) | USDT | Confirmed (about a minute) |
Prices stay in US dollars and are paid at 1 token = $1. When a token trades materially away from $1, checkout stops offering it until it is back. Stablecoins aren't offered on subscriptions, on links that collect a shipping address or ask required questions, or while sales tax is added at checkout.
Turn it on
- Set up your business wallet on the Wallets page, so its Ethereum, Solana and Tron addresses are on file.
- Open Settings → Stablecoins (owners and admins), switch on Accept stablecoins, and choose the tokens and networks.
- For each network, choose which of your business wallet's own addresses customers pay, and confirm it. Only your wallet's addresses can be chosen; an address can't be typed in.
- Save. Your payment links and invoices now show Pay with stablecoin below the card form.
How a customer pays
- They choose a token and network and enter an email for the receipt (and, on a link, the quantity, amount or discount code it offers).
- Checkout shows the exact amount to send, your address and a QR code: an Ethereum payment request (EIP-681) or a Solana Pay link that fills in the token and amount, or the plain address on Tron. They have 30 minutes.
- The amount is the price plus a fraction of a cent (for example 25.004217 USDC for $25.00). No other open payment to your address asks for the same amount, which is how the transfer is matched to this order.
- The page updates as the transfer is seen, confirmed and final, then shows the receipt.
Statuses
| Status | What it means |
|---|---|
| Pending | Waiting for the transfer. |
| Confirming | The transfer is on the chain and waiting to be final. |
| Underpaid | Less than the price arrived. The customer has 15 more minutes to send the rest to the same address. |
| Paid | The price (or up to a cent over) arrived and is final. The payment is recorded. |
| Overpaid | More arrived than asked. It counts as paid, and you're told the difference to send back. |
| Expired | Nothing arrived in time, or not enough. If part of it arrived, you're told so you can refund it. |
| On hold | The sending wallet is on our compliance blocklist. Nothing is recorded or fulfilled; our compliance team contacts you. |
A transfer of the exact amount that arrives within a day after a payment expired is still matched to it and recorded, and you're told it came late. An amount that isn't exact is only taken as the customer's when theirs is the one payment open to your address and it is close to what was asked (at least half of it, and at most a quarter of the price or $10 over); anything else stays in your wallet, unmatched, for you to sort out.
Once it's paid
- The payment appears in Orders and Payments with the method “USDC on Ethereum” (or the token and network used), the transaction and the customer's wallet.
- An invoice is marked paid, or partly paid for a deposit or part payment. A one-time link closes and a discount code counts one use.
- We email the customer's receipt and your team's “New payment” alert, and send the
payment.succeededwebhook.
The payment.succeeded webhook
A stablecoin payment's webhook carries paymentMethod.type stablecoin and a stablecoin object with the chain, token, amounts, wallets and every transaction with its explorer link. Its payment id starts pay_sc.
{
"id": "evt_…",
"type": "payment.succeeded",
"created": "2026-10-24T14:05:12.000Z",
"data": {
"object": "payment",
"id": "pay_scR8m2KqT4vX9bLw3NfYc7Hd1Pz",
"status": "paid",
"amountCents": 2500,
"currency": "usd",
"description": "Ceramic mug",
"source": { "type": "payment_link", "id": "pl_8fK2mQ9xLw3NfYc7Hd1P" },
"customer": { "name": "Ana Ruiz", "email": "ana@example.com", "country": null },
"paymentMethod": { "type": "stablecoin", "label": "USDC on Ethereum" },
"card": null,
"paidAt": "2026-10-24T14:05:09.000Z",
"stablecoin": {
"chain": "ethereum",
"network": "ERC-20",
"token": "USDC",
"tokenContract": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "25.004217",
"requestedAmount": "25.004217",
"overpaidAmount": null,
"receivingAddress": "0x…your wallet",
"payerAddress": "0x…customer's wallet",
"txHash": "0x…",
"explorerUrl": "https://etherscan.io/tx/0x…",
"transactions": [
{ "txHash": "0x…", "explorerUrl": "https://etherscan.io/tx/0x…", "amount": "25.004217" }
]
}
}
}Refunds
Refunds are manual. The payment went straight to your wallet, so send the tokens back from it, in the same token and on the same network, to an address the customer gives you. Refund in Orders isn't available for stablecoin payments.