Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.shoppex.io/llms.txt

Use this file to discover all available pages before exploring further.

Event Types

Shoppex supports order, subscription, product, query, feedback, and affiliate webhooks. Event names use colons as separators, like order:paid.
When creating webhooks through the Dev API, send explicit event names like order:paid — wildcard patterns like invoice.* are not supported. 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

EventDescription
order:createdOrder created
order:updatedOrder updated
order:partialPartial payment received
order:paidOrder fully paid
order:cancelledOrder cancelled or expired
order:disputedOrder dispute opened
order:created:productOrder created with product payload
order:updated:productOrder updated with product payload
order:partial:productPartial payment with product payload
order:paid:productPaid order with product payload
order:cancelled:productCancelled order with product payload
order:disputed:productDisputed order with product payload
order:manual_payment_pendingManual payment review required

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

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

Example Payloads

order:paid

Triggered when an order/invoice is successfully paid.
{
  "event": "order:paid",
  "data": {
    "uniqid": "abc123def456",
    "type": "PRODUCT",
    "status": "COMPLETED",
    "gateway": "STRIPE",
    "total": 49.99,
    "total_display": 49.99,
    "currency": "USD",
    "exchange_rate": 1,
    "crypto_exchange_rate": 0,
    "crypto_gateway": null,
    "apm_method": "CARD",
    "customer_email": "customer@example.com",
    "country": "US",
    "quantity": 1,
    "product_id": "prod_xyz",
    "product_title": "Pro License",
    "is_developer_invoice": false,
    "created_at": "2026-01-15T09:10:00.000Z",
    "updated_at": "2026-01-15T10:10:00.000Z"
  },
  "created_at": 1705318200
}
Dashboard simulation for order:paid uses this same envelope shape and the same core fields, just with synthetic values.

order:cancelled

Triggered when an order is cancelled or expires.
{
  "event": "order:cancelled",
  "data": {
    "uniqid": "abc123def456",
    "type": "PRODUCT",
    "status": "VOIDED",
    "gateway": null,
    "total": 49.99,
    "total_display": 49.99,
    "currency": "USD",
    "exchange_rate": 1,
    "crypto_exchange_rate": 0,
    "crypto_gateway": null,
    "apm_method": null,
    "customer_email": "customer@example.com",
    "product_id": "prod_xyz",
    "product_title": "Pro License",
    "created_at": "2026-01-15T09:10:00.000Z",
    "updated_at": "2026-01-16T09:03:20.000Z"
  },
  "created_at": 1705400600
}

order:paid:product

Same as order:paid but includes full product details in the payload.
{
  "event": "order:paid:product",
  "data": {
    "uniqid": "abc123def456",
    "type": "PRODUCT",
    "status": "COMPLETED",
    "gateway": "STRIPE",
    "total": 49.99,
    "total_display": 49.99,
    "currency": "USD",
    "exchange_rate": 1,
    "crypto_exchange_rate": 0,
    "crypto_gateway": null,
    "apm_method": "CARD",
    "customer_email": "customer@example.com",
    "product_id": "prod_xyz",
    "product_title": "Pro License",
    "products": [
      {
        "uniqid": "prod_xyz",
        "title": "Pro License",
        "description": "Full access to all features",
        "price": 49.99,
        "price_display": 49.99,
        "currency": "USD",
        "type": "SERVICE"
      }
    ],
    "created_at": "2026-01-15T09:10:00.000Z",
    "updated_at": "2026-01-15T10:10:00.000Z"
  },
  "created_at": 1705318200
}

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.
{
  "event": "order:manual_payment_pending",
  "data": {
    "uniqid": "abc123def456",
    "type": "PRODUCT",
    "status": "PENDING",
    "gateway": "MANUAL",
    "total": 49.99,
    "total_display": 49.99,
    "currency": "USD",
    "exchange_rate": 1,
    "crypto_exchange_rate": 0,
    "crypto_gateway": null,
    "apm_method": null,
    "customer_email": "customer@example.com",
    "country": "US",
    "quantity": 1,
    "product_id": "prod_xyz",
    "product_title": "Pro License",
    "is_developer_invoice": false,
    "created_at": "2026-01-15T09:10:00.000Z",
    "updated_at": "2026-01-15T09:20:00.000Z"
  },
  "created_at": 1705315200
}

Common Fields

All webhook payloads include these top-level fields:
FieldTypeDescription
eventstringEvent type (e.g., order:paid)
dataobjectEvent-specific payload
created_atnumberUnix timestamp when event was created
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.

Next Steps

Webhooks Overview

Setup, verification, and best practices

Dynamic Delivery

Deliver products in real-time via webhook response