Inventory webhook events
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 value | Fires when |
|---|---|
ALL_INVENTORY_UPDATES | Any 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"
}
operationis one ofCREATE,UPDATE, orDELETE.old_imageisnullonCREATE;new_imageisnullonDELETE.- Available quantity per location =
on_hand - reserved - unavailable. stock_by_locationis keyed by partner location code.
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
}