Fire Docs

Archives
Log in
Subscribe
September 4, 2026

4 September 2026 — Coupons on order lines

Orders can now arrive with coupons. order.completed carries who financed each discount, on the line and on the order.

  • orderLines[].rewardId — the coupon’s redemption code, or null. Selected modifiers carry it too: on a combo the discount usually sits on the modifiers, not on the container. Two shapes are both valid and neither is a bug: null with a discount (a catalog markdown, no coupon), and a code with discountValue: "0" (the coupon changed the list price instead of discounting it).
  • data.marketing.coupons[] — was reserved for future use; now carries { rewardId, name, metadata } per coupon. metadata.scope is product, order or shipping, and metadata.amount is the money it took off. A coupon with scope: "order" appears only here: its amount reaches the lines already spread across them, and nothing links the slices back to it.

Warning On kiosk orders totals.discountValue is the total across every level — the order coupon and the per-line discounts together, because the source spreads the order coupon into the lines before sending. Adding it to the sum of orderLines[].discountValue counts the same money twice. Use one or the other, not both.

value in a coupon’s metadata is the rule’s nominal figure — a percentage, or points — not currency. The money is always amount. And baseValue: null means the list price is unknown, which is not the same as zero.

Event Version
order.completed v1 → v1.1

Backwards compatible: both fields are additions on the existing shape, and rewardId is null on every channel that does not send coupons.

Updated in EN / ES / PT.


Español

4 de septiembre de 2026 — Cupones en las líneas de la orden

Las órdenes ya pueden llegar con cupones. order.completed lleva quién financió cada descuento, en la línea y en la orden.

  • orderLines[].rewardId — el código de canje del cupón, o null. Los modificadores seleccionados también lo llevan: en un combo el descuento suele estar en los modificadores, no en el contenedor. Hay dos formas válidas y ninguna es un error: null con descuento (una rebaja de catálogo, sin cupón) y un código con discountValue: "0" (el cupón cambió el precio de lista en vez de descontar).
  • data.marketing.coupons[] — estaba reservado para uso futuro; ahora lleva { rewardId, name, metadata } por cupón. metadata.scope es product, order o shipping, y metadata.amount es la plata que descontó. Un cupón con scope: "order" aparece solo acá: su monto llega a las líneas ya repartido entre ellas y nada une las porciones con él.

Warning En órdenes de kiosco totals.discountValue es el total de todos los niveles — el cupón de orden y los descuentos de línea juntos, porque el origen reparte el cupón de orden dentro de las líneas antes de enviar. Sumarlo con la suma de orderLines[].discountValue cuenta la misma plata dos veces. Usá uno u otro, no los dos.

El value de un cupón es el valor nominal de la regla — un porcentaje, o puntos —, no moneda. La plata siempre está en amount. Y baseValue: null significa que no se conoce el precio de lista, que no es lo mismo que cero.

Evento Versión
order.completed v1 → v1.1

Retrocompatible: los dos campos son agregados sobre la forma existente, y rewardId llega en null en todo canal que no manda cupones.

Actualizado en EN / ES / PT.


Português

4 de setembro de 2026 — Cupons nas linhas do pedido

Os pedidos já podem chegar com cupons. order.completed leva quem financiou cada desconto, na linha e no pedido.

  • orderLines[].rewardId — o código de resgate do cupom, ou null. Os modificadores selecionados também o levam: num combo o desconto costuma estar nos modificadores, não no contêiner. Há duas formas válidas e nenhuma é erro: null com desconto (uma remarcação de catálogo, sem cupom) e um código com discountValue: "0" (o cupom mudou o preço de tabela em vez de descontar).
  • data.marketing.coupons[] — estava reservado para uso futuro; agora leva { rewardId, name, metadata } por cupom. metadata.scope é product, order ou shipping, e metadata.amount é o dinheiro que ele descontou. Um cupom com scope: "order" aparece apenas aqui: o seu valor chega às linhas já distribuído entre elas e nada liga as parcelas a ele.

Warning Em pedidos de quiosque totals.discountValue é o total de todos os níveis — o cupom de pedido e os descontos de linha juntos, porque a origem distribui o cupom de pedido dentro das linhas antes de enviar. Somá-lo com a soma de orderLines[].discountValue conta o mesmo dinheiro duas vezes. Use um ou outro, não os dois.

O value de um cupom é o valor nominal da regra — uma porcentagem, ou pontos —, não moeda. O dinheiro está sempre em amount. E baseValue: null significa que o preço de tabela não é conhecido, o que não é o mesmo que zero.

Evento Versão
order.completed v1 → v1.1

Retrocompatível: os dois campos são adições sobre a forma existente, e rewardId chega como null em todo canal que não envia cupons.

Atualizado em EN / ES / PT.


Read the full changelog · Ver el registro completo · Ver o registro completo

Don't miss what's next. Subscribe to Fire Docs:
← Newer 15 September 2026 — Structured fiscal block and new fiscal event versions Older → 3 September 2026 — KDS Fire credentials, ticket rows, and station categories
Powered by Buttondown, the easiest way to start and grow your newsletter.