product.priceChanged
This event is triggered when a product's sales price changes in a restaurant.
Price list updates, changing a product's price directly, defining or removing a branch specific price, and bulk price imports via Excel all trigger this event. It does not matter whether the change was made from the head office application or from the branch's own Adisyo application — the event is sent in both cases.
If the price did not actually change (the same amount was saved again), no event is produced.
When a branch specific price is defined, that price is sent in the payload; otherwise the price from the price list the branch is bound to is sent. In other words, the payload always carries the current effective price for that branch.
Payload Structure
A single save operation can affect more than one product (price list updates, bulk imports), so products are listed in a products array. When a single product changes, the array simply contains one item.
{
"eventId": "9c1f0a2d-4b7e-4c1a-9f52-1d8e6b3a7c04",
"webhookEventType": "product.priceChanged",
"eventTimeUtc": "2025-10-21T11:59:50.1855135Z",
"data": {
"products": [
{
"productId": 2230902,
"productName": "Sushi Set",
"productCode": "SUS-001",
"units": [
{
"productUnitId": 55123,
"unitName": "Adet",
"isDefault": true,
"prices": [
{ "orderType": 1, "orderTypeName": "Masa siparişi", "price": 40.00, "isActive": true },
{ "orderType": 3, "orderTypeName": "Paket servis", "price": 45.00, "isActive": true },
{ "orderType": 5, "orderTypeName": "Gel-Al siparişi", "price": 30.00, "isActive": true }
]
}
]
}
]
},
"restaurantIdentity": "3edc2d46-bfc0-44d1-b701-f18e56306aed"
}Data Fields
| Field | Type | Description |
|---|---|---|
products | array | Products whose price changed. A single event carries at most 250 products; larger changes are split across multiple events |
products Fields
| Field | Type | Description |
|---|---|---|
productId | number | Product ID |
productName | string | Product name |
productCode | string | Product code |
units | array | Units (portions) of the product. Prices are defined per unit |
units Fields
| Field | Type | Description |
|---|---|---|
productUnitId | number | Product unit ID. Same value as productUnitId in the /Menu response |
unitName | string | Unit name (Piece, Portion, Small Size, etc.) |
isDefault | boolean | Whether this is the default unit of the product |
prices | array | Current price per order type |
prices Fields
| Field | Type | Description |
|---|---|---|
orderType | number | Order type. 1 Table, 3 Delivery, 5 Takeaway |
orderTypeName | string | Name of the order type |
price | number | Current effective price in the branch |
isActive | boolean | Whether the product is open for sale for this order type |
Usage
The payload contains all unit and order type prices of the product at that moment, not only the price that changed. This allows you to reflect the product's current prices directly, without making an additional request.
The products array is used for single product changes as well, so you do not need separate handling for the single and bulk cases.
Order types without a price definition are not included in the prices list. A product with no price in the branch is left out of the products array; if no product remains, no event is sent.
The isActive field reflects the product's sales status independently of the price and comes from the same source as the product.statusChanged event. Closing a product for sale does not produce a price event; product.statusChanged is triggered instead.