payfjordUSDT payment gateway
HomePricingFAQGuides
Sign inStart free
payfjordUSDT payment gateway

Payfjord reads public blockchain data and reports back to your website. Your customers' money goes straight to your wallet — we never hold it.

Product

  • Pricing
  • Create account
  • API docs

Support

  • FAQ
  • Contact
  • Sign in

Legal

  • Terms & Privacy
  • Privacy policy

© 2026 Payfjord

A technical service that reads blockchain data. Not an exchange — we never hold or convert your assets.

All guides
14 August 2026·9 min read·Updated Sept 2026

How to Accept USDT Payments on Your Website in 2026

Accepting USDT is mostly a plumbing problem, not a crypto problem. You need an address customers can pay, a reliable way to know the money arrived, and a webhook your server trusts. Everything else is detail.

On this page

  1. 1.What you actually need
  2. 2.Why the amount has extra decimals
  3. 3.Choosing networks
  4. 4.Creating an invoice
  5. 5.Handling the callback
  6. 6.What happens when something goes wrong

What you actually need

Three things, in this order: a wallet you control, a gateway that watches the blockchain for you, and a callback handler on your server that credits the customer.

The wallet is yours. A non-custodial gateway never touches it — it reads public blockchain data and tells your server when a payment lands. Nobody in the middle can move your money because nobody in the middle holds the keys.

  • A receiving address on each network you want to accept
  • A merchant account with API credentials
  • A callback endpoint on your site that is idempotent
  • A record of the exact amount each invoice expects

Why the amount has extra decimals

Ask for 50 USD and the gateway will tell your customer to send 50.07. That is not a fee. It is how the system tells two invoices apart.

Every merchant has one receiving address per network. If two customers both owe exactly 50 USDT and both pay to the same address, nothing in the transaction says which order it belongs to. The identifying decimals make each open invoice unique, so an incoming transfer maps to exactly one order.

Store the number the API returns, not the number you asked for. That is the figure the customer will send and the figure the callback will report.

Choosing networks

USDT is one currency travelling over many networks. The token is identical; the network only changes the fee and how long confirmation takes.

Offer at least two. Customers arrive with funds already sitting on a particular chain, and forcing them to bridge is the fastest way to lose a sale.

NetworkTypical confirmationNotes
Tron (TRC20)~1 minuteThe most common choice for USDT in Asia
BNB Smart Chain~45 secondsCheap, widely supported by exchanges
Polygon~1 minuteVery low network fees
Ethereum (ERC20)~2 minutesUniversally supported, highest network fee
Arbitrum / Optimism / Base20–40 secondsLow fee, growing exchange support
TON~5 secondsPopular with Telegram-native audiences

Creating an invoice

One call. You send the amount in USD, an order id from your own system, and the URL you want called when the payment settles. You get back a transaction id and a hosted checkout page to redirect the customer to.

Save the returned amount and transaction id against your order before you redirect. If the customer closes the tab and comes back later, that record is how you find the invoice again.

Handling the callback

When the transfer has enough confirmations, the gateway calls your URL with the payment details. Your handler must do two things: verify the request really came from the gateway, and refuse to credit the same order twice.

Double-crediting is the single most common integration bug. Callbacks retry when your site is unreachable, so the same notification can legitimately arrive more than once. Check whether the order is already marked paid before you add anything to the customer's balance.

  • Verify the merchant id and API key in the request
  • Look up your order by request_id, not by amount
  • If the order is already paid, return success and do nothing else
  • Credit the customer, mark the order paid, then return success

What happens when something goes wrong

Customers pay late, pay the wrong amount, or pay after an invoice expires. A gateway that only handles the happy path leaves you reconciling by hand.

Late and mismatched transfers should be recorded with their transaction id so you can decide what to do — refund, credit manually, or ignore. The money is in your wallet either way; what you need is a record that explains where it came from.

Frequently asked questions

Do I need to hold crypto to accept USDT?
No. Payments land directly in the wallet you configured. You can move funds to an exchange and convert to fiat whenever you like — the gateway is not involved in that step.
What if the customer sends the wrong amount?
The transfer will not match any open invoice, so it is recorded as unmatched with its transaction id. You can then credit the customer manually or refund them. The funds are already in your wallet.
How long does an invoice stay open?
Typically between 10 and 120 minutes, configurable per store. Longer windows are friendlier to customers but reduce how many invoices can share the same price at once.
Can I accept several networks at the same time?
Yes. Enable each network you want and the customer picks one on the checkout page. Switching networks does not change the USD value of the invoice.

Related guides

  • USDT TRC20 vs BEP20 vs ERC20: Which Network Should You Accept?

    7 min read

  • Crypto Payment Callbacks: How to Handle Them Without Double-Crediting

    8 min read

  • Non-Custodial Crypto Payment Gateway: Why Holding Your Keys Matters

    6 min read

Payfjord reads the blockchain and calls your callback. Money goes straight to your own wallet — we never hold it.

Get started