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, ornull. 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:nullwith a discount (a catalog markdown, no coupon), and a code withdiscountValue: "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.scopeisproduct,orderorshipping, andmetadata.amountis the money it took off. A coupon withscope: "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.discountValueis 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 oforderLines[].discountValuecounts 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, onull. 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:nullcon descuento (una rebaja de catálogo, sin cupón) y un código condiscountValue: "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.scopeesproduct,orderoshipping, ymetadata.amountes la plata que descontó. Un cupón conscope: "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.discountValuees 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 deorderLines[].discountValuecuenta 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, ounull. 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:nullcom desconto (uma remarcação de catálogo, sem cupom) e um código comdiscountValue: "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,orderoushipping, emetadata.amounté o dinheiro que ele descontou. Um cupom comscope: "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 deorderLines[].discountValueconta 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