Storefront
Customers browse your shop and check out directly
Payment Links
Share a link that takes customers straight to checkout
API
Create invoices programmatically from your app
This guide covers both hosted/public Shoppex flows (storefront, payment links) and Developer API flows (
POST /dev/v1/payments, POST /dev/v1/orders).The payment flow
You do not need to integrate with Stripe or PayPal directly. Shoppex handles all gateway communication for you.
Important integration rule
One Shoppex invoice can have more than one payment attempt over time. A customer can open checkout, try PayPal, abandon it, come back, and finish with Stripe. This surprises most people integrating for the first time. Redirect the customer to the Shoppex checkout URL, listen for webhook events, and fulfill based on the final invoice status. Do not build your fulfillment logic around a single provider-side session ID.Method 1: Storefront (hosted, public)
Your storefront atyourshop.shoppex.io is ready by default:
- Customer browses products
- Adds to cart
- Completes checkout
- Receives product automatically
Method 2: Payment Links (hosted flow)
Create a link that goes directly to checkout. Share it on social media, in emails, or anywhere else.Create through the dashboard
- Go to Products → Your Product
- Click Copy Payment Link
- Share the URL:
https://yourshop.shoppex.io/product/your-product
Create through the API
webhook, Shoppex sends payment lifecycle events only for that created payment or invoice to that URL. Store webhook_secret immediately. Shoppex does not return it on later reads.
The webhook value must be your own HTTP(S) endpoint. Discord webhook URLs are not compatible with Shoppex developer-event payloads. Configure Discord notifications under Notifications → Sales Alerts instead.
Best for: Social media sales, email campaigns, one-off payments
Method 3: API integration (Developer API)
Use the Developer API when you need your own checkout UI or a backend-driven payment flow.Payment vs order
POST /dev/v1/payments and POST /dev/v1/orders look similar, but they solve different problems.
Use POST /dev/v1/payments when you have your own checkout and want a hosted payment URL. You do not get Shoppex catalog line items or automatic product delivery.
Use POST /dev/v1/orders when you want to charge for real Shoppex products. It includes line items, variants, and automatic delivery (files, serials, subscriptions, or DYNAMIC).
The quick rule: payments = generic developer payment. orders = catalog-backed Shoppex order.
Check which payment methods are enabled
UseGET /dev/v1/me/capabilities to see which payment methods the shop currently accepts.
A common mistake: GET /dev/v1/payments returns existing payment records, not the shop’s payment configuration. If you want to know which gateways (Stripe, PayPal, Crypto) are enabled, use GET /dev/v1/me/capabilities instead.
Crypto payments require a connected crypto provider: your own OxaPay, Cryptomus, or NowPayments
account (connected in the dashboard under Settings → Payments → Crypto), or a Native Crypto
wallet.
GET /dev/v1/me/capabilities shows the enabled payment methods and native crypto
gateways for your shop.Skip the crypto picker on hosted checkout
If you want to keep Shoppex hosted checkout but open a concrete coin directly, pass:gateway: the merchant crypto provider you want Shoppex to usecrypto_gateway: the concrete coin or network the buyer pays with
OXAPAY, CRYPTOMUS, and NOWPAYMENTS.
cURL
gateway: "OXAPAY"+crypto_gateway: "TRON"-> hosted checkout opens directly on TRONgateway: "CRYPTOMUS"+crypto_gateway: "USDT_TRC20"-> hosted checkout opens directly on USDT TRC20gateway: "NOWPAYMENTS"+crypto_gateway: "BITCOIN"-> hosted checkout opens directly on Bitcoin through your NowPayments accountgateway: "NATIVE_CRYPTO"+crypto_gateway: "LITECOIN"-> Shoppex derives a non-custodial Litecoin receive address from your active native wallet
crypto_gateway, the buyer lands on the normal generic crypto payment selection first.
If you only send crypto_gateway without gateway, Shoppex uses your active native wallet when it
covers that coin. Otherwise, Shoppex uses your connected crypto provider. Either way, Shoppex starts
the crypto session immediately. If you have no connected crypto provider and no native wallet, the
request fails with a validation error.
Native crypto payments (BTC, LTC, USDT-TRC20, SOL, USDT-SPL)
Use this flow when you want crypto paid directly into your own non-custodial wallet. Shoppex assigns a fresh receive address from your active native wallet. The address is derived from your wallet key, or pre-created on your device for Solana. Shoppex watches the chain and marks the payment paid after the chain’s confirmation policy. Shoppex does not create a provider payment and does not hold keys or funds. Check availability first:cURL
cURL
gateway is NATIVE_CRYPTO, Shoppex fails if no active native wallet exists for the requested
chain. If you only send crypto_gateway (for example "BITCOIN" or "SOLANA"), an active native
wallet is prioritized over external providers offering the same coin.
White-label crypto checkout (removed)
Shoppex removed managed white-label crypto checkout, together with thewhite_label
request parameter. Crypto payments always use your own accounts now:
- Native Crypto for non-custodial receive addresses from your own wallet (BTC, LTC, USDT-TRC20, SOL, USDT-SPL)
- Your own OxaPay, Cryptomus, or NowPayments account for other coins
white_label.
Create a payment
If you create the payment with
gateway: 'PANDABASE', Shoppex also returns checkout_url and session_id.- Use
data.checkout_urlif you want the direct Pandabase checkout session URL. - Keep listening for Shoppex webhooks for the final paid or cancelled state.
Server-side completion is also different:
POST /dev/v1/payments/:id/completeconfirms a generic developer payment onlyPOST /dev/v1/orders/:id/fulfillcompletes and fulfills a catalog-backed orderPOST /dev/v1/orders/:id/completeis the same completion pipeline, exposed as an alias for integrations that look for acompleteendpoint
Handle the webhook
After payment, Shoppex sends a webhook to your server. Use thewebhook_secret returned by POST /dev/v1/payments for a per-payment webhook. Use the endpoint secret from Settings → Webhooks only for global webhook endpoints.
Dynamic product fulfillment
If you use products withtype: "DYNAMIC", there is one more callback contract to implement: dynamic_webhook.
This is separate from normal Shoppex event webhooks and uses the product’s dynamic webhook signing secret, not the secret from Settings → Webhooks.
The order:paid webhook tells your app that the invoice is paid. The dynamic_webhook is a separate fulfillment callback that asks your server for the delivered token, key, or access data.
Use the dedicated contract docs here:
Invoice vs payment link
Rule of thumb:
- Use Payment Links for simple, shareable checkouts
- Use Invoices when you need control over the checkout or customer data
Payment gateways
Configure your payment providers in Settings → Payments. For gateway-specific setup, supported methods, and fees, see Payment gateways. For a developer integration, the enabled gateways decide two things: whichgateway value you can pass to POST /dev/v1/payments or POST /dev/v1/orders, and which crypto_gateway values are valid. Use GET /dev/v1/me/capabilities to check what is enabled for the shop before you hardcode a gateway value.
Testing payments
Enable Test Mode in Settings before going live.Test card numbers
Use any future expiry date and any 3-digit CVC.
These numbers are Stripe-specific. PayPal and crypto gateways have their own sandbox modes.
Test checklist
1
Create a test invoice
Create an invoice through the dashboard or the API.
2
Complete checkout
Pay with test card
4242 4242 4242 4242.3
Verify the webhook
Check that your webhook endpoint received
order:paid.4
Check fulfillment
Confirm the product was delivered (email, license, download).
Common scenarios
Sell a digital product
- Create a product with File delivery type.
- Upload your file.
- Share your storefront or payment link.
- The customer pays, then receives the download automatically.
Sell software licenses
- Create a product with Serials delivery type.
- Add license keys, one per line.
- The customer pays, then receives a unique license key.
Custom checkout in your app
- Create a payment through the API with the customer email.
- Redirect the customer to
data.url. - Listen for the
order:paidwebhook. - Fulfill the order in your system.
Custom manual gateway (local PSP)
- Create a Manual gateway with a redirect URL and
{{invoice_id}}template variables. - Listen for
order:manual_payment_pendingon your shop webhook. - When your PSP confirms payment, call
POST /dev/v1/invoices/{uniqid}/complete. - Shoppex delivers the product and sends
order:paid.
Recurring subscription
- Create a product with Subscription type.
- Set the billing interval (monthly, yearly, and so on).
- The customer pays, then Shoppex creates the subscription.
- Renewals happen automatically.
Invoices
Deep dive into invoice lifecycle and statuses
Webhooks
Set up real-time notifications
Subscriptions
Set up recurring billing
API reference
Explore all endpoints