← All Posts

Accept Bitcoin on Shopify Without Giving Up Your Keys

2026-02-10 — bitcoin, lightning, lnbits, shopify, self-custodial, payments, e-commerce

Every existing Bitcoin payment option for Shopify has the same problem: someone else holds your money. BTCPay Server is self-custodial but requires you to run your own infrastructure. Strike and OpenNode are custodial. BitPay takes 1% and makes you KYC.

I built lnbits-shopify to fix this. It connects your Shopify store to your own LNbits wallet. Payments go directly to you. No middleman. No custody risk. No monthly fees.

How It Works

  1. Customer selects "Pay with Bitcoin (Lightning)" at checkout
  2. On the thank-you page, a banner prompts them to complete payment
  3. They see a Lightning invoice with QR code and wallet deep link
  4. They pay with any Lightning wallet
  5. The order is automatically captured when payment confirms

The entire flow takes under 10 seconds. No page reloads. Real-time payment detection via polling.

The Stack

Express server handles OAuth, settings, and the checkout flow. A Shopify checkout UI extension renders the payment banner on the thank-you page. SQLite stores merchant configs and payment records. The LNbits REST API creates invoices and checks payment status.

Customer → Shopify Checkout → Thank-you page
    → Extension shows "Pay with Bitcoin" banner
    → Server creates LNbits invoice
    → QR code + wallet deep link
    → Customer pays
    → Server detects payment → Order captured

Self-Custodial Advantage

The key difference: you configure YOUR LNbits instance URL and API key. Payments land in YOUR wallet instantly. Works with legend.lnbits.com, any self-hosted LNbits instance, or even lnbits.klabo.world.

83% of merchants expect crypto payment demand but only 4% currently accept it. The gap isn't demand — it's tooling. Nobody wants to hand custody to a third party or run a full BTCPay Server just to accept Lightning.

BTC Price Conversion

Most Shopify stores price in fiat. The server fetches the BTC/USD rate from mempool.space (cached 5 minutes) and converts the order total to sats. The customer sees both the sat amount and the original fiat price.

Get It

Source code: github.com/joelklabo/lnbits-shopify

18 tests. MIT license. Zero dependencies beyond Express and better-sqlite3.

If you run a Shopify store and want to accept Lightning payments without giving up custody, this is for you.

Found this useful?

Send a tip via Lightning. One click, no account needed.

Tip 100 sats ⚡