Skip to main content
Você está lendo o contrato atual (v2.2) de order.cancelled. v2.2 adiciona data.fiscalRepresentation: a numeração fiscal que o ponto de venda obteve antes de injetar o pedido. Viaja sempre: em null quando não se tentou numerar, e preenchido quando sim — numberingStatus diz como terminou. Trazer conteúdo não significa que o comprovante esteja autorizado. Apenas aditivo — nada do que você já lia mudou.O bloco carrega o documento fiscal vigente do pedido: os campos que significam o mesmo em qualquer país no topo, os identificadores do órgão dentro de countryData no vocabulário do seu país, e os documentos anteriores em history. Quando um cancelamento numera, a nota de crédito passa ao topo e a de venda desce para o histórico — com compensates apontando para ela.
order.cancelled dispara quando um pedido previamente injetado é cancelado — pela UI do backoffice do Fire, um adaptador externo ou uma chamada à API de cancelamento. Não retrai um order.completed anterior do mesmo pedido; ambos os eventos são emitidos independentes.

Condição de disparo

O Fire emite order.cancelled uma vez quando o status de um pedido transiciona para CANCELLED, independente do estado de pagamento anterior. O cancelamento é registrado com contexto completo de auditoria (quem, quando, por quê, fonte).

O que tem em trigger.data

Mesmo snapshot V4 que order.completed — todos os campos documentados lá estão presentes aqui, com três diferenças:
  1. status é "CANCELLED" (não "COMPLETED").
  2. paymentStatus permanece igual a quando o pedido foi completado (tipicamente "SUCCEEDED" se o pedido tinha sido pago antes do cancelamento).
  3. Um novo bloco top-level cancellation carrega a metadata de auditoria.

Exemplo — payload real de produção (BR, sanitizado)

Referência de data.cancellation

object
Bloco de auditoria que descreve como, quando e por quem o pedido foi cancelado.

Lifecycle relativo a outros eventos

Para um pedido brasileiro fiscal-enabled que é cancelado, espere esta sequência:
  • order.cancelled é emitido imediatamente quando o cancelamento acontece, antes de contatar qualquer autoridade fiscal externa.
  • order.reversed é emitido depois — uma vez que a SEFAZ confirma via seu provedor fiscal. Pode chegar segundos ou minutos após order.cancelled, dependendo do tempo de resposta da SEFAZ.
  • Para pedidos não brasileiros ou lojas sem emissão fiscal, apenas order.cancelled dispara.

Variações por país

order.cancelled é global — dispara para todos os países e todos os canais quando um pedido é cancelado (Argentina, Brasil, Chile, Colômbia, Equador, Venezuela e qualquer outro país com Integration Flows ativos). O bloco de auditoria de cancelamento (cancellation.{cancellationId, cancelledAt, cancelledBy, cancellationReason, cancellationSource}) é idêntico em todos os países. O único campo específico por país é cancellation.metadata.fiscal, que é populado apenas para lojas brasileiras que tinham um documento fiscal previamente autorizado (ou seja, um order.invoiced foi emitido para este pedido antes). Para todos os demais países — e para pedidos BR cancelados antes da autorização fiscal — cancellation.metadata.fiscal é null e nenhum evento order.reversed seguirá. Para lojas não-BR (Argentina, Chile, Colômbia, Equador, Venezuela, outras), o bloco cancellation fica assim:
Cancelamento não-BR
Os identificadores a nível de loja em data.store variam por país — veja order.completed → Variações por país para country.code, currencyCode e storeFiscalConfig.govIdType (CNPJ / CUIT / RUT / NIT / RUC / RIF) por país.

Handler de exemplo

data.policy e data.lastKnown

Todos os eventos de pedido carregam estes dois blocos, não só este. Foram adicionados junto com o ciclo de pagamento diferido e são adicionados na v2.1, aditivos: consumidores existentes continuam funcionando sem alteração.
O detalhe campo a campo está em order.opened, o evento onde estes blocos mais importam.

Erros comuns

  • status === "CANCELLED", não paymentStatus. Pedidos pagos cancelados mantêm paymentStatus === "SUCCEEDED"; o cancelamento vive no campo status mais o bloco cancellation.
  • order.cancelled ≠ refund. O Fire reporta o cancelamento; o refund (se houver) é iniciado pelo canal/processador e não está neste payload.
  • Não assuma que order.completed chegou primeiro. Entrega fora de ordem é possível — seu handler deveria tolerar receber order.cancelled para um orderId que ainda não conhece (ex.: log + cria um placeholder; reconcilia quando order.completed chegar).
  • cancellation.metadata.fiscal é o doc original, não o resultado do cancelamento. Para a confirmação SEFAZ, escute order.reversed.

Eventos relacionados

order.completed

O evento que você verá para o mesmo pedido antes do cancelamento.

order.reversed

Apenas Brasil — dispara quando a SEFAZ confirma o cancelamento.

data.fiscalRepresentation

A numeração fiscal que o ponto de venda obteve antes de injetar o pedido: cobra, pede os identificadores, imprime o comprovante e só então injeta. Por isso viaja no pedido e não em um evento fiscal separado — quando o pedido nasce, isso já aconteceu.
A presença deste bloco NÃO significa que o comprovante esteja autorizado. São os números impressos no caixa; o veredito do órgão está em lastKnown.fiscal.status. Um ticket que diga “autorizado” só porque o bloco está presente declara algo que pode não ter acontecido.
A chave viaja sempre. Chega em null quando não se tentou numerar — agregadores, países sem representação fiscal, ou comércios com a numeração desativada — e traz o bloco quando houve tentativa. Trazer o bloco significa que se tentou numerar, não que foi numerado: numberingStatus diz como a tentativa terminou, e failure por quê quando não terminou bem. Ramifique pelo valor, não pela presença da chave:
O veredicto do órgão não o altera. O que o cliente levou impresso não muda porque o órgão depois autorize ou rejeite — para isso existe lastKnown.fiscal, que é o que de fato se move. O que o substitui é um documento novo. O bloco carrega o documento fiscal vigente do pedido. Enquanto houve apenas um, era sempre a nota de venda; quando um cancelamento produz uma nota de crédito, é ela que fica no topo — documentType diz qual é — e a nota de venda desce para history, inteira e com seus próprios identificadores do órgão. Não se perde: se move. compensates aponta para ela pelo número, então a relação fica explícita.

Quando a numeração falha

Uma venda pode ser cobrada e ficar sem comprovante fiscal. Esse caso também viaja, e precisa ser tratado: os identificadores vêm null e o motivo em failure.
Ramifique por failure.scope:
  • TECHNICAL — imprima “em trâmite” e siga. Pode se resolver sozinho.
  • FUNCTIONAL — há um dado errado e repetir não resolve. Precisa correção. O que muda é lastKnown.fiscal.
lastKnown.fiscal.sourceEvent agora informa a procedência real. Antes era deduzida do status, e um processing semeado na injeção era reportado como fiscal.callback sem que nenhum callback tivesse ocorrido. Esse caso agora diz order.injected. Se você ramifica por este campo, contemple o valor novo.