There are two common ways to take stablecoin payments, and most products end up using both.
Deposit addresses: one per customer, for good
Give each customer their own wallet, keyed by your customer id, and show them its address. Anything they send arrives as a deposit for that customer, today or a year from now.
const wallet = await valtu.wallets.forCustomer("cus_42"); // idempotent
const address = depositAddress(wallet, "tron");
This suits balances and top-ups: exchanges, wallets, brokers, marketplaces holding seller balances, and any product where customers send money whenever they like. You credit whatever arrives, when the deposit.confirmed webhook tells you it's final.
Payment links: one amount, one payment
A payment link asks for a specific USD amount. The payer picks a coin and network, sees the address and amount, and pays. Valtu follows the payment to completed, or reports it as underpaid or expired.
This suits invoices and checkouts: a known price, a single payment, and an outcome you can act on. The payer doesn't need an account with you.
Choosing
| Deposit address | Payment link | |
|---|---|---|
| Amount | Whatever the customer sends | A set USD amount |
| Lifetime | Permanent | Until paid or expired |
| Best for | Balances, top-ups, payouts back to the same customer | Invoices, checkouts, one-off payments |
| Customer needs an account | Yes, your customer id | No |
Both arrive as signed webhooks, and both can be screened before you credit anything.
Start with what matches your product today. The networks and coins page lists every coin either method can accept.