OpenReceive guides
OpenReceive adds Bitcoin Lightning checkout to your application. Payments go straight to your wallet, and payment attempts are stored in your existing database. Pick a framework quickstart below. Then add the checkout UI and connect your authorization, pricing, and fulfillment hooks.
OpenReceive can also accept USDT, USDC, SOL, and ETH through a swap provider you configure. The provider converts the payment to BTC over Lightning, and it settles into the merchant’s connected wallet. Swaps are optional. The provider decides which assets and networks are available.
- Express quickstart (Node)
- Fastify quickstart
- Next.js quickstart
- Bitcoin checkout on Vercel and v0: the same Next.js setup, hosted on Vercel or built by v0
- Node ORM recipes
- Rails quickstart
- FastAPI quickstart
- Django quickstart
- PHP quickstart (plain PHP)
- Laravel quickstart
- BTCPay Server quickstart, plus its reference
- Authorization and the host
- Rate limiting
- Frontend checkout
- Checkout UX
- Headless checkout
- Writing your own checkout route
- Automated swaps
- Swap refunds, and the way back to them
- Lightning Swap Connect (LSC) URI
- Environment variables
- Payment storage
- Payment safety upgrade and repair: how to roll out the upgrade and how to review and recover existing attempts.
- Deploying OpenReceive
- Testing your OpenReceive integration
- API reference
- Security
- Price feeds
- Provider registry
- WordPress + WooCommerce quickstart
- WordPress hosting requirements: which hosts can run the WooCommerce plugin
- How we test platforms: what a Tested badge on openreceive.org means
Recipes: React + Material UI, Flask (the Python engine as a Blueprint)
Building this with a coding agent? Give it one of the agent-directions
payloads instead of a reading list:
Node (Express),
Fastify,
Next.js,
FastAPI,
Django,
Rails,
PHP,
Laravel,
WooCommerce or
BTCPay Server.
These are the exact files the site’s copy button copies. In this repo they live
in docs/agents/. Each payload contains Step 0 (the rules that no API call can
state for itself) and the full matching quickstart. It works pasted into an
editor with no network access. All payloads are generated. To change one, edit
docs/agents/src/<stack>.md and run npm run build:docs. To hand an
agent a link instead, drop /full from the URL: that short page tells it to
download the full file with its shell.