Self-hosting BTCPay for every Arnhem Labs product
pay.arnhemlabs.com is a BTCPay Server instance on a small Linux VPS. It generates invoices, watches the chain and Lightning for incoming payments, and notifies the merchant application when a payment settles. The satoshis land in our wallet at the moment of settlement. No third party sits between the customer and the funds.
That’s the whole product.
What BTCPay is
BTCPay Server is an open-source Bitcoin payment processor — the self-hosted counterpart to BitPay or Coinbase Commerce. Same surface area to the merchant code: create an invoice, get a payment URI back, listen for a webhook when it settles. Different posture underneath: the merchant runs the box, holds the keys, and watches the chain themselves.
One Docker compose stack — Bitcoin Core, NBXplorer, the BTCPay app, optionally an LND Lightning node — behind a reverse proxy with automatic TLS. A few hours to install. A day or two to sync the chain before the first invoice. Low double-digit dollars a month to operate.
Why self-host
Non-custodial by construction. A hosted processor takes payment into their wallet, then pays you out on their schedule, minus fees, minus the risk that they freeze the account first. BTCPay never touches the funds. The customer pays directly to an address derived from a seed the merchant controls. Settlement and custody are the same event.
No processor fees. BitPay charges 1% per invoice. Hosted processors take their cut one way or another — settlement spread, conversion fee, withdrawal. At meaningful volume the VPS pays for itself in the first invoice of the month. Every basis point of margin beyond that is the merchant’s.
No account to freeze. A hosted processor is a single counterparty who can offboard you, hold funds during a “review,” or close the account because a compliance team didn’t like your industry. Accepting BTC is partly an opt-out from that surface. Self-hosting completes the opt-out.
Lightning, on your terms. The same instance speaks Lightning. Sub-second settlement, fees measured in satoshis, no chain congestion. The node is yours — your channels, your liquidity, your routing decisions. No “Lightning-as-a-service” middleman taking a cut of every routed payment.
Privacy. Payment metadata — amount, time, originating wallet — stays between merchant, customer, and the chain. There’s no processor building a cross-merchant profile of either side.
Webhook-driven integration. BTCPay POSTs to a URL you configure when an invoice transitions states (InvoiceCreated, InvoicePaymentSettled, etc.). The merchant code is the same shape it would be for any payment processor. The integration surface is small.
How it’s built
One VPS. A small Linux box at any reputable provider. CPU and RAM requirements are modest; the disk needs to hold the Bitcoin chain (roughly 600 GB on mainnet today) plus headroom, on SSD.
Docker compose. The official btcpayserver-docker repo bundles every component. One environment file, one docker compose up -d, and the stack is live. Upgrades are a git pull and a restart.
TLS and DNS. Point a subdomain at the VPS, let the bundled reverse proxy issue a Let’s Encrypt cert on first boot. That’s the full networking story.
Backups. Two things matter: the BTCPay app database (Postgres, a few MB at our volume) and the Bitcoin wallet seed. The chain itself is replicated globally — if the disk dies, you re-sync, you don’t lose state.
Honest framing
Self-hosting is not free. Someone has to run the box, watch the disk, apply security updates, and rotate Lightning channels. For a merchant doing $50 a month in BTC, the operational overhead isn’t worth a hosted processor’s 1%. The financial break-even is somewhere in the low four figures of monthly volume — but the non-financial benefits (custody, censorship resistance, privacy) accrue from invoice one.
What’s next
pay.arnhemlabs.com keeps running. Every Arnhem Labs product that needs a BTC rail points at it. One stack, every property.
One VPS. One wallet. Own the rail.