> ## 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.availability_changed

> Se emite cuando un producto es activado o desactivado en una o más tiendas.

`product.availability_changed` se emite cuando cambia la disponibilidad de uno o más productos — por ejemplo, cuando un restaurante marca un producto como agotado o lo reactiva. Controla si el producto aparece en el menú y está disponible para compra.

Soporta múltiples productos en un solo evento. Cuando el cambio afecta a varias tiendas, Fire emite un **único evento** con todas las tiendas afectadas listadas en `targets`.

## Payload

```json theme={null}
{
  "event": {
    "id": "evt_mno345",
    "type": "product.availability_changed",
    "executionId": "exec_mno123",
    "createdAt": "2025-01-15T14:40: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/Sao_Paulo",
        "channels": [
          {
            "channelId": "d5f4c3b2-8043-4e5c-9b7f-9c0d1e2f3a4b",
            "channelReferenceName": "iFood"
          }
        ]
      },
      {
        "storeId": "c4e3b2a1-7f32-4d4b-8a6e-8b9c0d1e2f3a",
        "storeName": "Vila Olimpia",
        "vendorId": "100.6.1351",
        "timezone": "America/Sao_Paulo",
        "channels": [
          {
            "channelId": "d5f4c3b2-8043-4e5c-9b7f-9c0d1e2f3a4b",
            "channelReferenceName": "iFood"
          }
        ]
      }
    ],
    "products": [
      {
        "productId": "e925f6b0-15bf-dc39-2e3f-1a2b284310c6",
        "active": false
      },
      {
        "productId": "prod_size_small",
        "active": true
      }
    ]
  }
}
```

## Campos

### `data`

| Campo      | Tipo      | Descripción                                                                                   |
| ---------- | --------- | --------------------------------------------------------------------------------------------- |
| `account`  | string    | Identificador de cuenta — requerido por sistemas externos                                     |
| `country`  | string    | Código de país ISO 3166-1 alpha-2 (p. ej. `EC`, `BR`, `CO`) — requerido por sistemas externos |
| `groupId`  | string    | UUID que correlaciona eventos del mismo batch de publicación o sincronización                 |
| `targets`  | object\[] | Tiendas donde debe aplicarse el cambio de disponibilidad                                      |
| `products` | object\[] | Productos cuya disponibilidad cambió                                                          |

### `data.targets[n]`

Misma estructura que en [`product.updated`](/es/webhook-reference/product-updated#datatargetsn), sin el campo `listName` en `channels[n]`.

| Campo       | Tipo      | Descripción                                                          |
| ----------- | --------- | -------------------------------------------------------------------- |
| `storeId`   | string    | UUID interno de la tienda (PK `stores.id`) — no es el `store_number` |
| `storeName` | string    | Nombre operativo de la tienda                                        |
| `vendorId`  | string    | Identificador de marca de la tienda                                  |
| `timezone`  | string    | Zona horaria IANA de la tienda (p. ej. `America/Sao_Paulo`)          |
| `channels`  | object\[] | Canales de venta donde el cambio debe aplicarse                      |

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

| Campo                  | Tipo   | Descripción                                                                                       |
| ---------------------- | ------ | ------------------------------------------------------------------------------------------------- |
| `channelId`            | string | UUID interno del canal de ventas (PK `channels.id`) — no es el `channel_id` externo del agregador |
| `channelReferenceName` | string | Nombre legible del canal de ventas (p. ej. `iFood`, `Rappi`)                                      |

### `data.products[n]`

| Campo       | Tipo    | Descripción                                  |
| ----------- | ------- | -------------------------------------------- |
| `productId` | string  | Identificador del producto (UUID)            |
| `active`    | boolean | `true` para activar, `false` para desactivar |

## Comportamiento

Establecer `active: false` oculta el producto del menú y lo marca como no disponible para compra. Establecer `active: true` lo restaura.

Este evento no modifica ningún otro dato del producto — nombre, precio, imágenes y modificadores permanecen sin cambios.

Desactivar un producto **no** es sacarlo del menú: sigue siendo miembro, solo deja de estar disponible. Por eso su fecha de incorporación (`additionalInfo.assignedAt`) no cambia con `active: false` ni se reinicia al volver a `active: true`, y este evento no la transmite. Llega en [`product.updated`](/es/webhook-reference/product-updated#fecha-de-incorporación-al-menú) y en [`menu.updated`](/es/webhook-reference/menu-updated-v2).

### `active` es la disponibilidad EFECTIVA, no un solo interruptor

`products[n].active` no refleja un único campo: es el resultado de combinar la visibilidad del
producto con la de **cada categoría** en la que aparece. Un producto puede vivir en varias
categorías del menú, y el evento es plano por producto, así que se toma el **OR** entre ellas:

> `active = true` si existe AL MENOS UNA categoría donde (la categoría está visible Y el producto
> está visible en ella).

Dos consecuencias que conviene tener presentes al procesar el evento:

* **Ocultar una categoría entera llega como N entradas de producto**, una por cada producto cuya
  disponibilidad efectiva cambió — no como un cambio de categoría. Este evento no tiene forma de
  expresar categorías; la estructura del menú viaja en
  [`menu.updated`](/es/webhook-reference/menu-updated-v2) (`categories[n].displayInList`).
* **Un producto que también vive en otra categoría visible NO aparece en el evento**, porque su
  disponibilidad efectiva no cambió. Es correcto, pero significa que la ausencia de un producto en
  `products[]` no implica que su categoría no se haya tocado.

Solo se emiten los productos cuya disponibilidad efectiva **cambió** respecto del estado anterior.
Un producto nuevo en el menú no aparece acá: llega con `menu.updated` / `product.updated`.

## Uso

Consulta la guía [Publicación de producto](/es/guides/product-publication) para el flujo completo de procesamiento.
