Webhook payload
Every message is an HTTP POST with a JSON body:
{
"event": "stock_movement.finalized",
"timestamp": "2026-11-11T09:30:00Z",
"site": "https://example.com",
"data": { }
}
Headers:
| Header | Value |
|---|---|
Content-Type |
application/json |
X-NextInventory-Event |
The event name |
X-NextInventory-Signature |
sha256=<hex HMAC>, see Signatures |
X-NextInventory-Delivery |
The delivery id, the same on every retry of one delivery |
webhook-id |
msg_<delivery id>, the same on every retry (Standard Webhooks) |
webhook-timestamp |
When this attempt was sent, in Unix seconds (signed) |
webhook-signature |
v1,<base64 HMAC>, see Signatures |
User-Agent |
NextInventory-Webhook/1.0 |
Use X-NextInventory-Delivery to ignore a message you have already processed. A retry after a
timeout can arrive although your system did handle the first attempt.
stock_movement.finalized
{
"id": 812,
"movement_type": "check_out",
"reference": "REQ-2231",
"batch_id": "c5b0…",
"movement_date": "2026-11-11",
"warehouse_id": 1,
"recipient_id": 5,
"recipient_name": "Dana Smith",
"created_by": 412,
"lines": [
{ "item_id": 23, "title": "Laptop 14\"", "sku": "IT-0023", "quantity": 1.0, "stock_quantity": 6.0 }
]
}
stock_quantity on each line is the item's stock after the movement.
transfer.finalized
id, reference, transfer_date, from_warehouse_id, to_warehouse_id, created_by, lines.
adjustment.finalized
id, reference, adjustment_date, adjustment_type (addition, damage, subtraction),
warehouse_id, created_by, lines.
stock.changed
One message per item whose quantity changed:
{
"item_id": 17, "title": "A4 Copy Paper", "sku": "OFFC-001",
"old_quantity": 26.0, "new_quantity": 16.0, "change": -10.0,
"low_stock_threshold": 18.0, "warehouse_id": 1,
"source": "transaction", "source_id": 9412
}
source says what changed it, and source_id is that record's id:
source |
source_id is |
|---|---|
stock_movement |
the stock movement |
transfer |
the transfer |
adjustment |
the adjustment |
transaction |
the ledger entry, from the Items page's Check In / Check Out / Add / Remove dialog |
item_edit |
the item, when someone typed a new quantity into the item form (no ledger entry is written) |
item_create |
the item, when it was created with an opening quantity |
stock.low
{ "item_id": 17, "title": "A4 Copy Paper", "sku": "OFFC-001", "stock_quantity": 4.0, "low_stock_threshold": 5.0, "warehouse_id": 1 }
Sent once, when a stock change of any kind takes the item across its threshold. It is not sent again while the item stays low.
item.created and item.updated
id, title, item_type, sku, barcode, serial_number, category_id, warehouse_id,
unit_id, stock_quantity, unit_price, low_stock_threshold, state.
item.deleted
id, title, sku.
warehouse.* and recipient.*
Warehouses: id, title, address, published, custom_fields. Recipients: id, name,
email, department, published, custom_fields. custom_fields is an object of field name to
value. *.deleted carries the record as it was just before it was deleted.
ping
Sent by Send a test ping: { "message": "Next Inventory webhook test.", "webhook_id": 3 }.