₿ Satoshi Shelf
Pay with Bitcoin · instant delivery

Sell digital products
for Bitcoin.

Card processors take a cut, decide who's allowed to sell, and can freeze you without warning. Accepting Bitcoin sidesteps all three — but the delivery side has traps worth avoiding.

₿ Lightning checkout ⚡ Instant delivery 🔒 No account needed
The four real problems

What breaks when you accept Bitcoin yourself

None of these are about price or wallets. They're about proving payment and protecting the file.

1. Verifying payment properly

"The buyer says they paid" is not verification. You need to confirm the transaction exists, actually pays your address, and covers the amount at the rate you quoted — otherwise anyone can claim payment with a random txid.

2. Not handing over the file too early

If the download URL is guessable or permanent, one buyer becomes a distributor. Links should be short-lived, signed and tied to the purchase.

3. Keeping the file off a public host

A public repo or CDN path is a permanent leak. If the plaintext ever touches a public URL, your product is free forever — and the web archives it.

4. Exchange-rate drift

Quote in fiat, charge in Bitcoin, and the amount must be pinned at checkout. An underpayment by 1% shouldn't unlock the file, and an overpayment shouldn't either.

The pattern that works

Pay-gated delivery, step by step

Satoshi Shelf's primary checkout now uses Lightning; this is the on-chain fallback path it also supports. Both end at the same signed download gate.

1

Quote in fiat, show BTC

Store prices in USD. At checkout, convert to BTC at a live rate and show the exact amount plus a QR code.

2

Verify server-side

For Lightning, ask your invoice backend whether the payment hash settled. For the on-chain fallback, check the txid against a block explorer and require enough value to the right address.

3

Issue a short-lived token

On success, sign a token that expires in 15 minutes and names only that one product. Store nothing about the buyer.

4

Encrypt the file at rest

Keep deliverables AES-256-GCM encrypted; the key lives only in the deployed server. Decrypt and stream only when a valid token arrives.

Practical notes

Things that bite people later

Where do you host it?

Anything that can run a function: Cloudflare Workers, a VPS, or a tiny serverless endpoint. If it can fetch a block explorer and HMAC a token, it's enough.

Should I discount for speed?

You can accept unconfirmed transactions — mempool sighting is usually plenty for a $2 product — but decide deliberately rather than by accident.

What about refunds?

Digital goods are typically sold final. Say so clearly up front so it's a stated term, not a surprise.

Do I lose sales by not taking cards?

Some, yes. You gain buyers with no usable card, buyers who don't want to hand over card data, and buyers in countries card processors handle badly — plus zero processor fees and no one able to freeze your account.

Can I see a working example?

Yes — this store is one. Every product page is the full flow: quote, QR, verify, token, decrypt, stream.