How do I accept USDC payments on WooCommerce?
Key takeaways
- One plugin, a handful of settings, no code. Upload the release zip, then under WooCommerce → Settings → Payments → Payzum paste an API key and webhook secret, pick production or staging, and copy the IPN URL into your Payzum dashboard.
- The webhook decides, never the browser. An order moves to Processing only on a signed HMAC-SHA-512 notification whose amount and currency match the order. Underpayments and mismatches go On hold.
- Built for current WooCommerce: the gateway registers Cart & Checkout blocks support and declares HPOS compatibility, the defaults for new stores since WooCommerce 8.3 and 8.2.
- The money never touches Payzum. Buyers pay USDC or USDT from their wallet to yours. Which coins and networks you accept is set in your Payzum dashboard.
- Know the limits: the plugin handles one-off orders. It is not offered for WooCommerce Subscriptions sign-ups, and refunds are sent from your wallet, not from the order screen.
Payzum is a non-custodial, stablecoin-first crypto payment processor: payments settle directly to wallets the merchant controls. Its WooCommerce gateway, payzum-crypto-payments, is open source under GPL-2.0 at github.com/payzum-dev/woocommerce-payzum. This guide covers version 1.5.1, released on 28 September 2026, screen by screen: what to install, what to paste where, and which WooCommerce order status you will see at each step of a USDC or USDT payment.
Why WooCommerce stores add USDC and USDT at checkout
WooCommerce is the default cart of the open web. W3Techs counts it on 8.0% of all websites and 47.7% of the e-commerce systems it can identify (30 September 2026). That reach means WooCommerce stores sell to buyers everywhere, and a growing share of those buyers already hold their dollars as stablecoins.
The usual way to take payment is a card gateway. WooCommerce's own card processor, WooPayments, lists 2.9% + $0.30 per transaction for US-issued cards, 1.5% more when the card was issued outside the US, another 1% when a currency conversion is involved, and $15 per dispute (WooPayments fee documentation, checked 30 September 2026). A converted cross-border sale pays 5.4% + $0.30 before you ship anything.
For a store selling abroad on thin margins, that is the margin. And fees are only half of it. A card payment stays reversible for months, with disputes possible around 120 days after the sale, and the money takes days to reach your bank.
Then there are the buyers who don't want a card at all: freelancers paid in stablecoins, shoppers whose card is declined abroad or whose bank blocks foreign merchants, crypto-native communities. For them, a checkout without a stablecoin option is an abandoned cart.
What a badly built crypto gateway costs a WooCommerce store
Adding a crypto option carries its own risks. Payment plugins fail in WooCommerce-specific ways, and each failure costs real money:
- Orders marked paid from the return URL. If the plugin trusts the buyer landing on your thank-you page, anyone can load that page without paying. Crypto confirmation is asynchronous, and the browser is the wrong witness.
- Paid orders lost to a closed tab. The reverse problem: the buyer pays, closes the tab before the redirect, and the order sits in Pending payment while the money sits in your wallet.
- Underpayments shipped in full. A buyer sends $180 against a $200 order, or pays an invoice raised for a different order. A plugin that only reads "status: finished" completes the order anyway.
- Double fulfilment. Payment providers retry webhooks. A handler without deduplication sends two confirmation emails and reduces stock twice.
- Paid orders cancelled after the fact. A late "expired" notice can arrive for an invoice that was paid. In WooCommerce, Cancelled is not cosmetic: it restores stock and can email the customer.
- A gateway that vanishes from checkout. Since WooCommerce 8.3 (16 November 2023), new stores use the Cart and Checkout blocks by default, and a gateway that never registered block support does not appear there. Since WooCommerce 8.2 (October 2023), new installs use High-Performance Order Storage (HPOS), and plugins that have not declared compatibility raise warnings.
- Funds parked in a balance you don't control. Custodial crypto gateways collect your sales in their wallet and pay you later, on their payout schedule, minimums and freeze policy.
Why card gateways and custodial crypto plugins fall short on WooCommerce
Card gateway plugins are mature, but the rail sets the terms. The acquirer holds the funds, decides when they settle and can pull them back through a dispute you have to fight. No WooCommerce setting changes that.
Custodial crypto plugins fix acceptance but not custody. The buyer pays the gateway's address, the gateway credits a balance, and you withdraw on its schedule. That balance is exactly what a provider can freeze, or lose if it shuts down.
The DIY route keeps custody and drops everything else. Pasting a wallet address into the checkout instructions gives you no unique amount per order, no underpayment detection, no automatic order status, stock or emails. Someone ends up matching blockchain transactions to orders by hand.
What a WooCommerce store needs is a gateway that behaves like a card plugin in the admin (a settings screen, real order statuses, logs) but settles like crypto: final, in seconds, to a wallet you control.
How Payzum's WooCommerce plugin handles USDC payments
The plugin is a standard WooCommerce payment gateway with one job: turn an order into a Payzum payment, then let a signed webhook, and nothing else, decide the outcome.
At checkout: a hosted page and the buyer's choice of coin
When the buyer picks Payzum (labelled "Crypto / Stablecoins (Payzum)" by default, and you can rename it), the plugin sends Payzum the order total, the currency, an order reference and your callback URLs. No customer personal data leaves your store. The buyer lands on a hosted checkout with a QR code and a deposit address, chooses the coin and network, and pays from any wallet. They don't need an account.
Which coins appear is set in your Payzum dashboard under Merchants → Settings → Accepted tokens, and enforced server-side. For most stores that means USDC and USDT on fast, low-fee networks: Solana confirms in about 0.4 seconds, Base and Polygon in about two. If you also accept other crypto, optional auto-convert to USDC or USDT is available on most supported networks. The trade-offs between the two stablecoins are in USDT vs USDC for payments.
After payment: the signed IPN is the only source of truth
Payzum calls your store's IPN URL server to server. Before reading a single field, the plugin verifies an HMAC-SHA-512 signature over the raw request bytes with your webhook secret, compares it in constant time, and rejects replays outside a time window. Unsigned or badly signed requests get a 401 and the order is left untouched.
Since version 1.5.0 it also checks that the amount and currency paid match the order before completing it. Anything that doesn't match goes On hold with a note for you to review. Redeliveries are deduplicated by event ID, and the paid transition runs under a per-order database lock, so two simultaneous deliveries cannot both fulfil the same order. If you want the engineering behind this pattern, read signed webhooks for crypto payments.
The HTTP client and the signature check come from the official payzum/payzum-php SDK, which ships inside the plugin's vendor/ folder, so there is no Composer step.
Where the money goes
Nowhere near Payzum. The buyer's payment goes from their wallet straight to the wallet you set in your dashboard, and the plugin code contains no wallet address at all. There is no Payzum balance to withdraw, freeze or wait for. The full model is explained in what a non-custodial crypto payment processor is.
How to accept USDC payments on WooCommerce, step by step
You need WordPress 5.6 or later, WooCommerce 5.0 or later (the plugin is tested up to WooCommerce 11.0) and PHP 8.1 or later. Most of the time goes into the staging test, which is the step worth doing properly.
- Set up your Payzum merchant account. Sign up at merchant.payzum.com, add the wallet you want to be paid into, and choose your accepted tokens: for example USDC on Base, Solana and Polygon, plus USDT. Create an API key and note your webhook (IPN) secret.
- Install the plugin from the release zip. Download
payzum-crypto-payments-1.5.1.zipfrom the repository's Releases page. In WordPress, go to Plugins → Add New → Upload Plugin, choose the file and activate it. Don't use GitHub's green "Download ZIP" button: it unpacks to awoocommerce-payzum-mainfolder, and WordPress identifies the plugin by its folder name,payzum-crypto-payments. - Configure the gateway. Open WooCommerce → Settings → Payments → Payzum, tick Enable, paste the API key and webhook secret, and set Environment to Staging for now. Staging has its own API keys; a production key won't work there.
- Connect the webhook. The settings screen shows your IPN URL,
https://your-store.com/wc-api/wc_gateway_payzum. Paste it into the webhook settings of your Payzum dashboard. The signature header is fixed, so there is nothing else to match. - Choose how the checkout looks. Render mode Redirect (the default) sends the buyer to Payzum's hosted page, Modal opens it in an overlay on your store, and Inline embeds it in the order page. For Modal and Inline, if your site sends a Content-Security-Policy header, allow
merchant.payzum.cominscript-src,frame-srcandconnect-src. - Test on staging. Turn on Debug log (entries appear under WooCommerce → Status → Logs, source
payzum). Place an order, pay it, and watch it move to Processing only when the webhook lands. Then underpay one order on purpose and confirm it goes On hold. - Go live. Switch Environment to Production, paste your production API key and secret, set the same IPN URL in your production dashboard, and place one small real order.
The settings screen at a glance
| Setting | What to enter |
|---|---|
| Enable/Disable | Tick to show Payzum as a payment method at checkout. |
| Title and Description | What buyers see. The defaults mention USDC/USDT and the hosted checkout. |
| API key | Your 64-character key from the Payzum dashboard (Merchants → API key). |
| Webhook secret | The IPN signing secret, used to verify every HMAC-SHA-512 signature. |
| Environment | Production (merchant.payzum.com) or Staging (staging.payzum.com, separate keys). |
| Currency mode | Fiat (default): prices stay in your store currency and the buyer pays the equivalent in the coin they pick. Crypto: your prices are already in a coin, set as a bare symbol plus network (for example usdc + polygon), and the buyer pays that exact amount. |
| Fiat price currency | Fiat mode only. Leave it on your store currency: the total is sent as-is, not converted. |
| Render mode | Redirect, Modal or Inline. |
| Debug log | Writes gateway events to WooCommerce → Status → Logs, source payzum. |
There is deliberately no coin picker in the plugin. Your accepted tokens live in the Payzum dashboard, so the list the buyer sees can't drift out of sync with what your account actually accepts.
Which WooCommerce order status you'll see
| What happened | WooCommerce order status |
|---|---|
| Order placed, Redirect mode | On hold, with the note "Awaiting Payzum crypto payment" |
| Order placed, Modal or Inline mode | Pending payment (WooCommerce only shows its pay page for payable orders) |
| Payment finished, amount and currency match | Processing, or Completed for virtual and downloadable orders |
| Payment finished, amount or currency don't match | On hold, "held for review, NOT completed" |
| Partially paid | On hold, awaiting the remainder |
| Invoice expired | Cancelled (WooCommerce restores the stock) |
| Payment failed | Failed |
| Any notice arriving after the order is paid | Ignored, recorded as an order note |
| Order total of zero | Completed immediately, no invoice created |
Stock is reduced as soon as the order is placed, so an item can't be sold twice while a buyer is paying. Nothing in this table is triggered by the buyer's browser: a closed tab never loses a paid order, and a thank-you page visit never marks an unpaid one.
Use cases: WooCommerce stores that take USDC and USDT
The setup is the same for every store. What changes is which part of it pays for itself.
- Digital products sold worldwide. A WordPress theme shop sells $79 licences to buyers in dozens of countries. Its orders are virtual and downloadable, so a matching USDC payment takes them straight to Completed and the download email goes out when the webhook lands. There is no dispute months later from a buyer who already has the files.
- Cross-border physical goods. A US outdoor-gear store ships to Canada, Europe and Latin America. Under WooPayments' US pricing, each of those card sales carries the extra 1.5% international fee, plus 1% when it is converted. A buyer paying USDC on Base skips both card surcharges, and the store receives dollar stablecoins in its own wallet seconds later.
- High-ticket orders. An electronics store with $2,500 average orders pays $72.80 in card processing per sale at 2.9% + $0.30, and a stolen-card order can come back weeks later as a dispute. A USDC payment is final once confirmed, and the amount check means the order only ships when the full $2,500 has arrived.
- B2B and wholesale orders. A distributor takes trade orders through WooCommerce from buyers in other countries who prefer to settle large amounts in USDT. When a buyer sends part of the total, the order goes On hold as partially paid, and it only moves on once the remainder arrives.
Payzum on WooCommerce vs a card gateway and a custodial crypto plugin
Compared on neutral criteria. Card figures are WooPayments' published US pricing, checked on 30 September 2026.
| Criterion | Card gateway (WooPayments) | Custodial crypto plugin | Payzum for WooCommerce |
|---|---|---|---|
| Where the funds settle | With the acquirer, then paid out to your bank | In the gateway's wallet, then withdrawn | In your own wallet, directly |
| Time until you hold the funds | Days | Depends on the provider's payout schedule | Seconds after on-chain confirmation (Solana ~0.4 s, Base and Polygon ~2 s) |
| Chargebacks | Yes, for months after the sale; $15 per dispute | None on-chain | None: payments are final |
| Cost per order | 2.9% + $0.30 (US cards), +1.5% international, +1% conversion | Varies by provider | Network cost in cents on Base, Polygon or Solana |
| Who can freeze the money | The acquirer | The gateway | No one at Payzum: there is no Payzum balance |
| Order marked paid by | The gateway's webhook | The gateway's webhook | A signed HMAC-SHA-512 IPN, with amount and currency checked |
| Plugin source code | Check the vendor | Varies | Public on GitHub, GPL-2.0 |
Nothing stops you from running both. Most stores keep their card gateway and add Payzum as a second payment method, so the buyer picks the rail.
Common objections, answered
"My customers don't have crypto."
Most of them don't need to. Payzum is an extra payment method next to your cards, not a replacement. The buyers who choose it are the ones who would otherwise abandon the cart or trigger your highest card surcharges.
"What about volatility?"
Keep Currency mode on Fiat and your prices stay in your store currency; the buyer pays the equivalent at checkout. If you accept only USDC and USDT, you receive dollar stablecoins. If you accept other crypto too, optional auto-convert to USDC or USDT is available on most supported networks.
"Is it safe to install a crypto plugin on my store?"
Your developer can check rather than trust. The code is public under GPL-2.0, and the webhook handler lives in includes/class-wc-gateway-payzum.php, method handle_ipn(). There is no wallet address in the code, and the only data sent out is the total, currency, order reference and callback URLs. Our guide to open-source crypto payment plugins includes a 15-minute audit checklist.
"How do refunds work if payments are final?"
The gateway does not issue refunds from the WooCommerce order screen. Record a manual refund on the order, then send the USDC back from your wallet under the refund policy you publish at checkout. You decide when money goes back; a card network doesn't decide for you.
Frequently asked questions
How do I accept USDC payments on WooCommerce?
Install Payzum's open-source WooCommerce plugin from its GitHub release zip, enable it under WooCommerce → Settings → Payments → Payzum, paste your API key and webhook secret, and copy the IPN URL shown there into your Payzum dashboard. Choose USDC and its networks as accepted tokens in the dashboard. Buyers then pay on a hosted checkout, and a signed webhook marks the order paid.
How do I accept USDT payments in my WooCommerce store?
The same way as USDC: add USDT, on the networks you want, to your accepted tokens in the Payzum dashboard. The WooCommerce plugin has no coin setting of its own, so the buyer simply sees USDT as an option on the hosted checkout. Payments settle non-custodially to your own wallet.
Does the Payzum plugin work with the WooCommerce block checkout and HPOS?
Yes. The gateway registers support for the WooCommerce Cart and Checkout blocks, the default checkout for new stores since WooCommerce 8.3, and declares compatibility with High-Performance Order Storage (HPOS), the default since 8.2. It also works with the classic shortcode checkout.
Which WooCommerce order status is set when a USDC payment arrives?
When a signed webhook reports the payment finished and the amount and currency match the order, the order moves to Processing, or Completed for virtual and downloadable orders. Partial payments and mismatches go On hold, expired invoices are Cancelled, and failed payments are marked Failed.
Is the Payzum WooCommerce plugin on WordPress.org?
Not as of 30 September 2026. The plugin is public on GitHub at payzum-dev/woocommerce-payzum under GPL-2.0. Download payzum-crypto-payments-1.5.1.zip from the Releases page and install it through Plugins → Add New → Upload Plugin.
Does it work with WooCommerce Subscriptions?
No. The gateway declares support for one-off product orders only, so WooCommerce does not offer it for subscription sign-ups rather than taking a first payment and missing every renewal. If you need recurring stablecoin billing, talk to us about Payzum's recurring subscriptions.
Book 20 minutes and we'll get USDC live on your WooCommerce store
Every WooCommerce store is set up differently: theme, block or shortcode checkout, fulfilment plugins, markets. Book 20 minutes with our team and we'll map how you'd accept USDC and USDT in your store: accepted tokens and networks, render mode, how the order statuses fit your fulfilment, and a staging order before you go live. Non-custodial, to a wallet you control. For recurring billing, see crypto subscriptions without chargebacks; for other carts, the drop-in crypto payment plugin overview.
If the calendar does not load, book directly here · [email protected]
This article is general information, not legal, tax or financial advice. The plugin is provided under the GPL-2.0 license in its repository; test it on staging before using it in production. Refund rules, accounting treatment and tax obligations for stablecoin payments vary by jurisdiction, so confirm them with your own advisers.