Saltar al contenido principal
Un menú en Fire es la definición completa del catálogo para una combinación específica de tienda y canal — incluye categorías, productos, grupos de modificadores y horarios. El payload es autocontenido y está listo para enviarse a sistemas externos. Trátalo como un upsert: crea el menú si no existe o reemplázalo completamente si ya existe.

Payload

{
  "event": {
    "id": "evt_def456",
    "type": "menu.updated",
    "executionId": "exec_abc123",
    "createdAt": "2025-01-15T14:31:00.000Z"
  },
  "data": {
    "account": "1",
    "country": "EC",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "menu": {
      "list": {
        "listId": "805-iFood-delivery",
        "listName": "iFood - Store 805",
        "vendorId": "100.6.1350",
        "storeId": "805",
        "storeName": "Laboratorio Ecuador",
        "timezone": "America/Guayaquil",
        "channelId": "0E049503-85CF-E511-80C6-000D3A3261F3",
        "channelReferenceName": "iFood",
        "schedules": [
          { "day": "MONDAY",    "startTime": "07:00", "endTime": "23:00" },
          { "day": "TUESDAY",   "startTime": "07:00", "endTime": "23:00" },
          { "day": "WEDNESDAY", "startTime": "07:00", "endTime": "23:00" },
          { "day": "THURSDAY",  "startTime": "07:00", "endTime": "23:00" },
          { "day": "FRIDAY",    "startTime": "07:00", "endTime": "23:30" },
          { "day": "SATURDAY",  "startTime": "08:00", "endTime": "23:30" },
          { "day": "SUNDAY",    "startTime": "08:00", "endTime": "22:00" }
        ]
      },
      "categories": [
        {
          "productCategoryId": "cat_001",
          "name": "Hamburguesas",
          "displayInList": true,
          "featured": false,
          "position": 1,
          "images": [
            {
              "imageCategoryId": "img_cat_001",
              "fileUrl": "https://cdn.example.com/categories/burgers.jpg"
            }
          ],
          "productListing": [
            { "productId": "prod_001", "position": 1 }
          ],
          "schedules": [
            { "day": "MONDAY",    "startTime": "11:00", "endTime": "23:00" },
            { "day": "TUESDAY",   "startTime": "11:00", "endTime": "23:00" },
            { "day": "WEDNESDAY", "startTime": "11:00", "endTime": "23:00" },
            { "day": "THURSDAY",  "startTime": "11:00", "endTime": "23:00" },
            { "day": "FRIDAY",    "startTime": "11:00", "endTime": "23:30" },
            { "day": "SATURDAY",  "startTime": "11:00", "endTime": "23:30" },
            { "day": "SUNDAY",    "startTime": "11:00", "endTime": "22:00" }
          ]
        },
        {
          "productCategoryId": "cat_002",
          "name": "Desayunos",
          "displayInList": true,
          "featured": false,
          "position": 2,
          "images": [],
          "productListing": [
            { "productId": "prod_002", "position": 1 }
          ],
          "schedules": null
        }
      ],
      "products": [
        {
          "productId": "prod_001",
          "name": "Hamburguesa Clásica",
          "description": "Medallón de res, lechuga, tomate, pepinillos",
          "active": true,
          "type": "PRODUCT",
          "priceInfo": {
            "pointPrice": 0,
            "price": 1000,
            "referencePrice": 1200,
            "suggestedPrice": 1200
          },
          "productModifiers": [
            {
              "modifierId": "mod_001",
              "position": 1,
              "overrides": [
                {
                  "productId": "prod_size_small",
                  "priceInfo": {
                    "pointPrice": 0,
                    "price": 800,
                    "referencePrice": 800,
                    "suggestedPrice": 800
                  }
                }
              ]
            }
          ],
          "schedules": [
            { "day": "MONDAY",    "startTime": "11:00", "endTime": "23:00" },
            { "day": "TUESDAY",   "startTime": "11:00", "endTime": "23:00" },
            { "day": "WEDNESDAY", "startTime": "11:00", "endTime": "23:00" },
            { "day": "THURSDAY",  "startTime": "11:00", "endTime": "23:00" },
            { "day": "FRIDAY",    "startTime": "11:00", "endTime": "23:30" },
            { "day": "SATURDAY",  "startTime": "11:00", "endTime": "23:30" },
            { "day": "SUNDAY",    "startTime": "11:00", "endTime": "22:00" }
          ],
          "images": [
            {
              "imageCategoryId": "img_prod_001",
              "fileUrl": "https://cdn.example.com/products/classic-burger.jpg"
            }
          ],
          "taxInfo": [
            { "vatRatePercentage": 12 }
          ],
          "additionalInfo": {
            "externalCode": "11019#23211#231",
            "ncm": "21.00.21.32"
          }
        },
        {
          "productId": "prod_002",
          "name": "Panqueques",
          "description": "Panqueques esponjosos con jarabe de maple",
          "active": true,
          "type": "PRODUCT",
          "priceInfo": {
            "pointPrice": 0,
            "price": 800,
            "referencePrice": 800,
            "suggestedPrice": 800
          },
          "productModifiers": [],
          "schedules": null,
          "images": [],
          "taxInfo": [
            { "vatRatePercentage": 12 }
          ],
          "additionalInfo": {
            "externalCode": "11019",
            "ncm": "19.05.90.90"
          }
        },
        {
          "productId": "prod_size_small",
          "name": "Pequeño",
          "description": "Tamaño pequeño",
          "active": true,
          "type": "MODIFIER",
          "priceInfo": {
            "pointPrice": 0,
            "price": 0,
            "referencePrice": 0,
            "suggestedPrice": 0
          },
          "productModifiers": [],
          "schedules": null,
          "images": [],
          "additionalInfo": {
            "externalCode": "11020",
            "ncm": "21.00.21.32"
          }
        },
        {
          "productId": "prod_size_large",
          "name": "Grande",
          "description": "Tamaño grande",
          "active": true,
          "type": "MODIFIER",
          "priceInfo": {
            "pointPrice": 0,
            "price": 200,
            "referencePrice": 200,
            "suggestedPrice": 200
          },
          "productModifiers": [],
          "schedules": null,
          "images": [],
          "additionalInfo": {
            "externalCode": "11021",
            "ncm": "21.00.21.32"
          }
        }
      ],
      "modifierGroups": [
        {
          "modifierId": "mod_001",
          "modifier": "Elige tu tamaño",
          "minOptions": 1,
          "maxOptions": 1,
          "type": "RADIO",
          "modifierOptions": [
            { "optionId": "opt_001", "productId": "prod_size_small", "name": "Pequeño", "position": 1 },
            { "optionId": "opt_002", "productId": "prod_size_large", "name": "Grande", "position": 2 }
          ]
        }
      ]
    }
  }
}

Campos

data

CampoTipoDescripción
accountstringIdentificador de la cuenta
countrystringCódigo de país ISO 3166-1 alpha-2 (p. ej. EC, BR, CO) — requerido por sistemas externos
groupIdstringUUID que correlaciona eventos del mismo batch de publicación o sincronización. Varios eventos menu.updated emitidos juntos comparten el mismo groupId.
menuobjectDefinición completa del menú

data.menu

CampoTipoDescripción
listobjectMetadatos del menú y asociación canal/tienda
categoriesobject[]Categorías del menú
productsobject[]Catálogo de productos
modifierGroupsobject[]Grupos de modificadores y opciones

data.menu.list

CampoTipoDescripción
listIdstringIdentificador compuesto: {storeNumber}-{channelCode}-{fulfillmentType}
listNamestringEtiqueta legible del menú (p. ej. "iFood - Store 805") — no es el nombre operativo de la tienda
vendorIdstring | numberCódigo de marca
storeIdstringNúmero de tienda (store_number)
storeNamestringNombre operativo de la tienda. Fallback: "Store #{store_number}"
timezonestring | nullZona horaria IANA de la tienda (p. ej. America/Guayaquil). null si no está configurada
channelIdstringUUID del canal de ventas / fulfillment mapping
channelReferenceNamestringNombre de referencia del fulfillment (p. ej. delivery, iFood)
schedulesobject[] | nullVentanas de tiempo en las que este menú está activo. Siempre presente; null si no hay horario aplicable

data.menu.list.schedules[n]

CampoTipoDescripción
daystringDía de la semana: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
startTimestringHora de apertura en formato HH:mm
endTimestringHora de cierre en formato HH:mm

data.menu.categories[n]

CampoTipoDescripción
productCategoryIdstringIdentificador de categoría
namestringNombre para mostrar
displayInListbooleanSi la categoría es visible
featuredbooleanSi la categoría está destacada
positionnumberOrden de visualización
imagesobject[]Imágenes de la categoría — { imageCategoryId, fileUrl }
productListingobject[]Productos de esta categoría con sus posiciones — { productId, position }
schedulesobject[] | nullHorario propio de la categoría. Siempre presente; null si no hay horario configurado

data.menu.products[n]

CampoTipoDescripción
productIdstring | numberIdentificador del producto (externalId o UUID)
namestringNombre del producto
descriptionstringDescripción del producto
activebooleanVisibilidad en el menú (visible); no refleja stock ni disponibilidad operativa
typestringTipo de ítem: PRODUCTO, MODIFIER, COMPLEMENT, COMBO
priceInfoobjectPrecios resueltos del producto
priceInfo.pointPricenumberPrecio en puntos
priceInfo.pricenumberPrecio resuelto (resolved_price / final_price; 0 para combos)
priceInfo.referencePricenumberPrecio de referencia cuando aplica en catálogo
priceInfo.suggestedPricenumberPrecio sugerido cuando aplica en catálogo
productModifiersobject[]Referencias de grupos de modificadores — { modifierId, position, overrides? }
productModifiers[n].overridesobject[]Overrides opcionales de precio para opciones específicas de este modificador en este producto
schedulesobject[] | nullHorario custom del producto. Siempre presente en todos los ítems de products[] (incl. stubs de opciones modifier); null si usa horario de tienda o no tiene horario custom
imagesobject[]Imágenes del producto
taxInfoobject[]Información fiscal — { vatRatePercentage }
upsellingstringProducto sugerido para upselling (opcional)
additionalInfoobjectMetadata adicional opcional del producto
additionalInfo.externalCodestringCódigo externo que identifica el producto en un sistema de terceros. Puede ser un código simple (p. ej. 11019) o una clave compuesta con # como separador (p. ej. 11019#23211#231).
additionalInfo.ncmstringCódigo de clasificación fiscal NCM (Nomenclatura Común del Mercosur, p. ej. 21.00.21.32).

data.menu.modifierGroups[n]

CampoTipoDescripción
modifierIdstringIdentificador del grupo de modificadores
modifierstringNombre para mostrar del grupo
minOptionsnumberNúmero mínimo de selecciones requeridas
maxOptionsnumberNúmero máximo de selecciones permitidas
typestringTipo de selección: RADIO (single) o CHECKBOX (multiple)
modifierOptionsobject[]Opciones individuales del grupo — cada productId debe existir en products

data.menu.modifierGroups[n].modifierOptions[n]

CampoTipoDescripción
optionIdstringIdentificador de la opción
productIdstringProducto usado como esta opción
namestringNombre de la opción
positionnumberOrden de visualización

Notas

  • El payload es un menú completo — no un diff. Reemplaza el menú completo en el sistema externo.
  • Cada menu.modifierGroups[n].modifierOptions[n].productId debe referenciar un producto definido en menu.products.
  • Los campos schedules en list, categorías y productos siempre están presentes en el payload. Usa null cuando no hay horario aplicable; nunca omitas la clave.
  • list.schedules: herencia fulfillment → canal → salesScheduleoperationSchedulenull.
  • categories[].schedules: horario propio de la categoría si existe; null si no hay.
  • products[].schedules: solo cuando el producto tiene schedule mode: custom; null si usa horario de tienda o no tiene horario custom (hereda la ventana del list implícitamente).

Eliminar un menú externamente

Fire no emite un evento de borrado separado para menús. Para eliminar un menú de un sistema externo, Fire envía un evento menu.updated con menu.categories, menu.products y menu.modifierGroups como arrays vacíos. Tu sistema debe interpretar un menú vacío como señal para desactivar o eliminar el menú externamente.
{
  "event": {
    "id": "evt_def459",
    "type": "menu.updated",
    "executionId": "exec_abc124",
    "createdAt": "2025-01-15T14:31:00.000Z"
  },
  "data": {
    "account": "1",
    "country": "EC",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "menu": {
      "list": { "..." : "..." },
      "categories": [],
      "products": [],
      "modifierGroups": []
    }
  }
}

Uso

Consulta la guía Publicación de menú para el flujo completo de procesamiento.