Inventory webhook events

Updated June 11, 20261 min read

Inventory webhooks fire on every stock-level change for any product in the tenant. The trigger HTTP header on every delivery tells you which event fired.

Triggers

Trigger valueFires when
ALL_INVENTORY_UPDATESAny inventory record is created, updated, or deleted

There is no way to subscribe to a subset of inventory changes. Every stock mutation in the tenant fires the webhook. Filter by product or location in your handler if needed.

Payload

The body is an envelope containing the inventory state before and after the change. Field names are snake_case.

{
  "old_image": {
    "product_id": "PROD-001",
    "stock_by_location": {
      "WH-UK-01": {
        "on_hand": 100,
        "reserved": 5,
        "unavailable": 0
      }
    }
  },
  "new_image": {
    "product_id": "PROD-001",
    "stock_by_location": {
      "WH-UK-01": {
        "on_hand": 95,
        "reserved": 5,
        "unavailable": 0
      }
    }
  },
  "trigger": "ALL_INVENTORY_UPDATES",
  "operation": "UPDATE"
}
  • operation is one of CREATE, UPDATE, or DELETE.
  • old_image is null on CREATE; new_image is null on DELETE.
  • Available quantity per location = on_hand - reserved - unavailable.
  • stock_by_location is keyed by partner location code.
Note

The inventory envelope uses snake_case field names (old_image, new_image). This differs from the order envelope, which uses camelCase (oldImage, newImage).

Scoping

Inventory webhooks are tenant-scoped, not merchant-scoped. A single configuration receives changes for all products across all locations in the tenant.

Conditions

No conditions are available. The webhook fires for every stock change across the entire tenant.

Configuration

Inventory webhooks are configured via the API. Create a webhook configuration with entity_type set to INVENTORY:

{
  "name": "Inventory sync",
  "entity_type": "INVENTORY",
  "notify_status": ["ALL_INVENTORY_UPDATES"],
  "endpoint_url": "https://your-system.com/webhook/inventory",
  "active": true
}