How to Accept Crypto Payments on Your Website
There are three real ways to accept crypto on a website: a payment company, a payment server you run yourself, or software that runs inside the site you already have. They suit different stores, so here's what each one costs, followed by the third set up on a real store and paid for real.
| Way | Examples | What it costs | Best if |
|---|---|---|---|
| A payment company | BitPay, NOWPayments, CoinGate, Stripe, PayPal | 1% to 2% a sale | You want dollars in your bank |
| Your own payment server | BTCPay Server | No fees, but a server: $10-70 a month | You're happy to run a server |
| Software inside your site | OpenReceive | Free, MIT licensed | You want Bitcoin in your own wallet, on the site you already have |
Way 1: a payment company
A payment company takes the payment for you, then pays you out. You open an account and they review your business. In return, the good ones can turn crypto into dollars in your bank, which neither of the other two ways does.
Their published prices, checked in November 2026:
- BitPay: 2% + 25¢ on your first $500,000 a month, falling to 1% + 25¢.
- NOWPayments: 1% without conversion, 1.5% with, plus the network fee.
- CoinGate: 1% a transaction on its Standard plan.
- Stripe: 1.5% on stablecoin payments.
- PayPal: 1.5% on Pay with Crypto.
Way 2: your own payment server
BTCPay Server is free, open source and takes no fee of its own. It's also a whole stack: the server, a Bitcoin node, a blockchain indexer and a database. On our own install, the pruned Bitcoin node alone takes 67 GB. BTCPay's deployment page puts a server at $10-70 a month, and keeping it running and updated is your job, unless you use a third-party host. If that suits you, it's excellent. See also our BTCPay Server alternatives.
Way 3: software inside your own site
OpenReceive is free, open-source (MIT) software that runs inside the site you already have, with no approval necessary. Each payment lands in your own wallet in seconds, over Lightning. It connects to that wallet with a receive-only code that can create invoices and read incoming payments, and can never spend, so even a compromised server can't spend your funds.
Customers can pay in Bitcoin, or in USDT, USDC, ETH or SOL if you add a swap provider. Whatever they pay with, you receive Bitcoin, so if you want to hold stablecoins or receive dollars, this isn't the one for you.
Set it up on WordPress and WooCommerce
This is a real run on a demo WooCommerce store with OpenReceive 0.4.31, on November 6, 2026. Every step in detail, with a video, is in How to Accept Crypto Payments in WooCommerce.
Check your host first. The plugin needs 64-bit PHP 8.2 or newer with the GMP and sodium extensions. Many hosts leave GMP off, and if it's missing, the Plugins screen says so. OpenReceive's hosting guide shows how to check, host by host.
- In WordPress, go to Plugins → Add Plugin, search for OpenReceive, click Install Now, then Activate.

- Get a receive-only code from your wallet. Rizful is free and quick to set up: Menu → NWC Codes → Copy receive-only code (the full steps). Alby Hub, your own Lightning node, gives you one as well, and it's a great choice for merchants.
- In WordPress, open Payments, then Manage next to OpenReceive, and paste the code into NWC code.
- For stablecoins, paste a Lightning Swap Connect code from a provider such as lightning-swap.com into Lightning Swap Connect code. Skip this for Bitcoin only.
- Tick Enable OpenReceive and click Save changes. It checks your wallet as it saves.

A real payment
We bought a $5 Plinth. At checkout, the customer picks Bitcoin & stablecoins (OpenReceive) and places the order, then chooses how to pay.

Bitcoin makes a Lightning invoice in the store owner's own wallet: 6,584 sats for $5.00 that day.

Paying from Phoenix cost the customer a 30-sat fee, and our Rizful balance went from 50,217 to 56,801 sats: exactly 6,584 more, the full $5.00. Moments later the store's page said payment received and moved on by itself, and WooCommerce marked the order as processing.

What stablecoins cost
We took the USDT option up to its real quote and didn't send it. The customer gets an address and an exact amount, the swap provider takes that and pays your Lightning invoice, and you still receive Bitcoin.
The customer pays the extra, which goes to the swap provider and the network, and it weighs more on small orders. Lightning Swap's pricing page says 1.1% to 5%, plus routing fees.
| Order | USDT on Solana | Swap + network fees |
|---|---|---|
| $7.00 | 7.56 USDT | 0.56 USDT (8.0%) |
| $49.00 | 50.57 USDT | 1.57 USDT (3.2%) |

Each network also has its own minimum, which moves with fees: that day Tron needed about $9 and Ethereum about $19, while Solana took a $5 order. On small orders, Bitcoin over Lightning is the better deal.
For USDT on its own, with real quotes on Tron, Solana and Ethereum and what happens to a deposit that arrives short or late, see How to Accept USDT Payments on Your Website.
Good to know
- Refunds are by hand. A receive-only code can't send money, so you refund from your wallet.
- You're holding Bitcoin. Its price moves. If you'd rather have dollars, a payment company is the better fit.
- Keep the code secret anyway. A receive-only code can't spend, but it can read your incoming payments. If it leaks, revoke it in your wallet and make a new one.
Supported platforms
| Platform | What you install | Requirements |
|---|---|---|
| WordPress + WooCommerce | One plugin. WooCommerce stays in charge. | WordPress ≥ 6.6, WooCommerce ≥ 9, 64-bit PHP ≥ 8.2 with GMP and sodium |
| Express | One factory, mounted like any router. | Node ≥ 22 |
| Fastify | A plugin, a prefix, three hooks. | Node ≥ 22 |
| Next.js | One route handler, one client component. | Node ≥ 22, Next.js ≥ 15 (App Router) |
| Rails | One gem, one generator, three hooks. | Ruby ≥ 3.2, Rails ≥ 8.0 |
| BTCPay Server | A plugin for your store. No code. | BTCPay Server ≥ 2.4.4 |
| Django | One Django app, one host class, three hooks. | Python ≥ 3.10, Django ≥ 5.2 |
| FastAPI | One router, one lifespan, three hooks. | Python ≥ 3.10, FastAPI ≥ 0.115 |
| Laravel | One package, one generator, three hooks. | 64-bit PHP ≥ 8.2, Laravel 11 or 12, ext-gmp |
| PHP | One PSR-15 handler, one PDO connection. | 64-bit PHP ≥ 8.2, ext-gmp |
On the Node adapters, the checkout UI can be React, Vue, Svelte, Angular, or plain HTML. Those are checkout components, not separate server platforms.
The BTCPay plugin is not the library. BTCPay keeps its own invoices, checkout, webhooks, and Greenfield API. The plugin makes a receive-only NWC wallet the store's Lightning node.
Swap if you want
Lightning is the default. To accept other assets, configure any swap provider that implements the FixedFloat / Lightning-Swap API, or build your own. Lightning Swap is one. The provider converts the deposit to Bitcoin over Lightning. You never hold the altcoin.
| Asset | Networks |
|---|---|
| USDT | Tron, Solana, Ethereum |
| USDC | Solana, Ethereum |
| SOL | Solana |
| ETH | Ethereum |
Not on WordPress? Use the agent directions
OpenReceive works with Laravel, Next.js and more than twenty others. The quickest way in is to let your coding agent do the integration.
Step 1: Copy the agent directions
Open openreceive.org and click the green Copy agent directions button.

A dialog opens. Under Start here ("Any project, or none yet"), click Copy text. These directions work out your stack by themselves, so they suit any project, even one you haven't started yet. Copy link copies a link to the same directions instead, for an agent that can fetch a URL.

Or, if you know your stack, pick it from the list under Or pick your stack: there are directions for 27 stacks, from WordPress + WooCommerce and BTCPay Server to Express, Django and Laravel, each with its own Copy text button.

What you get is a single prompt: what OpenReceive is, how to check your environment, and the full quickstart. Your agent doesn't have to search the web or guess at anything.
Prefer an installable skill instead? OpenReceive has one of those too:
- Claude Code:
/plugin marketplace add OpenReceive/openreceive, then/plugin install openreceive@openreceive - Cursor, Codex, and other skill-compatible tools:
npx skills add OpenReceive/openreceive
Step 2: Paste it into your coding agent
Open your project in your AI coding agent and paste the directions. The agent will look at your app, find your order and product models, install the right packages, and add the checkout.
It will stop and ask you for one thing: a receive-only NWC code for the wallet that should receive the money. That brings us to the next step.
Step 3: Connect your Rizful wallet
The only credential OpenReceive needs is a receive-only Nostr Wallet Connect (NWC) code from any NWC provider, or from a wallet you run yourself. Rizful makes one in a few clicks:
👉 Get A Receive-Only NWC Code from Rizful
Put that code in your server environment as NWC_URI and tell your agent it's set. From then on, every payment your site receives shows up in your Rizful vault, with a permanent Lightning Address and all the other things Rizful does for you.
If you'd rather experiment before pointing OpenReceive at your main vault, create a separate one with a small balance: Safely Set Up Test Rizful Vaults with NWC.
Step 4: Try a checkout
Once your agent finishes, run your app, add something to the cart, and pay the invoice from any Lightning wallet. Your customer sees a clean checkout with a QR code and a copy button. You see the payment land in Rizful and your app marks the order paid.
That's a complete Bitcoin checkout, on your own server.
Learn more
- 🌐 openreceive.org — the home page, guides, and the Copy agent directions button
- 🐙 OpenReceive on GitHub — source code, agent skills, and issues
- 📖 Guides — quickstarts for every platform above, checkout UX, deployment, security, and the API reference
- 🤖 Agent directions — one self-contained file per platform (
node,fastify,next,fastapi,django,rails,php,laravel,woocommerce,btcpay)