How to Accept USDT (TRC20) Payments: A Step-by-Step Guide
Learn how to accept USDT TRC20 payments on your online store: invoices, a hosted payment page, block confirmations, webhooks and withdrawals explained.

To accept USDT TRC20 payments properly, posting a wallet address on your site is not enough. You need a separate invoice for every order, a reliable way to confirm the payment on-chain, and automatic order fulfilment. This guide covers the whole flow for an online store, from the first invoice to your first withdrawal.
Why USDT, and why TRC20?
USDT is a stablecoin pegged to the US dollar. If a product costs 25 dollars, your customer sends 25 USDT and you receive 25 dollars' worth. Volatile coins can drift between checkout and payment. With USDT the price and the payment stay aligned.
USDT exists on several blockchains. TRC20, the version on the TRON network, is popular for commerce because:
- Transactions are fast. TRON produces a new block every few seconds.
- Network fees are usually low compared to some busier networks.
- Most exchanges support USDT withdrawals over TRC20, so customers can pay straight from their exchange account.
For a deeper comparison, read What is USDT? TRC20 vs ERC20 vs BEP20.
Why a single wallet address doesn't scale
Many small sellers start by sending customers one wallet address. It works until the orders pile up:
- Matching: when two payments land on the same address, it's hard to tell which order each belongs to.
- Wrong amounts: it's unclear what to do when a customer sends 24.50 USDT instead of 25.
- Manual work: checking every payment in a block explorer is slow and error-prone.
- Security: a static, public address is an easy target for scams such as address poisoning.
A crypto payment gateway handles all of this for you. It gives each open invoice its own payment address, watches the chain, counts confirmations and notifies your server. For the full mechanism, see What is a crypto payment gateway?
How to accept USDT TRC20 payments in 6 steps
The steps below use MercanPay as the example, but any well-designed gateway follows the same logic.
1. Open a merchant account
Fill in the merchant application. You answer a short business questionnaire, and your account is approved. The interface is available in English and Turkish.
2. Set up security first
Turn on two-step login, with either an email code or an authenticator app. Add the wallet you'll withdraw to as a saved address. Every panel withdrawal asks for an email code plus an authenticator (TOTP) code.
3. Create an invoice
An invoice can be priced in one of two ways:
| Pricing | How it works | Best for |
|---|---|---|
| In a coin | For example 25 USDT. The customer pays exactly that. | Stores that already price in USDT |
| In USD | For example $25. The customer picks TRX or USDT on the payment page, and the rate is locked. | Dollar-priced stores that want to offer a choice |
You can create invoices by hand in the panel or automatically through the API for every order. The minimum invoice is $10. USDT invoices include a 1 USDT network fee, which the customer pays.
4. Send the customer to the payment page
Every invoice comes with a payment_url. This hosted payment page shows:
- a QR code and a copyable TRON address
- the exact amount to pay
- a countdown (invoices stay open for at most 24 hours)
- a TRX / USDT choice for USD-priced invoices
As soon as the customer sends the payment from an exchange or wallet, the page switches to "payment detected · confirming".
5. Wait for confirmation and the webhook
A payment is credited after 20 block confirmations, which usually takes about a minute. We explain why confirmations matter in What are block confirmations?
When the invoice is paid, your server receives a signed invoice.paid webhook, and you fulfil the order based on it. Our guide on verifying webhook signatures shows how to check that signature.
6. Withdraw your balance
You can withdraw your balance to your own TRON wallet at any time. The withdrawal fee is between $1 and $3, and the minimum withdrawal is $10 worth.
Creating invoices from code
If your store runs on PHP or Python, the official libraries keep this short. This PHP example creates a USD-priced invoice and redirects the customer to the payment page:
<?php
// composer require mercanpay/mercanpay-php
require 'vendor/autoload.php';
$zp = new \MercanPay\MercanPay('https://mercanpay.com', getenv('MERCANPAY_API_KEY'));
$invoice = $zp->createUsdInvoice('25.00', [
'order_id' => 'order-1001',
'description' => 'Premium membership',
'success_url' => 'https://myshop.com/order/1001/thanks',
]);
header('Location: ' . $invoice['payment_url']);
To accept USDT only, use createInvoice('USDT', '25', ['order_id' => 'order-1001']). Repeating a request with the same order_id returns the existing invoice instead of creating a new one, so it is always safe to retry after a network error.
For more, see the PHP integration guide, the Python integration guide and the API documentation. On a platform such as WooCommerce, you integrate through the API or the PHP library, and you can build your own plugin on top of them.
What to tell your customers
The most common mistake in crypto payments is a customer picking the wrong network on their exchange. A one-line note next to your checkout prevents a lot of support tickets:
When sending USDT, choose TRON (TRC20) as the network on your exchange, and send the exact amount shown on the payment page.
We cover what happens otherwise in Crypto sent to the wrong network.
Underpayments, overpayments and late payments
Real payments don't always match to the cent. On MercanPay:
- Underpayment: the invoice moves to
partialand gets extra time, so the customer can send the rest to the same address. You can also set an optional underpayment tolerance between 0% and 20%. - Overpayment: the full amount received is credited to your balance, and an
invoice.overpaidevent is sent. - Late payment: a payment to an expired invoice is still credited. For TRX on USD-priced invoices, it is re-priced at the current rate.
Read the full breakdown in Underpayments, overpayments and late payments.
FAQ
How long does a USDT TRC20 payment take to confirm?
The payment page detects it as soon as it appears on-chain. It is final after 20 block confirmations, usually about a minute.
What are the fees?
Commission is set per merchant and starts from 0.4%. Withdrawals cost between $1 and $3 each.
Can customers pay with TRX?
Yes. On USD-priced invoices, customers choose TRX or USDT on the payment page. Coin-priced invoices are paid in that coin.
Can I accept USDT on other networks?
Not at the moment. MercanPay supports TRX and USDT on the TRON network (TRC20) only.
Get started with MercanPay
Accepting USDT TRC20 payments takes a few minutes to set up. You create the invoice, send the customer to the payment page, and let the webhook do the rest. Apply for a merchant account and create your first invoice today.


