Open-source Bitcoin payments

Small daemon. Serious checkout.

qpayd creates Bitcoin and Lightning invoices, locks fiat prices through configured pricing sources, watches payments, and sends signed webhooks without making you run a heavy commerce stack.

qpayd serve
$ qpayd serve --config qpayd.toml
ok migrated sqlite:///data/qpayd.db
ok loaded stores: main, docs, side-projects
ok pricing source: kraken BTC/USD
http listening on 0.0.0.0:8080

invoice.created store=docs currency=USD amount=10.00
invoice.addressed method=bitcoin index=184
invoice.settled method=lightning confirmations=0
webhook.delivered status=200 attempt=1
FastBuilt for quick warm starts and quiet idle deployments.
SmallLow memory Rust service with no app code on the payment box.
FlexibleSQLite for simple installs, Postgres when you outgrow a single node.
Multi-storeOne daemon can serve separate projects with separate tokens and webhooks.

Clean payment glue.

qpayd keeps the payment boundary boring: durable invoices, idempotent state changes, signed webhooks, fiat pricing, and wallet watching through public or private infrastructure.

Bitcoin + Lightning

Use descriptor-based on-chain receive addresses, Phoenixd-backed Lightning, or both for each configured store.

Fiat amounts

Quote in USD or another configured currency while qpayd locks the BTC amount from third-party pricing sources.

Signed webhooks

Your app receives payment events with HMAC signatures, retry handling, and durable delivery tracking.

No browser secrets

Static sites can create configured payment-link invoices from JSON, while private API tokens stay on servers where they belong.

Migrate on boot

Sequential migrations make fresh deploys and long-lived installs predictable across SQLite and Postgres.

Open source

MIT licensed Rust glueware that can run anywhere a small daemon and a database can run.

One daemon, many stores.

Each store owns its API token, wallet descriptor, webhook target, and configured payment links.

Configure stores in TOML

Start with one personal project. Add more stores when you need separate wallets, webhooks, or payment links.

[[stores]]
id = "docs"
name = "Docs Donations"
api_token_env = "QPAYD_DOCS_API_TOKEN"
webhook_url = "https://example.com/qpayd"
webhook_secret_env = "QPAYD_DOCS_WEBHOOK_SECRET"

[[stores.payment_links]]
id = "donate-10"
amount = "10.00"
currency = "USD"