Put something up for sale
Create a paid product, accept crypto, and have the buyer's reward delivered automatically. The whole flow uses the merchant dashboard — no code required for the basic cases. End-to-end this takes about 5 minutes once the wallets are configured.
Sign in and configure a receiving wallet
Open https://app.<your-domain>/dashboard and sign in. If you haven't yet
told OpenBitum where to send the money you're about to earn, do this once.
- Go to Dashboard → Wallets.
- For each chain you want to accept, paste your extended public key (xPub):
- Bitcoin —
xpub...(BIP-32), or the SegWit variantsypub.../zpub.... - Ethereum / Base / Arbitrum — your wallet's public address (the same 0x-prefixed string you'd paste into MetaMask).
- Solana — your wallet's public key (base58, 32 bytes).
- Bitcoin —
- Click Save.
Pick what you're selling — choose an entitlement type
In OpenBitum a product has a price and one or more entitlements. An entitlement is what the buyer gets when payment is confirmed. Five built-in types ship with the install:
| Type | What the buyer gets | Example use | |---|---|---| | GitHub invite | A collaborator invite to a repo | Selling access to a private codebase | | Discord role | A role assigned in your Discord server | Paid community tiers | | File download | A one-time signed S3/MinIO URL | Selling PDFs, video, art assets | | Logto role | A role assigned in your auth provider | Unlocking a section of your SaaS | | Webhook | A signed POST to a URL you choose | Anything custom; you handle the side effect |
If you need integration-specific setup (GitHub PAT, Discord bot token, S3 bucket), do it now — each integration has a one-page guide:
Create the product
- Go to Dashboard → Products → New product.
- Fill in the form:
- Name — what the buyer sees. Keep it short.
- Description — Markdown supported.
- Price (USD) — the invoice is denominated in USD and converted to crypto at the moment of checkout using Bitcart's rate provider.
- Accepted currencies — pick any subset of what you configured in step 1. Empty = all configured chains.
- Entitlement — pick a type from step 2 and fill in the type-specific fields (repo+permission for GitHub; guild+role for Discord; etc).
- Toggle Active = on and click Save.
After save, the product detail page shows the public Checkout URL — that's the link you share with buyers.
https://app.<your-domain>/checkout/<product-id>
Test by buying it yourself
Open the checkout URL in an incognito window so you exercise the same flow as a real customer.
- The product page loads with the title, description, and price.
- If the product is marked private, you'll be prompted to sign in first.
- Pick a currency. The page generates a fresh invoice (a real Bitcart invoice, with a real receive address derived from your xPub).
- Either:
- Pay from a wallet — the invoice goes
pending → paidwhen the confirmation count is reached (a few minutes for BTC, ~30 seconds for ETH/Base/USDC). - Or, in
NODE_ENV != production, you can simulate a paid webhook withscripts/simulate-paid-webhook.shfor testing entitlement delivery without spending real money.
- Pay from a wallet — the invoice goes
- Within ~30 seconds of
paid, the buyer receives their entitlement:- GitHub: an email + GitHub notification with the repo invite.
- Discord: the role appears on their Discord account.
- File: a signed download URL in their Account → Purchases page.
- Logto role: applied silently, takes effect on their next sign-in.
- Webhook: your endpoint receives a signed POST.
Watch the orders dashboard
Every checkout creates an order, and every order has a status timeline.
- Dashboard → Orders — paginated, filterable list.
- Click a row for the order detail page: amount paid, the transaction hash, the entitlement status, the buyer's email.
- CSV export — there's an Export button at the top for accounting.
Embed on your site (optional)
The checkout URL is shareable as-is, but you can also embed the flow on your own marketing page.
As a link:
<a href="https://app.example.com/checkout/<product-id>" class="buy-button">
Buy now — $49
</a>
As a webhook for completed orders:
Use the Webhook entitlement type with a URL pointing at your own
service. You receive a signed POST whenever an order flips to paid. See
Webhook integration for the signature format and
your retry budget.