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.

  1. Go to Dashboard → Wallets.
  2. For each chain you want to accept, paste your extended public key (xPub):
    • Bitcoinxpub... (BIP-32), or the SegWit variants ypub... / 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).
  3. 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

  1. Go to Dashboard → Products → New product.
  2. 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).
  3. 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.

  1. The product page loads with the title, description, and price.
  2. If the product is marked private, you'll be prompted to sign in first.
  3. Pick a currency. The page generates a fresh invoice (a real Bitcart invoice, with a real receive address derived from your xPub).
  4. Either:
    • Pay from a wallet — the invoice goes pending → paid when 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 with scripts/simulate-paid-webhook.sh for testing entitlement delivery without spending real money.
  5. 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.

Next steps