Accept crypto on WooCommerce, settled to your own wallet

The NoHoldPay plugin adds crypto payment methods to WooCommerce as a redirect-to-hosted-checkout gateway. A buyer picks a crypto option, your server creates the payment through the Merchant API, and the buyer pays on a hosted page with a QR code, a live countdown, and real-time status. A signed webhook then advances the WooCommerce order. Funds go to wallets you configured in your NoHoldPay account, never through the platform. Pricing is 0.5% per confirmed payment.

Requirements

  • WordPress 5.6 or newer with WooCommerce installed and active, on PHP 7.4 or newer
  • A free NoHoldPay account with at least one receiving wallet added, and an API key
  • A publicly reachable HTTPS site, so webhooks can be delivered

The plugin is on the WordPress directory as NoHoldPay - Non-custodial crypto payments. It supports both the classic shortcode checkout and the Cart and Checkout Blocks, and it is compatible with High-Performance Order Storage.

Install and connect in five steps

  1. Install the plugin from Plugins, then Add New in your WordPress admin, and activate it.
  2. Go to WooCommerce, then Settings, then Payments. Enable NoHoldPay and click Manage.
  3. Paste your API key. The prefix decides the mode: a pk_test_ key runs against testnets, a pk_live_ key against mainnet. Nothing else needs switching between the two.
  4. Copy the Webhook URL the settings screen shows you, add it as a webhook endpoint on that API key in your NoHoldPay dashboard, and paste the generated signing secret back into the plugin. This is what lets your store verify that a status update really came from NoHoldPay.
  5. Save. Optionally build coin groups on the same screen, then place a test order.

Coin groups: one gateway per customer choice

The plugin lets you group coins into named payment methods, each shown as its own option at checkout. A store might expose "Stablecoins" and "Bitcoin" as two separate options at checkout, each with its own logo and its own default coin. Each enabled group registers as its own WooCommerce gateway, so it plugs into everything WooCommerce already does per payment method, including conditional availability from other plugins.

The "Restrict to these coins" toggle controls how firm a group is. Ticked, the buyer can only pay with the coins in the group. Unticked, the group pre-selects its coins on the hosted checkout and the buyer may still switch to anything else your account accepts.

What keeps an order from being marked paid incorrectly?

Three properties, all server-side. The charged amount is derived from the order total on your server, so nothing in the browser can lower it. Status updates arrive as HMAC-signed webhooks that the plugin verifies against your signing secret. And before an order is marked paid, the plugin independently re-reads the payment from the API and re-checks the amount, the currency, and the order binding, so even a correctly signed but stale or mismatched event cannot complete the wrong order.

You stay in control of the mapping: each NoHoldPay state (awaiting payment, confirmed, underpaid, expired, cancelled, refunded) maps to a WooCommerce order status you choose, so the flow fits how your store already handles fulfilment.

Do a full dry run on a testnet first

Generate a pk_test_ key, configure the plugin with it, and place a real order against a testnet. Test mode ships with test credit, so the run costs nothing. Watch the order move from pending to processing as the webhook lands, check the mapped statuses match your fulfilment flow, then swap in the pk_live_ key. The configuration is otherwise identical, which is the point: what you rehearsed is what runs in production. The public accepted coins directory lists every route, and which of them your key accepts is set in your account dashboard.

Common questions

Does the WooCommerce plugin handle card payments too?
No. It adds crypto payment methods alongside whatever card or wallet gateways you already run, and it never touches their flow. Buyers who choose a crypto option are redirected to the hosted checkout, pay there, and return to your order-received page. Everyone else checks out exactly as before.
What happens if a buyer underpays or lets the invoice expire?
The payment moves to underpaid or expired, the signed webhook reports it, and the order takes whatever status you mapped for that state. You can accept an underpayment from the NoHoldPay dashboard, and a late transaction within the grace window revives an expired payment automatically.
Why does the plugin need my buyer's email and IP address?
The order total, currency, order id, buyer email when present, and the buyer's IP that WooCommerce already records are sent when creating the payment. The IP is what attributes the payment to its payer. No card or bank data is involved anywhere in the flow.
Does it work with checkout blocks and HPOS?
Yes. The plugin supports the classic shortcode checkout and the Cart and Checkout Blocks, and it is compatible with High-Performance Order Storage. Coin-group gateways register as ordinary WooCommerce payment methods, so they appear in both checkout flavors and inherit per-method availability rules from other plugins.