Online stores
Add crypto checkout without replacing your existing payments
Your card checkout keeps working exactly as it does today. This adds one more way to pay, for the customers who want it — a single link in your page that sends them to a hosted checkout and pays you directly, with nothing running in your storefront.
What you actually paste
A checkout button is configured once in the dashboard — amount, asset, chains, and where to send the customer afterwards. What you paste into your page is this:
<a href="https://pay.unheld.io/pay/btn_8f2c41"
style="display:inline-block;padding:12px 20px;border-radius:8px;background:#3B37F0;color:#fff;font-weight:600;text-decoration:none;font-family:system-ui,sans-serif">
Pay with crypto
</a>That is the whole integration. It is an anchor tag.
Why a link and not a script
A snippet on a public page cannot hold a secret key — anyone can read it. So the button carries only an unguessable public id, and the invoice is created server-side when it is clicked. Nothing about your account is exposed in your storefront, there is no script to slow your page down or break it, and no library to keep updated.
What happens when a customer clicks it
Four steps, none of which run on your server.
- 01
They land on a hosted checkout
The link creates the invoice from your saved configuration and sends the customer to a payment page we host. You are not rendering a payment form, storing an amount in a hidden field, or trusting anything the browser sends back.
- 02
They pay from any wallet
The money goes to an address derived from your own wallet. It does not pass through us, so there is no balance to withdraw and no payout to wait for.
- 03
Your reference comes back with it
You can attach your own fields to a button — an order number, a cart id, whatever your shop uses. It is carried through the payment and returned in the webhook, so you know which order was paid without matching amounts.
- 04
The customer is sent back to you
Each button has its own success and cancel URLs, so the customer returns to your order confirmation page rather than being stranded on ours.
Knowing an order is paid
The events are the ordinary invoice events — a checkout-button payment is a normal invoice, not a separate species with its own half-supported pipeline.
- invoice.created
- invoice.receiving
- invoice.confirming
- invoice.paid
- invoice.underpaid
- invoice.overpaid
- invoice.expired
Every webhook is signed and retried, and carries the reference fields you attached to the button. Wait for the confirmed event before shipping, not the first sighting of the payment — the difference between them is the whole point of confirmations.
How the integration works
Integration is one link. Here is exactly what that covers, so you can size the work before you start.
- There is no native Shopify app or WooCommerce plugin yet. Integration is the link above, pasted wherever your platform lets you put HTML — which all of them do. Native plugins are on the roadmap.
- There is no cart integration. The button carries the amount you configured, so a variable basket total needs the API rather than a saved button.
- Nothing is marked as fulfilled for you. The webhook tells your system a specific order was paid; acting on that is your shop’s job.
- There are no refunds through us, because we never held the money. Sending it back is a payment you make from your own wallet, on your own terms.
- Your customer needs a crypto wallet and the funds in it. This reaches the buyers who already have one; it does not convert the ones who do not.
Questions
Do I have to move off my current payment provider?
No, and you should not. This adds a payment option next to the ones you already offer — your card checkout is untouched and keeps handling the customers who use it. Crypto is a small share of most stores’ orders; treating it as an addition rather than a migration is both the honest framing and the one that does not put your revenue at risk.
Does it work with Shopify, WooCommerce or my platform?
It works anywhere you can paste HTML, which is most platforms — a product page, a landing page, an email footer. What does not exist is a native app or plugin for any of them, so there is no automatic cart total, no order status written back into your admin, and no one-click install. If you need those, this is not ready for you yet.
What about orders with a different total every time?
A saved button carries a fixed amount, so a variable basket needs an invoice created through the API at checkout time — one request, and you get back the payment URL to send the customer to. The button is for fixed-price items; the API is for everything else.
When is it safe to ship the order?
When the confirmed event arrives, not when the payment is first detected. Detection means a transaction appeared; confirmation means it is deep enough in the chain to be final. Both reach you as separate webhooks precisely so you can show the customer a fast “payment received” and still hold physical fulfilment until it is settled.
Run a test order on testnet
Make a button, paste it on a page, and pay it with testnet coins. You will see the invoice, the redirect and the webhook exactly as they will behave with real money.
Start freePayment links · Developers · Pricing · Non-custodial · Answered plainly.