EN

Accepting USDT in WooCommerce: a crypto payment plugin step by step

Accepting USDT in WooCommerce

Shops selling game keys, gift cards, accounts, courses and other goods get more and more buyers who would rather pay in crypto, most often in USDT. This guide shows how to add crypto as a payment method in WooCommerce: the customer picks Crypto at checkout, pays on the SnapEX Pay page in USDT on TRON, Ethereum, BSC, Solana, TON, Polygon or another network, or in another coin, and the order becomes Processing by itself. You don't run a wallet or a blockchain node — the money lands in your SnapEX Pay merchant balance in USDT.

How a payment goes

customer → Crypto → Place order
plugin → SnapEX Pay: invoice in USD
customer → pays on SnapEX Pay page
SnapEX Pay → signed webhook → shop
plugin → GET invoice via API → paid?
WooCommerce: order Processing
  1. The customer places the order with the crypto method. The plugin creates a SnapEX Pay invoice for the order total in USD and sends the customer to the payment page.
  2. The customer chooses a coin and network and pays. When the invoice is paid, SnapEX Pay sends a signed webhook to your shop.
  3. The plugin re-reads the invoice from the SnapEX Pay API and completes the order only if the invoice is paid for the right amount. The webhook body alone never marks anything paid.

An order is marked paid three independent ways, whichever comes first: the signed webhook, the customer returning from the payment page, and a background check (WP-Cron runs it every 5 minutes; each pending order is re-checked at most every 10 minutes, for 5 days). A lost webhook never leaves a paid order unpaid, and an order is never completed twice — even if the webhook, the return page and the check fire at the same moment.

What you need

  • WordPress 6.2+ and WooCommerce 8.2+ (tested up to WooCommerce 11.2).
  • PHP 7.4 or newer.
  • HTTPS on the shop address, so SnapEX Pay can deliver webhooks to it.
  • A SnapEX Pay merchant account: sign up at pay.snapex.pro.

The plugin works with the Checkout block and the classic [woocommerce_checkout] page, with "Pay for order" links, and with both HPOS (custom order tables) and legacy order storage.

Step 1. Install the plugin

The plugin is free and listed in the WordPress.org catalog: SnapEX Pay for WooCommerce.

  1. In the WordPress admin open Plugins → Add New Plugin and search for SnapEX Pay.
  2. Click Install Now on SnapEX Pay for WooCommerce, then Activate. WooCommerce must already be active.

With WP-CLI:

wp plugin install snapex-pay-for-woocommerce --activate

If the server can't reach WordPress.org, download snapex-pay-for-woocommerce-1.1.0.zip and upload it in Plugins → Add New Plugin → Upload Plugin. Updates then come through the usual WordPress update screen. The plugin needs nothing set up in the database by hand.

Step 2. Get an API key

In the SnapEX Pay merchant cabinet open Developers and create an API key. The plugin needs the invoices.read and invoices.write scopes; a key created in the cabinet gets all Merchant API permissions, these included. The key is shown once — copy it right away. Reissuing the key revokes the old one at once, so update it in WooCommerce at the same moment.

Step 3. Set up the payment method

Open WooCommerce → Settings → Payments and click SnapEX Pay (crypto) (or Settings next to the plugin on the Plugins page). Fill in:

Setting What to put
Enable Tick Accept crypto with SnapEX Pay.
Title What the customer sees at checkout; Crypto (USDT and other coins) by default.
Description The line under the title at checkout.
API key The key from step 2. Without it the method stays hidden at checkout.
Webhook secret See step 4.
Network fee paid by Merchant — the customer pays exactly the order total, and the fees are taken from what you receive. Customer — the SnapEX Pay fee and the network fee are added on top. More: Who pays the fees on a crypto invoice.
Payment window, minutes How long the payment page stays valid: 1 to 1440, 60 by default.
USD for 1 … Only if the store currency isn't USD — see step 5.
Test mode See step 6.
Partner ID See step 7.
API URL Leave as is.

Save the changes. The method now appears at checkout with the SnapEX Pay icon.

Step 4. Set up the webhook

The webhook is optional but recommended: with it, an order becomes Processing as soon as the payment is confirmed, not on the next background check.

  1. Copy the webhook address shown under the Webhook secret field. With pretty permalinks it looks like https://<your shop>/wc-api/snapexpay_webhook/.
  2. In the cabinet, on the Developers page, paste it as the webhook URL and save.
  3. The whsec_… signing secret is shown once, right after the first save. Paste it into Webhook secret in WooCommerce and save.

How the plugin checks a notification:

  • the Webhook-Signature header: HMAC-SHA256 of {Webhook-Timestamp}.{raw request body} with your secret; a missing or wrong signature gets 401;
  • Webhook-Timestamp within 5 minutes of the server clock (older gets 400) — keep NTP on;
  • the invoice itself, re-read from the SnapEX Pay API with your key.

If the API can't be reached at that moment, the plugin answers 502, and SnapEX Pay retries the delivery. The cabinet has one webhook URL per account; events for invoices this shop didn't create are answered 200 and skipped, so the same merchant account can also serve a billing panel or a bot. Opening the webhook address in a browser shows SnapEX Pay webhook endpoint — a quick way to check that nothing (a firewall, a security plugin, a cache) blocks it. More about signatures and retries: Crypto payment webhooks.

Step 5. If the store currency isn't USD

SnapEX Pay invoices are in US dollars. If your store sells in EUR, RUB or anything else, the settings show an extra field USD for 1 EUR (with your currency code). Two ways:

  • A fixed rate. Put how many US dollars one unit of your currency is worth: if 1 EUR is 1.08 USD today, put 1.08. The order total is converted at this rate. Keep it current yourself.
  • A currency plugin. Leave the field empty and convert in the snapexpay_wc_amount_usd filter: it gets the amount (or null), the order total, the currency and the order, and returns the amount in USD.

Without a rate or a filter the crypto method is hidden at checkout, so customers never see a method that can't take their order.

Step 6. A test order without real money

  1. Turn on Test mode. From now on the method is shown only to shop managers (users who can manage WooCommerce, administrators included); customers don't see it, so nobody pays a real order with test money.
  2. In the same browser, logged in as an administrator, add a product to the cart, go to checkout, pick the crypto method and place the order.
  3. The SnapEX Pay page has a Test label. Pick any coin and network: the page shows a test address, and in about 10 seconds the payment confirms by itself. You don't send anything.
  4. You're sent back to the order-received page, and the order in WooCommerce → Orders becomes Processing. Its notes show SnapEX Pay: invoice INV-… paid … Test payment. If not, look at the order notes, at WooCommerce → Status → Logs (source snapexpay) and at the delivery log on the Developers page in the cabinet.
  5. Turn test mode off.

Test payments are never applied once test mode is off (the order note says test invoice … paid while test mode is off — not applied), so test money can't pay for real goods. More: How to test crypto payments without real money.

Step 7. Partner ID: who set up the plugin

The Partner ID field is optional. If you set up WooCommerce for your own shop, leave it empty.

If you are an agency or a WordPress freelancer and set up shops for clients, paste your Partner ID: the client's merchant account is bound to you, and you get 35% of our fee on that client's payments. The client creates their own SnapEX Pay account and API key, and the money goes to their balance. Terms: SnapEX Pay partner program.

What the customer sees

  • At checkout — the crypto method with the title and description from the settings.
  • After Place order — the SnapEX Pay payment page: USDT on TRC20, ERC20, BEP20, Solana, TON, Polygon and other networks, and other coins (60+ in total), if SnapEX Pay offers them for the order amount.
  • After paying, the customer comes back to the shop's order-received page. If the payment is already confirmed, the order is paid right away; otherwise it becomes Processing on the webhook or the next background check.
  • If the payment page expires, its back-to-shop button leads to the order's "Pay for order" page. Paying again while the payment page is still valid opens the same page, not a second invoice; after it expires, or if the order total changed, a fresh one is created.

What happens to the order

  • Placed, not paid yet → Pending payment, with the note SnapEX Pay: payment page opened, invoice INV-… for … USD. WooCommerce's Hold stock doesn't cancel the order while its payment page is still open.
  • Paid in full → WooCommerce's standard payment completion: the order becomes Processing (or Completed for virtual or downloadable goods), stock is reduced and the usual emails go out. The transaction ID is the SnapEX Pay invoice ID (INV-…), so you can find the payment in the cabinet.
  • Paid partly (the customer sent less and didn't top up in time) → On hold with a note on the coin, network and amount received. What you received is in your SnapEX Pay balance; check it in the cabinet and complete the order by hand if you accept it. How underpayments work: The customer sent less than the invoice.
  • Not paid in time → the note invoice INV-… expired unpaid; the order stays unpaid, and the customer can pay it again from the "Pay for order" link.
  • Paid after WooCommerce cancelled the order → On hold with the order was no longer awaiting payment — check stock and process it manually. Orders cancelled within the last 5 days are still checked, so such a payment isn't lost.
  • The order total changed after the customer opened the payment (for example, you edited the order) → On hold with the order total changed after the payment started; check and complete it by hand.
  • Extra payment after the SnapEX Pay invoice closed → with the webhook set up, a note extra payment received on invoice INV-… — check the SnapEX Pay cabinet; the money is in your SnapEX Pay balance, the order isn't touched.

The plugin doesn't send refunds: a refund in WooCommerce is only recorded on the order, no crypto goes back automatically.

If something doesn't work

  • The method doesn't show at checkout. Check that it is enabled and the API key is filled in; that test mode is off (or you're logged in as a shop manager); and, for a non-USD store, that step 5 is done.
  • "Could not start the crypto payment: …". SnapEX Pay rejected the invoice — most often a wrong or revoked API key; the reason is in the message and in WooCommerce → Status → Logs (source snapexpay).
  • "Crypto payment is not available for this currency". The order is in a currency the rate doesn't cover (the rate applies to the store's base currency only); convert other currencies in the snapexpay_wc_amount_usd filter.
  • The webhook gets 401. The webhook secret in WooCommerce doesn't match the cabinet one.
  • The webhook gets 400 "stale or missing timestamp". The server clock is off.
  • The webhook gets 503. The URL is set in the cabinet, but Webhook secret in WooCommerce is empty.
  • The webhook gets 403 or a login page. A firewall or a security plugin blocks POST requests to /wc-api/; allow the webhook address.
  • A paid order becomes Processing only after a while. No webhook: the payment was picked up by the background check. Set up step 4. WP-Cron runs only when someone visits the site; on a quiet shop, trigger wp-cron.php from the system cron every few minutes.

Everything the plugin does is in the order notes and in WooCommerce → Status → Logs (source snapexpay). To remove it, deactivate and delete the plugin on the Plugins page.

Cost

1% per payment plus a fixed network fee that depends on the coin and network; no setup fee and no monthly fee. The plugin is free.

Plugin page: WooCommerce, on WordPress.org: SnapEX Pay for WooCommerce. Overview for shops: Crypto payments for online stores. Comparing gateways: SnapEX Pay vs NOWPayments, Cryptomus and CoinGate. Sign-up: pay.snapex.pro.

More guides

Accepting USDT in WHMCS: a crypto payment gateway step by step How to add crypto payments to WHMCS 8 and 9 with the free SnapEX Pay gateway: upload the module, API key, webhook, a non-USD WHMCS, a test payment without real money, the Gateway Log. Clients pay invoices in USDT or 60+ coins, and the invoice is marked paid automatically. Accepting USDT in BILLmanager: crypto payments for hosting step by step How to connect SnapEX Pay crypto payments to BILLmanager 6: installing the module, API key, webhook, Partner ID, a test payment without real money, fees and what the client sees. Clients pay in USDT or 60+ coins, and the payment is credited automatically. Selling VPN subscriptions through a Telegram bot for USDT: setup step by step How to launch the SnapEX Pay Telegram VPN bot: plans, API key, Marzban, 3x-ui or Remnawave connection, HTTPS webhook and a test purchase without real money. The customer pays in USDT and gets the subscription link in the same chat. VPN subscription renewals paid in crypto: extend users without duplicates or lost days How the SnapEX Pay modules for Marzban, 3x-ui, Remnawave and the Telegram VPN bot handle a returning customer: which expiry the new days count from, what happens to traffic, configs and repeated webhooks. Crypto payments in Xboard and V2Board: accept USDT for VPN subscriptions step by step How to connect SnapEX Pay to an Xboard or V2Board panel: install the plugin, add the payment method, set up the webhook, convert CNY or other prices to USD and run a test order without real money. Crypto payment webhooks: verify the signature, handle retries and duplicates How SnapEX Pay webhooks are signed and delivered, how to verify them in PHP and Node.js, and how to make your handler safe against retries, duplicates and out-of-order events. The customer sent less than the invoice: how crypto underpayments work Exchanges often deduct their withdrawal fee from the amount, so a crypto invoice arrives short. What SnapEX Pay does with an underpayment, which webhooks you get and what to do with the order. How to choose a crypto payment gateway for a hosting company: 8 questions to ask A checklist for hosting and VPS providers choosing a crypto payment gateway: billing module, how paid invoices get marked paid, underpayments, fees, settlement, coins, test mode and multi-currency billing. SnapEX Pay vs NOWPayments, Cryptomus and CoinGate: fees and ready-made modules compared How SnapEX Pay compares with NOWPayments, Cryptomus and CoinGate on the published fee, monthly fees and ready-made modules for hosting billing, VPN panels and stores. Competitor data from their own websites, 11 October 2026. How to test crypto payments without real money Test invoices in SnapEX Pay go through the same statuses and send the same webhooks as live ones, but confirm by themselves and never touch your balance. Here is how to use them. Who pays the fees on a crypto invoice: you or your customer SnapEX Pay lets you choose per invoice who covers the service fee and the network allowance. What fee_on does, how it changes the amount the customer pays and the amount you receive.

Ready to accept crypto?

Create a merchant account and get an API key. 1% per payment, no monthly fee.