Event catalog
Every webhook event the integration emits, what it means, and the shape of data.object. The envelope wrapping each payload is documented on the Webhooks page.
Subscribing to events
Subscriptions are managed from Custom Integration → Settings → Event subscriptions. The default is the wildcard *: your endpoint receives every event.
- Tick individual events to allowlist them.
- Wildcard a namespace with e.g.
listing.*(subscribe to all listing events). integration.test_eventignores subscriptions; it's always delivered when fired manually.
Echo-suppression
Don't expect to receive your own writes back
/v1/orders, the corresponding order.received webhook is not delivered to your URL. Same for customer.matched: the integration that did the upsert doesn't hear about its own match. This is what stops trivial event-loops between your custom site and WatchTraderHub.Events triggered elsewhere (other integrations like Shopify or eBay, actions taken in the dashboard) still fire to your URL as normal.
Events
Listing events only carry the id
listing.* event, data.object is just the listing id and object: "listing". To get the watch (brand, model, price, photos, caliber, complications, water resistance, power reserve), fetch GET /v1/listings/{id} when the event arrives. Order and customer events are the exception: they include the full payload inline below.Listing events
listing.published
Fires when the dealer toggles an inventory item ON for the custom channel.
data.object
listing.updated
Fires when a published listing's data changes (price, photos, watch attributes, ...).
data.object
data.previous_attributes: Map of changed fields with their previous values, e.g. `{"price": {"amount": 1199000}}`.
listing.unpublished
Fires when the dealer toggles a listing OFF for the custom channel.
data.object
listing.sold
Fires when a listing transitions to sold (either manually or via order matching).
data.object
listing.in_stock
Fires when a previously-sold listing returns to active stock (e.g. sale voided).
data.object
Order events
order.received
Fires when an order is reported through the integration but not yet matched to a listing.
data.object
order.fulfilled
Fires when an order is matched to a listing and the dealer marks it fulfilled.
data.object
data.previous_attributes: Always `{ "status": "pending" }`.
order.cancelled
Fires when an order is cancelled via `POST /v1/orders/{id}/cancel`.
data.object
data.previous_attributes: Always `{ "status": "<previous>" }`.
Customer events
customer.matched
Fires when a customer upsert matches an existing client row instead of creating one.
data.object
Integration events
integration.test_event
Fires from `POST /v1/test/webhook_ping`. Always delivered regardless of `subscribed_events` filtering.
data.object
