Skip to main content
product.price_updated es un evento acotado — a diferencia de product.updated, solo transmite precios. El resto de los atributos del producto (nombre, descripción, imágenes, modificadores, etc.) permanece sin cambios. 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. El precio de una opción de modificador es contextual: pertenece a la combinación (producto padre × grupo × opción), no a la opción como producto suelto — la misma opción puede valer distinto bajo dos padres. Por eso viaja donde ya vive en menu.updated: en products[].productModifiers[].overrides[], colgando del padre y scopeado por el modifierId del grupo. No hay un array aparte.

Payload

Campos

data

data.targets[n]

Misma estructura que en product.updated — incluye vendorId y timezone.

data.targets[n].channels[n]

⚠️ listName en este evento es el nombre del menú (p. ej. Menu App), mientras que list.listName en menu.updated es una etiqueta autogenerada (IFOOD - Store 1350). No son el mismo valor y no sirven para correlacionar — usá listId, que sí es idéntico en ambos eventos.

data.products[n]

Los cuatro valores salen del ítem del producto en la lista de precios de la combinación destino (la misma que identifica listId), no de ninguna lista por defecto. products[] incluye el producto padre de cada opción con precio contextual, aunque su propio precio no haya cambiado: así siempre tenés el contexto del producto del que sale el cambio. Ese priceInfo es el precio vigente del padre, así que aplicarlo es un replace idempotente (le escribís el valor que ya tiene). Si dos opciones editadas comparten el mismo padre, el padre aparece una sola vez. Un producto que no tenga precio en la lista destino se omite. ⚠️ El precio base de una opción NO viaja en este evento. Esta pantalla edita la capa contextual (el precio de la opción bajo un padre), nunca el precio propio del producto-opción, así que emitir el base afirmaría un precio que no cambió — y como priceInfo es replace total, podría pisar el que ya tenés. El base lo tenés del último menu.updated, donde la opción viaja como producto de tipo MODIFIER, y sigue siendo válido. Si lo que se editó es el precio propio de un producto que además es opción en otro lado, ese producto llega como entrada normal de products[]: es una edición de producto, no de opción. ⚠️ Este priceInfo no tiene los mismos campos que el priceInfo de products[n] en menu.updated / product.updated ({pointPrice, price, referencePrice, suggestedPrice}). Son deliberadamente distintos: este evento transmite el precio de venta recién guardado con su descuento, no los precios de catálogo del producto.

data.products[n].productModifiers[n]

Mismo vocabulario que products[n].productModifiers[n] de menu.updated. Qué grupos llegan y con qué:
  • Solo los grupos que tienen algún precio contextual bajo ese padre. Un grupo ausente significa “sus opciones usan su precio base”, no “sin cambios”: los precios contextuales solo se agregan o se actualizan, nunca se borran, así que la ausencia siempre es el estado real.
  • De los grupos que llegan viene la totalidad de sus precios contextuales vigentes, no solo los recién editados. Así podés hacer merge por modifierId sin perder los que ya tenías.
  • A diferencia de menu.updated, el grupo no trae position: el orden es estructura y este evento solo transmite precios. Conservá el orden que ya tenés del menú.
La llave de un precio contextual es la terna padre × modifierId × productId de la opción. El anidamiento ya la expresa: aplicar el precio buscando solo por el productId de la opción es incorrecto, porque la misma opción puede aparecer bajo varios padres, o bajo el mismo grupo asignado dos veces al mismo padre (dos modifierId distintos), con precios distintos en cada caso. Un override lleva solo price: un precio contextual de opción no tiene precio con descuento ni sugerido propios — esos conceptos existen únicamente a nivel de producto, en products[n].priceInfo.

Combos: llegan reconstruidos

Un COMBO no tiene precio propio: su valor se deriva de las opciones de sus grupos requeridos. Por eso se emite igual que en menu.updatedprice: 0 y el valor real en referencePrice:
referencePrice = por cada grupo con minOptions ≥ 1, minOptions × (precio efectivo más bajo entre sus opciones), sumado sobre todos esos grupos. Los grupos opcionales (minOptions = 0) no aportan.
minOptions no viaja en este evento — es un campo de data.menu.modifierGroups[n] en menu.updated, correlacionado por modifierId. Para recalcular referencePrice necesitás los dos eventos: este te da los precios contextuales vigentes, menu.updated te da qué grupos son requeridos. Como cambiar una sola opción mueve ese valor, cuando se edita el precio de una opción de un combo el evento trae, de todos los grupos con precio contextual vigente bajo este padre — no solo el grupo editado —, la totalidad de sus overrides, para que puedas recalcular la referencia por tu cuenta y validarla contra la que te mandamos. Igual que en cualquier producto, un grupo requerido sin ningún override vigente no aparece en este evento (ver “Qué grupos llegan y con qué”); para su mínimo usá el precio base de esas opciones en menu.updated. Las opciones sin precio resoluble no participan del cálculo del mínimo.

Ejemplo

Ningún grupo trae position. Cruzando modifierId con minOptions de menu.updated: ⚠️ Si este combo tuviera además un grupo requerido cuyas opciones conservan todas su precio base (sin ningún override), ese grupo no aparecería en productModifiers[] — no significa que se haya borrado, solo que no hay precio contextual que informar. Su mínimo sale de las opciones de ese modifierId en menu.updated. ⚠️ Que un grupo tenga overrides no implica que sea requerido: 7c2f9d4e83a1b650 trae precios contextuales para sus opciones (son add-ons reales, con su propio precio) pero al ser opcional (minOptions = 0) no participa de la suma. En un producto normal las opciones son add-ons y no alteran el precio del padre: el padre conserva su price de lista y no lleva referencePrice.

Comportamiento

Este evento solo modifica precios. Nombre, descripción, imágenes, modificadores, impuestos y demás atributos permanecen sin cambios.
  • Para products[n], el objeto priceInfo recibido reemplaza por completo al existente para ese productId — no es un merge campo a campo.
  • Para productModifiers[n].overrides[n], price reemplaza el precio contextual de esa opción solo bajo este padre y este modifierId. Las demás apariciones de la misma opción no se tocan.
  • Un array vacío o ausente significa “nada que cambiar acá”, no “borrar todo”.
  • Que un producto aparezca en products[] no implica que su precio haya cambiado: puede estar ahí como padre de una opción (ver data.products[n]). El replace es idempotente en ese caso.
Un cambio de precio no altera la fecha de incorporación al menú del producto (additionalInfo.assignedAt): ese valor es de membresía, no de edición. Por eso este evento no lo transmite — el assignedAt que ya tengas registrado para ese producto sigue siendo válido. Llega en product.updated y en menu.updated.

Uso

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