product.availability_changed is emitted when the availability of one or more products changes — for example, when a restaurant marks a product as out of stock or re-activates it. It controls whether the product appears in the menu and is available for purchase.
Supports multiple products in a single event. When the change affects multiple stores, Fire emits a single event with all affected stores listed in targets.
Payload
Fields
data
data.targets[n]
Same structure as in product.updated, without the listName field in channels[n].
data.targets[n].channels[n]
data.products[n]
Behavior
Settingactive: false hides the product from the menu and marks it as unavailable for purchase. Setting active: true restores it.
This event does not modify any other product data — name, price, images, and modifiers remain unchanged.
Deactivating a product is not the same as removing it from the menu: it stays a member, it just stops being available. That’s why its menu assignment date (additionalInfo.assignedAt) doesn’t change with active: false and doesn’t reset when it goes back to active: true — and this event doesn’t carry it. It arrives in product.updated and in menu.updated.
active is EFFECTIVE availability, not a single switch
products[n].active doesn’t reflect a single field: it’s the result of combining the product’s own
visibility with the visibility of every category it appears in. A product can live in several
menu categories, and the event is flat per product, so an OR is taken across them:
active = true if there is AT LEAST ONE category where (the category is visible AND the product
is visible in it).
Two consequences worth keeping in mind when processing the event:
- Hiding an entire category arrives as N product entries, one for each product whose effective
availability changed — not as a category change. This event has no way to express categories; menu
structure travels in
menu.updated(categories[n].displayInList). - A product that also lives in another visible category does NOT appear in the event, because its
effective availability didn’t change. That’s correct, but it means a product’s absence from
products[]doesn’t mean its category wasn’t touched.
menu.updated / product.updated.

