Event catalog
Every event type, when it fires, and what's in data.object.
| Event | Fires when | data.object |
|---|---|---|
order.created | A new order is ingested from any channel (poller or channel webhook). Exactly one per channel order, however many lines it has (they're all in the payload) | Order |
order.status_changed | An order's normalized status changes (e.g. awaiting_shipment → shipped, → canceled). One event per change: a new tracking, fulfillment detail or source_status alone doesn't send it (re-read the order if you need those) | Order. data.status is the status after the change, data.previous_status the one before; they always differ |
product.updated | A product's content changes from the dashboard, the API, or a channel-side edit synced in | Product |
product.deleted | A product is deleted | { "id": … } |
inventory.updated | A variant's quantity or price changes from a sale on any channel (data.source: "order", one event per order line, with data.channel, data.order_id_on_channel, the data.variant_id / data.sku sold and data.quantity_change, e.g. -1) or from the API (data.source: "api"). A cancellation of such an order before shipping gives the units back (data.source: "order", data.reason: "order_canceled", positive data.quantity_change). Quantity changes made in the dashboard or directly on a channel don't send it yet: re-read GET /products if you need those | Product (with updated variants[]) |
listing.status_changed | A listing reaches a new settled status: listed, imported, error or delisted. One event per change, never for a write that keeps the status. ongoing (publish or delist in progress) is not notified: the operation tracks it | Listing (the one listing that changed). data.status is the new status, data.previous_status the last notified one, so consecutive events always chain (listed → delisted → listed). null only on a listing's first event |
operation.completed | An asynchronous operation finishes (succeeded, partial or failed). Subscribe to this instead of polling /operations | Operation |
channel_account.updated | A channel account's settings change, from the dashboard or the API (one event per changed account). data.source is dashboard or api; data.previous_attributes holds the old values. PATCH them back to undo | Channel account |
channel_account.connected | A channel account connected through the API finished connecting (data.connection_id) | Channel account |
channel_account.disconnected | A channel account was disconnected, from the dashboard or the API (data.source) | Channel account (id + channel, status: disconnected) |
New event types are added over time. Consumers must tolerate unknown
type values (log and ack them).
Which events do I need?
- Order sync into your system →
order.created+order.status_changed. - Stock sync back to your system →
inventory.updated(fires for sales on any channel; this is how you keep an external warehouse in sync). - "Is my product live?" →
listing.status_changed(oroperation.completedafter a publish). - Fire-and-forget writes →
operation.completedto get the per-channel outcome without polling. - Audit / undo of channel settings →
channel_account.updated. - Know when a merchant finished connecting a channel →
channel_account.connected(andchannel_account.disconnected).
Last updated on October 17, 2026
Need help?
Email us and a human replies, usually within one business day.