> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fire.rest/llms.txt
> Use this file to discover all available pages before exploring further.

# product.updated

> Fired when one or more products change. Targets all menus and stores where the affected products appear.

`product.updated` is an **incremental** event. The products in the payload are added or updated in each target downstream system — existing products not included in the payload are left untouched. To remove a product, send a [`menu.updated`](/en/webhook-reference/menu-updated-v2) event with the full menu excluding that product.

When a product change affects multiple stores, Fire emits a **single event** with all affected stores listed in `targets`. Your system iterates the targets and applies the same product data to each one.

## Payload

```json theme={null}
{
  "event": {
    "id": "evt_ghi789",
    "type": "product.updated",
    "executionId": "exec_ghi123",
    "createdAt": "2025-01-15T14:32:00.000Z",
    "timezone": "America/Guayaquil"
  },
  "data": {
    "account": "1",
    "country": "EC",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "targets": [
      {
        "storeId": "b3d2a1f0-6e21-4c3a-9f5d-7a8b9c0d1e2f",
        "storeName": "Laboratorio Brasil",
        "vendorId": "100.6.1350",
        "timezone": "America/Guayaquil",
        "channels": [
          {
            "channelId": "d5f4c3b2-8043-4e5c-9b7f-9c0d1e2f3a4b",
            "channelReferenceName": "iFood",
            "listName": "Menu App"
          }
        ]
      },
      {
        "storeId": "c4e3b2a1-7f32-4d4b-8a6e-8b9c0d1e2f3a",
        "storeName": "Vila Olimpia",
        "vendorId": "100.6.1351",
        "timezone": "America/Guayaquil",
        "channels": [
          {
            "channelId": "d5f4c3b2-8043-4e5c-9b7f-9c0d1e2f3a4b",
            "channelReferenceName": "iFood",
            "listName": "Menu App"
          }
        ]
      }
    ],
    "products": [
      {
        "productId": "prod_001",
        "name": "Classic Burger",
        "description": "Beef patty, lettuce, tomato, pickles",
        "standardTime": true,
        "featured": false,
        "active": true,
        "type": "PRODUCTO",
        "priceInfo": {
          "pointPrice": 0,
          "price": 1000,
          "referencePrice": 1200,
          "suggestedPrice": 1200
        },
        "taxInfo": [
          { "vatRatePercentage": 12 }
        ],
        "productModifiers": [
          {
            "modifierId": "mod_001",
            "position": 1
          }
        ],
        "schedules": [
          {
            "day": "FRIDAY",
            "startDate": "2025-01-01",
            "endDate": "2025-12-31",
            "startTime": "10:00",
            "endTime": "22:30"
          }
        ],
        "images": [
          {
            "imageCategoryId": "img_prod_001",
            "fileUrl": "https://cdn.example.com/products/classic-burger.jpg"
          }
        ],
        "upselling": ["prod_002"],
        "crossSelling": ["prod_003"],
        "tags": ["bestseller"],
        "additionalInfo": {
          "assignedAt": "2025-01-10T09:15:00Z"
        }
      },
      {
        "productId": "prod_size_small",
        "name": "Small",
        "description": "Small size",
        "standardTime": true,
        "featured": false,
        "active": true,
        "type": "MODIFIER",
        "priceInfo": {
          "pointPrice": 0,
          "price": 0,
          "referencePrice": 0,
          "suggestedPrice": 0
        },
        "taxInfo": [],
        "productModifiers": [],
        "schedules": [],
        "images": [],
        "upselling": [],
        "crossSelling": [],
        "tags": [],
        "additionalInfo": {}
      }
    ],
    "modifierGroups": [
      {
        "modifierId": "mod_001",
        "modifier": "Choose your size",
        "minOptions": 1,
        "maxOptions": 1,
        "type": "RADIO",
        "modifierOptions": [
          {
            "optionId": "opt_001",
            "productId": "prod_size_small",
            "name": "Small",
            "position": 1
          }
        ]
      }
    ],
    "categories": [
      {
        "productCategoryId": "cat_001",
        "name": "Burgers",
        "displayInList": true,
        "featured": false,
        "position": 1,
        "images": [],
        "assignedAt": "2025-01-10T09:15:00Z",
        "productListing": [
          {
            "productId": "prod_001",
            "position": 1
          }
        ],
        "schedules": []
      }
    ]
  }
}
```

## Fields

### `data`

| Field            | Type      | Description                                                                              |
| ---------------- | --------- | ---------------------------------------------------------------------------------------- |
| `account`        | string    | Account identifier — required by downstream systems                                      |
| `country`        | string    | ISO 3166-1 alpha-2 country code (e.g. `EC`, `BR`, `CO`) — required by downstream systems |
| `groupId`        | string    | UUID correlating events from the same publication or sync batch                          |
| `targets`        | object\[] | Stores where the products must be updated                                                |
| `products`       | object\[] | Products to add or update                                                                |
| `modifierGroups` | object\[] | Modifier groups referenced by the products                                               |
| `categories`     | object\[] | Categories affected by the product changes                                               |

### `data.targets[n]`

| Field       | Type      | Description                                                   |
| ----------- | --------- | ------------------------------------------------------------- |
| `storeId`   | string    | Internal store UUID (PK `stores.id`) — not the `store_number` |
| `storeName` | string    | Store operational name                                        |
| `vendorId`  | string    | Store brand identifier                                        |
| `timezone`  | string    | Store IANA timezone (e.g. `America/Guayaquil`)                |
| `channels`  | object\[] | Sales channels where the products must be updated             |

### `data.targets[n].channels[n]`

| Field                  | Type   | Description                                                                                 |
| ---------------------- | ------ | ------------------------------------------------------------------------------------------- |
| `channelId`            | string | Internal sales channel UUID (PK `channels.id`) — not the aggregator's external `channel_id` |
| `channelReferenceName` | string | Name of the sales channel (e.g. `iFood`, `Rappi`) — not the fulfillment                     |
| `listName`             | string | Display name of the menu in that store/channel                                              |

### `data.products[n]`

| Field                       | Type           | Description                                                                                                                                                                                                                                                                                                                                                                      |
| --------------------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `productId`                 | string         | Product identifier                                                                                                                                                                                                                                                                                                                                                               |
| `name`                      | string         | Product name                                                                                                                                                                                                                                                                                                                                                                     |
| `description`               | string         | Product description                                                                                                                                                                                                                                                                                                                                                              |
| `standardTime`              | boolean        | Whether standard preparation time applies                                                                                                                                                                                                                                                                                                                                        |
| `featured`                  | boolean        | Whether the product is featured                                                                                                                                                                                                                                                                                                                                                  |
| `active`                    | boolean        | Menu visibility; does not reflect stock or operational availability (that travels in [`product.availability_changed`](/en/webhook-reference/product-availability-changed))                                                                                                                                                                                                       |
| `type`                      | string         | Item type: `PRODUCTO`, `MODIFIER`, `COMPLEMENT`, or `COMBO`                                                                                                                                                                                                                                                                                                                      |
| `priceInfo`                 | object         | Resolved product prices                                                                                                                                                                                                                                                                                                                                                          |
| `priceInfo.pointPrice`      | number         | Points price                                                                                                                                                                                                                                                                                                                                                                     |
| `priceInfo.price`           | number         | Resolved price (`0` for combos)                                                                                                                                                                                                                                                                                                                                                  |
| `priceInfo.referencePrice`  | number         | Reference price when applicable in the catalog — for `COMBO` this is the actual value                                                                                                                                                                                                                                                                                            |
| `priceInfo.suggestedPrice`  | number         | Suggested price when applicable in the catalog                                                                                                                                                                                                                                                                                                                                   |
| `taxInfo`                   | object\[]      | Tax information — `{ vatRatePercentage }`                                                                                                                                                                                                                                                                                                                                        |
| `productModifiers`          | object\[]      | Modifier group references — `{ modifierId, position, overrides? }`. `position` is **per product** (the same group can sit at a different position on another product), and `overrides[]` carries the option's price **for this product on this menu**. Same structure as in [`menu.updated`](/en/webhook-reference/menu-updated-v2#datamenuproductsnproductmodifiersnoverridesn) |
| `schedules`                 | object\[]      | Time-based availability                                                                                                                                                                                                                                                                                                                                                          |
| `images`                    | object\[]      | Product images                                                                                                                                                                                                                                                                                                                                                                   |
| `upselling`                 | string\[]      | Product IDs suggested as upsells                                                                                                                                                                                                                                                                                                                                                 |
| `crossSelling`              | string\[]      | Product IDs suggested as cross-sells                                                                                                                                                                                                                                                                                                                                             |
| `tags`                      | string\[]      | Product tags                                                                                                                                                                                                                                                                                                                                                                     |
| `additionalInfo`            | object         | Extra metadata                                                                                                                                                                                                                                                                                                                                                                   |
| `additionalInfo.assignedAt` | string \| null | Date the product joined the menu, in ISO 8601 UTC. See [Menu assignment date](#menu-assignment-date)                                                                                                                                                                                                                                                                             |

### `data.modifierGroups[n]`

Same structure as in [`menu.updated`](/en/webhook-reference/menu-updated-v2#datamenumodifiergroupsn).

### `data.categories[n]`

Same structure as in [`menu.updated`](/en/webhook-reference/menu-updated-v2#datamenucategoriesn), including `assignedAt` — the date the **category** joined the menu, with the same semantics as the product's.

## Menu assignment date

`additionalInfo.assignedAt` (product) and `categories[n].assignedAt` (category) indicate when the entity joined the menu — **membership** data, not edit data. Full semantics, format, and edge cases in [`menu.updated` → Menu assignment date](/en/webhook-reference/menu-updated-v2#menu-assignment-date), the canonical reference for the field.

It does **not** travel in [`product.price_updated`](/en/webhook-reference/product-price-updated) or [`product.availability_changed`](/en/webhook-reference/product-availability-changed): those events only carry their delta.

## Incremental behavior

| Situation                                     | Result         |
| --------------------------------------------- | -------------- |
| Product in payload, exists downstream         | Updated        |
| Product in payload, doesn't exist downstream  | Created        |
| Product **not** in payload, exists downstream | Left untouched |

`product.updated` never removes products — there's no way to express "delete" within this event. To remove a product, use [`menu.updated`](/en/webhook-reference/menu-updated-v2) sending the full menu without it.

## Usage

See [Product publication](/en/guides/product-publication) for the full handling guide.
