Integrating Crypto Payments Into WooCommerce and Shopify
If you already run a store on WooCommerce or Shopify, adding crypto is not a rebuild. It is a new payment method sitting alongside the ones you have, and there are only two ways to wire it in: install a plugin and paste an API key, or call the gateway's REST API from your own code. The right choice depends less on your technical ability than on how much of the checkout you want to own.
First, decide why you are doing it
Crypto is rarely a replacement for cards. It is worth adding when one of these is true, and it is worth skipping when none of them are:
- You sell to customers in places where card acceptance is unreliable or expensive.
- You sell digital goods where chargeback fraud is a real cost — on-chain payments cannot be reversed.
- Your customers already hold stablecoins and ask to pay with them.
- You want a payment method that does not depend on a single acquiring relationship.
Being clear about the reason also tells you how much effort the integration deserves. "A handful of customers ask" points at the plugin route. "This is how a third of our market pays" justifies building it properly.
Route 1 — The plugin route
On a ready-made platform, the fastest path is the VisualPay plugin for it. You install it, paste in your merchant API key, choose which coins and networks to accept, and crypto shows up as an option at checkout. No coding.
This is the right choice when you run a standard storefront, your theme's checkout is close to stock, and you want crypto live this week rather than this quarter.
Setup, in order:
- Create a VisualPay account and enable two-factor authentication — it is required before you can create a merchant.
- Create a merchant, and declare your own wallet address for each coin and network you intend to accept. This is where settlements will go.
- Copy the merchant API key from the merchant's detail page in the panel.
- Install the plugin on your store and paste the key in.
- Choose your coins and networks, and set who absorbs the payment fee.
- Place a small real order end to end before you announce it.
Route 2 — The direct API route
If you have a headless storefront, a heavily customised checkout, or a store that is only partly on the platform, calling the API directly gives you full control. It is one POST to create a transaction and one webhook to learn it was paid.
POST https://visualpay.net/api/v1/merchant/transaction/create
x-api-key: YOUR_MERCHANT_API_KEY
Content-Type: application/json
{
"currency_symbol": "USDT",
"network_code": "trc20",
"amount_usd": 149.00,
"ttl": 30,
"order_id": 10432,
"email": "[email protected]",
"callback_url": "https://yourstore.com/checkout/crypto/return"
}
The response gives you the payment address, the exact crypto amount and a tracking code. Because nothing forces a redirect, you can render that inside your own checkout step — same theme, same domain, same language. Store the tracking code against the order; it is your handle on the payment from then on.
This is the right choice when you want the crypto step to look like the rest of your checkout, when your order flow does not map cleanly onto the platform's payment gateway abstraction, or when you are already comfortable maintaining a webhook endpoint.
Mapping payment states onto order states
This is where integrations most often go wrong, and it is worth being explicit. A crypto transaction has states your store does not natively understand, so decide the mapping before you write anything:
- Pending — the invoice is open and unpaid. Keep the order on hold. Do not reserve scarce stock indefinitely; the time-to-live window tells you when to release it.
- Confirmed — paid and settled on-chain. Move the order to processing or complete and fulfil it. This is the only state that should trigger fulfilment.
- Overpaid — accepted, with more received than required. Treat it as paid and apply your policy on the surplus: store credit or a manual refund.
- Expired — the window closed unpaid. Cancel the order and release stock. Nothing was charged.
- Cancelled — the buyer abandoned it deliberately. Same handling as expired.
Whichever route you take, the rule from the API guide still applies: the callback redirect that brings a buyer back to your success page is user experience, not proof of payment. Fulfil on the webhook, or on a server-side status check. Never on the fact that a browser loaded a URL.
Choosing coins and networks
More options is not better. A checkout with fourteen dropdown entries converts worse than one with three, and every extra network is another wallet address you have to get right.
For most stores, start with USDT on TRC20 (low fees, very widely held), USDT on BEP20 (also cheap, common among exchange users) and USDC on ERC20 if you sell to buyers who prefer it. Add more only when customers actually ask. VisualPay lets you enable coins and networks per merchant, so this list is a setting rather than a rebuild — and if you run several storefronts, each can have its own.
Pricing and the fee
VisualPay charges one flat percentage per successful transaction, with no monthly cost and no payout commission. You choose which side of the checkout absorbs it. Passing the fee to the buyer grosses up the invoice so your order is credited in full, which keeps your bookkeeping clean. Keeping it on your merchant means the buyer sees the round number they expected, which usually converts better on consumer stores.
Because settlement is non-custodial, confirmed payments go straight to the wallet addresses you declared once each network's threshold is reached — typically inside a minute, with only the chain's own network fee deducted. There is no payout schedule and no withdrawal request in between.
Test before you announce
Do not skip this, and do not test only the happy path:
- Place a small real order and pay it. Confirm the order moves to paid automatically, without anyone touching the admin.
- Create an order and let it expire unpaid. Confirm the order cancels and stock is released.
- Deliberately underpay by a small amount. Confirm the behaviour matches the shortfall tolerance you set.
- Check that the confirmation email and the customer-facing order page both make sense for a crypto order.
- Confirm the settlement landed in your own wallet, not just that the order says paid.
Which route to pick
Take the plugin route if your store is close to stock and you want crypto live quickly with minimal maintenance. Take the API route if your checkout is custom, if you are headless, or if keeping the buyer on your own domain through the payment step matters to you.
Both hit the same gateway and settle to the same wallets. The plugin trades a little control for a lot of speed; the API trades a day of work for complete control of the experience. Neither locks you out of the other later.
Start accepting USDT and USDC today
No KYC, no redirect checkout and settlement straight to your own wallet. Registration and your first merchant are free.