A Monero payment gateway turns "pay with XMR" into something your shop can run on its own: an invoice per order, a checkout page for the customer, and a message to your shop when the money arrives. MonkStash Pay is a free gateway you host yourself. It holds no money and has no spend key, so the only person who can move your funds is you.
- Every order gets its own subaddress, so payments are matched by address, never by amount.
- It runs on your server with a view-only wallet: it can see payments, never spend them.
- Prices in euros or dollars are converted at a live rate and held for 30 minutes.
- Your shop gets signed webhooks, and a WooCommerce plugin connects stores in three settings.
What a Monero payment gateway does
Whatever gateway you use, it has four jobs:
- Make an invoice with a fresh address and an exact amount.
- Show the customer how to pay: a QR code, the amount, a countdown.
- Watch the blockchain for a payment to that address, which takes a view key.
- Tell your shop when the order is paid, so it can ship.
The big question is where the view key lives. Hosted processors keep it (or your money) on their servers. MonkStash Pay keeps it on yours.
How MonkStash Pay works
- Your shop asks for an invoiceOne API call: "€19.99, Order 1001".
- MonkStash Pay creates itA fresh subaddress from your view-only wallet, the price converted to XMR and held for 30 minutes, and a checkout link.
- The customer paysOn the checkout page: QR code, exact amount, copy buttons and a status that updates by itself.
- Your shop gets toldA signed webhook for each change: confirming, paid, partly paid, late or expired.
Why it cannot lose your money
- View-only wallet. It is set up with your address and private view key only. Without the spend key, nothing on the server can send your XMR anywhere.
- No middleman. The customer pays your wallet directly. There is no balance on our side, because there is no our side.
- Locked-down checkout. Checkout pages use long random links, strict security headers and no third-party scripts, fonts or trackers.
- Careful defaults. The API needs a long secret key, requests are size- and rate-limited, and no customer data is written to logs.
With your server, an attacker could see your incoming payments (what the view key shows). They could not spend them. Protect the server anyway, and keep backups of its data folder.
The API in one minute
Create an invoice with one request. Keep the API key on your shop's server, never in a web page.
POST /api/invoices
Authorization: Bearer <your API key>
Content-Type: application/json
{ "amount": "19.99", "currency": "EUR", "reference": "Order 1001",
"returnUrl": "https://yourshop.com/orders/1001" }The reply includes the invoice id, the exact XMR amount, the held rate, the expiry time and a checkoutUrl to send your customer to. GET /api/invoices/:id returns the current status at any time:
| Status | Meaning |
|---|---|
waiting | Nothing received yet |
confirming | Enough received, waiting for confirmations |
paid | Paid and confirmed; ship it |
partial | Less than the amount arrived; the checkout asks for the rest |
expired | Nothing arrived before the price hold ended |
late | Money arrived after the hold; review it |
Webhooks your shop can trust
Each status change is sent to your shop as a webhook, signed with HMAC-SHA256 and a timestamp. Your shop checks the signature before believing it, and rejects anything older than five minutes. If your shop does not answer, MonkStash Pay tries again after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours: six attempts in all, with the last one about eight and a half hours after the first.
For extra safety, our WooCommerce plugin goes one step further: after a valid webhook itasks the gateway for the real status before changing the order, so even a replayed or forged message cannot mark an order paid.
Monero payment gateways compared
| Option | View key held by | Address per order | You run |
|---|---|---|---|
| MonkStash Pay | Your server | Yes | One small program (Docker or Node) |
| BTCPay Server, Monero plugin | Your server | Yes | BTCPay plus a Monero node |
| Older WooCommerce gateway (monerowp) | Can be a third-party explorer, depending on mode | Depends on mode | A WordPress plugin |
| Hosted processors | The processor | Usually | Nothing; you trust them |
BTCPay is a strong choice if you already run it. MonkStash Pay is for shops that want the same self-hosted privacy with less to install. Check each project's current documentation; these tools change.
What you need to run it
- A small server or VPS with Docker or Node.js 22 or newer, and HTTPS in front of it.
- A wallet for your shop, and its primary address, private view key and creation height. Never the seed or spend key.
- A Monero node you trust (your own is best).
- About 20 minutes, most of it waiting for the first sync.
Setup has three parts: fill in a settings file, build and run the server (with Docker or Node.js), and put it behind an HTTPS proxy such as Caddy or nginx. Test on stagenet, the free test network, before you take real money. The full guide, every setting and copy-paste webhook code for Node.js and PHP are in the project's README.
Status and limits
- One wallet and one shop per server.
- Invoices are kept in a single file: fine for thousands of orders, not millions.
- No admin screen yet; use the API or your shop's order list.
Selling in person instead? Use cashier mode. Invoicing a client? A payment link is all you need.
Frequently asked questions
What is a Monero payment gateway?
Software that creates an invoice for each order, shows the customer how to pay in XMR, watches the blockchain for the payment, and tells your shop when the order is paid.
Is MonkStash Pay custodial?
No. It runs on your own server with a view-only wallet. It can see incoming payments but has no spend key, so it cannot move your money. Payments go straight from the customer to your wallet.
Do I need to run a Monero node?
No. MonkStash Pay can use any node you trust. Running your own node is the most private option, because a remote node sees your server's IP address and its sync requests (never your keys).
Can I download MonkStash Pay now?
Yes, as source code. MonkStash Pay is open source (BSD-3-Clause), so you can read the code and run it on your own server today. Version 0.1 is built and tested on stagenet, Monero's test network, and has not had an independent security review yet, so test it on stagenet first and start with small amounts.
Does MonkStash Pay charge a fee?
No. It is free, open-source software you run yourself. The only cost on a payment is the small Monero network fee, which the customer pays.
How does my shop know an order is paid?
MonkStash Pay sends a webhook signed with HMAC-SHA256. Your shop checks the signature, and can also ask the API for the invoice status at any time.
Can I price products in euros or dollars?
Yes. Send the price in your currency; MonkStash Pay converts it at a live rate (the middle of several exchanges) and holds that rate for 30 minutes by default.