Skip to main content

Event types

Shoppex supports order, subscription, product, query, feedback, affiliate, and reseller webhooks. Event names use colons as separators, like order:paid.
When creating webhooks through the Dev API, send the exact event name, for example order:paid. Wildcard patterns like invoice.* do not work. Fetch the full allowlist from GET /dev/v1/webhooks/events.
These event payloads are not the same as the dynamic_webhook callback used by DYNAMIC products. For that contract, see Dynamic product delivery.

Supported event names

For paid product purchases, subscribe to order:paid or order:paid:product. If that purchase reduces available stock, Shoppex does not send a separate product:stock event for the same checkout.
order:item.delivered and order:item.delivery_failed report per-line-item fulfillment after payment. See Asynchronous and Manual Fulfillment for their payloads and recovery flow.

Payload families

Invoice payload

These events use the same base invoice payload shape as order:paid:
  • order:created
  • order:updated
  • order:partial
  • order:paid
  • order:cancelled
  • order:disputed
  • order:manual_payment_pending
Each invoice payload includes line_items. Every entry includes the stable line-item id, product snapshot, optional variant, quantity, delivery_status, and delivered_at. Paid events also include license_keys on delivered SERIALS line items. Other lifecycle events omit the keys.

Invoice payload with products

These events use the same invoice payload plus the products array, like order:paid:product:
  • order:created:product
  • order:updated:product
  • order:partial:product
  • order:paid:product
  • order:cancelled:product
  • order:disputed:product
A shop-level subscription receives the complete order. A webhook configured on a specific product receives only that product’s matching line_items and products entries. In a cart containing multiple serial products, product A’s endpoint therefore never receives product B’s license keys.

Example payloads

order:paid

Triggered when an order/invoice is successfully paid.
Dashboard simulation for order:paid uses this same envelope shape and the same core fields, just with synthetic values.
license_keys contains the unredacted product keys delivered to the buyer. Treat the webhook body as sensitive, avoid recording it in application logs, and only forward it to systems that are allowed to store the delivered product.

order:cancelled

Triggered when an order is cancelled or expires.

order:paid:product

Same as order:paid but includes full product details in the payload.
variant_id and variant_title are null when the product has no variant. license_keys is omitted unless a paid SERIALS line has committed keys. Use the line-item id as the stable correlation key; carts can contain the same product more than once with different variants.

order:cancelled:product

Same as order:cancelled but includes full product details.

order:manual_payment_pending

Triggered when Shoppex is waiting for an offline or manual payment review.

Common fields

All webhook payloads include these top-level fields:
Top-level webhook created_at is a Unix timestamp. Nested timestamps inside data, like invoice created_at / updated_at or subscription period fields, are ISO 8601 strings when present.

Webhooks

Setup, verification, and response handling

Dynamic delivery

Deliver products in real time through the webhook response