Crypto checkout errors rarely come from blockchain reliability; they come from how merchants handle networks, exact amounts, and payment verification. For teams accepting USDT through a non-custodial gateway like bestuPay, the differences between TRC20 and BEP20, amount matching, and webhook handling determine whether a payment is recognized correctly. This guide covers five operational mistakes and concrete steps to prevent them in your integration.
Mistake: Accepting the Wrong Network
USDT exists on multiple blockchains, but a TRC20 transfer cannot be recovered if sent to a BEP20 address. Merchants sometimes assume that displaying only the wallet address is enough. In practice, users choose the cheapest or default network in their wallet and may send funds on an unsupported chain. The checkout experience must make the expected network explicit before any transfer begins.
Prevent this by reading the network value returned when you create a payment order. Show a prominent label such as 'USDT-TRC20 only' or 'USDT-BEP20 only' next to the address and QR code. If your system supports multiple networks, do not combine them into a single checkout view. Separate links or clear toggles reduce the chance that a customer selects the wrong option.
- Display the full network name and ticker (USDT-TRC20 or USDT-BEP20) beside the address.
- Reject order creation if the requested network is not enabled for that merchant wallet.
- Test both networks in staging with small amounts before enabling production checkout.
Mistake: Ignoring Exact Amount Matching
Because blockchains are push-based, customers can send any amount close to the requested total. A payment that is off by a few cents will not match the order and may require manual intervention. Relying on visual confirmation or the customer's wallet screenshot is error-prone. The payment system must compare the received amount against the expected amount, including decimal precision.
With bestuPay, blockchain order matching uses an exact generated amount with a unique decimal suffix. That suffix makes each payment order distinct even when two orders have the same base amount. The merchant must display the exact string returned by the API, not a rounded or truncated version. Even one missing decimal place can cause the payment to remain unmatched.
Prevent amount mismatches by storing the expected amount as a string, not a floating-point number, throughout the order lifecycle. Show the exact amount to the customer in the checkout UI and in any copy-paste field. When receiving a transfer, compare the full decimal string after normalizing for network precision. Do not accept approximate amounts automatically.
- Store amounts as strings with fixed decimal places; never use floats.
- Display the full generated amount including the unique decimal suffix.
- Trigger an alert for near-miss payments that differ by less than one base unit.
Mistake: Treating One Confirmation as Final
Some merchants update the order to paid as soon as the transaction appears in the mempool or after zero confirmations. This is risky because a transaction can be replaced or dropped before being included in a block. For USDT on TRC20 or BEP20, the practical finality threshold may vary, but one confirmation is rarely enough for high-value orders.
Set a confirmation requirement per order amount or risk level. Low-value digital goods might accept two confirmations, while larger invoices should wait for more. Your system should record the number of confirmations and the latest transaction hash for each payment. Do not rely on a single webhook event to mark an order settled; instead, update status as confirmations increase.
- Define confirmation thresholds by order value before going live.
- Store confirmations and transaction hash in the order record.
- Show confirmation progress in the admin or customer status page.
Mistake: Polling Instead of Using Webhooks
Polling a blockchain explorer or the gateway API to detect payments creates a fragile integration. It adds latency, consumes rate limits, and may miss a transaction that arrives between polls. The correct approach is to expose an HTTPS endpoint that receives signed webhooks from the payment provider. Your endpoint should be idempotent and respond quickly.
bestuPay sends signed webhooks using HMAC-SHA256 over the raw JSON body with your site's Webhook Secret. Verify the signature before parsing the payload, and reject any request that fails validation. This prevents spoofed payment notifications. The dashboard records payment status, confirmations, transaction hashes and webhook history, which helps you audit failed deliveries and retry logic.
- Register a single HTTPS webhook endpoint for all payment status updates.
- Verify HMAC-SHA256 signature using the raw body, not the parsed JSON.
- Return HTTP 200 only after persisting the event; queue unknown events for review.
Mistake: Skipping Reconciliation and Idempotency
Without a reconciliation process, small manual refunds or missed webhooks can create accounting gaps. Merchants should compare internal order states against the gateway records daily or after high-volume periods. Idempotency means processing the same webhook event multiple times does not create duplicate fulfillments or balance updates.
Design your order state machine so that transitions are one-way and keyed by the webhook event ID. Use a unique constraint on the transaction hash or order ID to prevent duplicate inserts. When a mismatch is found during reconciliation, mark the order for manual review instead of auto-completing it. Keep immutable logs of every status change.
- Run automated reconciliation at least daily for all open orders.
- Store the webhook event ID and transaction hash as unique keys.
- Alert operations staff for any order that remains unpaid after a configured timeout.