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
Order Events
Subscription Events
Reseller Events
Other Events
Event Description 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
}
Event Description subscription:trial:startedTrial started subscription:trial:endedTrial ended subscription:createdSubscription created subscription:updatedSubscription updated subscription:renewedSubscription renewed subscription:cancelledSubscription cancelled subscription:upcomingUpcoming renewal reminder subscription:trial:started:productTrial started with product payload subscription:trial:ended:productTrial ended with product payload subscription:created:productSubscription created with product payload subscription:updated:productSubscription updated with product payload subscription:renewed:productSubscription renewed with product payload subscription:cancelled:productSubscription cancelled with product payload subscription:upcoming:productUpcoming renewal with product payload
Payload Family These events use the same subscription payload shape as subscription:created:
subscription:trial:started
subscription:trial:ended
subscription:created
subscription:updated
subscription:renewed
subscription:cancelled
subscription:upcoming
subscription:trial:started:product
subscription:trial:ended:product
subscription:created:product
subscription:updated:product
subscription:renewed:product
subscription:cancelled:product
subscription:upcoming:product
Example Payloads subscription:created Triggered when a new subscription starts. {
"event" : "subscription:created" ,
"data" : {
"id" : "sub_abc123" ,
"status" : "ACTIVE" ,
"gateway" : "STRIPE" ,
"customer_id" : "cust_xyz789" ,
"current_period_start" : "2026-01-15T00:00:00.000Z" ,
"current_period_end" : "2026-02-15T00:00:00.000Z" ,
"created_at" : "2026-01-15T00:00:00.000Z"
},
"created_at" : 1705314600
}
subscription:cancelled Triggered when a subscription is cancelled. {
"event" : "subscription:cancelled" ,
"data" : {
"id" : "sub_abc123" ,
"status" : "CANCELLED" ,
"gateway" : "STRIPE" ,
"customer_id" : "cust_xyz789" ,
"current_period_start" : "2026-01-15T00:00:00.000Z" ,
"current_period_end" : "2026-02-15T00:00:00.000Z" ,
"created_at" : "2026-01-15T00:00:00.000Z"
},
"created_at" : 1705918200
}
subscription:renewed Triggered when a subscription renews for a new billing period. {
"event" : "subscription:renewed" ,
"data" : {
"id" : "sub_abc123" ,
"status" : "ACTIVE" ,
"gateway" : "STRIPE" ,
"customer_id" : "cust_xyz789" ,
"current_period_start" : "2026-02-15T00:00:00.000Z" ,
"current_period_end" : "2026-03-15T00:00:00.000Z" ,
"created_at" : "2026-01-15T00:00:00.000Z"
},
"created_at" : 1707991800
}
Event Description reseller:invitedReseller invitation created reseller:acceptedReseller accepted an invitation reseller:suspendedReseller relationship suspended reseller:terminatedReseller relationship terminated reseller:embed_campaign_createdReseller created an embed campaign reseller:embed_campaign_updatedReseller embed campaign changed status or metadata reseller:saleInvoice sale attributed to a reseller reseller:payout_requestedReseller requested a payout reseller:stock_purchase_requestedReseller requested wholesale stock reseller:stock_purchase_paidStock purchase invoice was paid reseller:stock_purchase_revokedStock purchase request was revoked reseller:stock_allocatedStock was allocated to reseller inventory reseller:stock_item_deliveredReseller delivered an inventory item to an end customer
Payload Notes Reseller webhook payloads are merchant-scoped. They include stable IDs plus snapshots needed by external systems. For example:
relationship_id identifies the reseller relationship with the merchant.
reseller_user_id identifies the reseller user.
campaign_id or embed_campaign_id identifies a reseller-owned embed campaign when available.
Stock events use transfer_id and inventory delivery events use item_id.
Example Payloads reseller:sale Triggered when a completed invoice is attributed to a reseller link or reseller-owned embed. {
"event" : "reseller:sale" ,
"data" : {
"relationship_id" : "rel_123" ,
"reseller_user_id" : "usr_123" ,
"invoice_id" : "inv_db_123" ,
"invoice_uniqid" : "abc123def456" ,
"affiliate_link_id" : "aff_123" ,
"embed_campaign_id" : "emb_123" ,
"product_id" : "prod_123" ,
"variant_id" : "var_123" ,
"retail_amount" : 49.99 ,
"commission_amount" : 5 ,
"currency" : "USD" ,
"mode" : "AFFILIATE"
},
"created_at" : 1777111200
}
reseller:stock_purchase_requested Triggered when a reseller requests wholesale stock. {
"event" : "reseller:stock_purchase_requested" ,
"data" : {
"relationship_id" : "rel_123" ,
"reseller_user_id" : "usr_123" ,
"transfer_id" : "rst_123" ,
"product_id" : "prod_123" ,
"variant_id" : null ,
"quantity" : 25 ,
"wholesale_unit_price" : 7.5 ,
"currency" : "USD"
},
"created_at" : 1777111200
}
reseller:stock_item_delivered Triggered when reseller inventory is delivered to an end customer. {
"event" : "reseller:stock_item_delivered" ,
"data" : {
"relationship_id" : "rel_123" ,
"reseller_user_id" : "usr_123" ,
"transfer_id" : "rst_123" ,
"item_id" : "rsi_123" ,
"product_id" : "prod_123" ,
"variant_id" : null ,
"serial_id" : "ser_123" ,
"delivered_to_email" : "customer@example.com"
},
"created_at" : 1777111200
}
reseller:purchase is accepted by the webhook event allowlist for integrations that already subscribed to the broad purchase name, but new integrations should use the more specific stock purchase events above.
Event Description product:createdProduct created product:editedProduct updated product:stockProduct stock changed product:dynamicDynamic product webhook dispatched query:createdSupport query created query:repliedSupport query replied feedback:receivedFeedback received affiliate:payout_requestedAffiliate payout requested
Payload Notes Invoice-Context Product Payload product:dynamic currently uses the same invoice-style payload family as the order events.
It is not the same as the direct dynamic_webhook delivery callback.Runtime-Specific Events The remaining supported event names on this page are listed as valid event values.
Dedicated public example payloads for product:created, product:edited, product:stock, query:created, query:replied, feedback:received, and affiliate:payout_requested are not expanded here yet. Example Payload product:dynamic Triggered after Shoppex starts dynamic product delivery for an invoice-backed purchase.
This webhook uses invoice context and is separate from the direct dynamic_webhook delivery request. {
"event" : "product:dynamic" ,
"data" : {
"uniqid" : "abc123def456" ,
"type" : "PRODUCT" ,
"status" : "COMPLETED" ,
"gateway" : "STRIPE" ,
"total" : 49.99 ,
"total_display" : 49.99 ,
"currency" : "USD" ,
"customer_email" : "customer@example.com" ,
"country" : "US" ,
"quantity" : 1 ,
"product_id" : "prod_xyz" ,
"product_title" : "Dynamic Role" ,
"is_developer_invoice" : false ,
"created_at" : "2026-01-15T09:10:00.000Z" ,
"updated_at" : "2026-01-15T10:10:00.000Z"
},
"created_at" : 1705318200
}
Common Fields
All webhook payloads include these top-level fields:
Field Type Description eventstring Event type (e.g., order:paid) dataobject Event-specific payload created_atnumber Unix 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