Get testnet tokens
Native gas
You do pay gas to deploy your pool — one wallet-paid transaction per chain you activate, with a live fee estimate first. Get a little of each testnet chain’s native token from its faucet: enough for that deploy, and for withdrawing from the dashboard yourself if you choose to.
Test stablecoins
Circle runs a public faucet for testnet USDC and EURC across most supported chains. BNB testnet is the exception: Circle has no USDC there, so the “USDC” on that network is our own open-mint test token. Chains and tokens.
The happy path
Turn on a network
Connect your payout wallet in the dashboard and sign the one-time ownership message — no gas, and not chain-specific. Then, per network you want to accept, flip it on and deploy: a second signature broadcasts the deploy transaction from your wallet, paying that testnet’s (free) gas, with a live fee estimate shown first. Base Sepolia is a good default to start with.
Open your checkout
Confirm the destination-verification badge appears on the pay screen, after currency, network and payment method are chosen. When paying by copying the deposit address, it renders next to the address as soon as the address is shown. When paying with a connected wallet, the check runs when the customer clicks Pay — still before the wallet signature prompt — so the badge appears at that point, not earlier.
Pay both ways
Once with a connected wallet, once by copying the deposit address and sending manually. They behave differently and both need to work.
Watch the webhook
Confirm the pool webhook arrives and your signature verification passes. Paying by copying the deposit address gives you
pool.deposit.confirmed when the inbound transfer confirms, then pool.swept when our sweep into your pool lands; paying with a connected wallet emits only pool.swept. pool.distributed follows when the funds are split out. There is no payment_confirmed event on either path.Claim
Do a full round trip. Confirm the funds land in your payout wallet. With default settings you receive 99% of a connect-rail order — just the 1% platform fee, nothing else carved out at
distribute(). A deposit-rail order nets slightly less: check the intent’s surchargeUnits, the network fee the forwarder held back before sweeping into your pool.The failure paths
More valuable than the happy path, because these are what actually cost you money in production.Customer closes the tab immediately
Customer closes the tab immediately
Pay, then close before the success screen.Expect: no browser callback, but the webhook still arrives and the order still fulfils. If your fulfilment depended on the callback, you’ve just found it.
Duplicate webhook delivery
Duplicate webhook delivery
Replay a delivery from your logs, or return a 500 once and let us retry.Expect: the second delivery is a no-op. If you shipped twice, key on
X-Webhook-Id.Underpayment
Underpayment
Send less than quoted to the pay-to address.Expect: status
underpaid with the shortfall shown. Confirm you have a documented response. Edge cases.Overpayment
Overpayment
Send more than quoted.Expect: the full amount arrives. The excess is yours to refund manually.
Wrong token
Wrong token
Send a token you haven’t enabled.Expect: it depends on which token. We watch USDC on the EVM testnets, EURC on the three that have it (Ethereum Sepolia, Base Sepolia, Avalanche Fuji), and USDT on TRON. Sending one of those to an invoice that expects a different one surfaces as
wrong_token — readable through the payment-status API and shown on the order in Payments under the needs-attention statuses, though it fires no webhook.Any other ERC-20 sent to a deposit address is not detected at all: the invoice stays waiting and then expires. The funds are still on-chain at the deposit address and can be recovered by a manual sweep, but nothing in the product will tell you they arrived.Late payment
Late payment
Let a quote expire, then pay the address anyway.Expect: funds arrive and are credited as paid late. Decide whether you honour the old price. Not on TRON — once a TRON quote expires we stop watching that address, so a late payment there isn’t credited automatically. Roadmap.
Broken verification
Broken verification
Temporarily change
settlementAnchor to a different address.Expect: the checkout blocks with a configuration mismatch and hides the payment address. If it lets the customer pay, your anchor isn’t wired up. Change it back afterwards.Testing webhooks locally
Your endpoint needs to be reachable from the internet. A tunnel works:X-Webhook-Signature: t=<ts>,v1=<hmac> over "{timestamp}.{raw_body}", envelope {id, event, created_at, data} — with event payment.test and data.test: true. If your handler verifies it, it verifies production.
So use the test send to confirm your endpoint is reachable and returns 2xx — then verify your signature handling against a real testnet payment.
Before you switch to mainnet
Go-live checklist
Everything to confirm before real money.