- v1 · actual
- v0 · deprecado
Contrato actual (v1). El snapshot de orden sigue el contrato v1 de
order.cancelled — descuentos, impuestos granulares, enum itemType, deliveryConfirmationCode — más el bloque cancellation y los datos sefazCancellation.order.reversed dispara cuando SEFAZ confirma la cancelación de un documento fiscal (NFC-e o NF-e) que había sido previamente autorizado. Es la contraparte SEFAZ-confirmada de order.cancelled: la orden se cancela primero dentro de Fire (disparando order.cancelled), Fire después pide la cancelación en SEFAZ vía tu proveedor fiscal, y order.reversed dispara solo cuando SEFAZ estampa el protocolo de cancelación.
Condición de disparo
Fire emiteorder.reversed una vez por cancelación fiscal, la primera vez que todo lo siguiente es verdadero:
- La orden está en una tienda con facturación fiscal habilitada (
storeFiscalConfig.enabled === true) - Un documento fiscal había sido previamente autorizado (es decir,
order.invoicedse emitió antes) - Se envió una solicitud de cancelación a tu proveedor fiscal
- tu proveedor fiscal reporta que la autoridad fiscal confirmó la cancelación
| Cobertura | Todos los países — el país viaja en fiscal.countryCode |
| Llave de idempotencia | event.id |
| Dispara más de una vez | No, salvo en reintentos |
Latencia relativa a order.cancelled | Usualmente segundos; puede ser minutos si la autoridad fiscal está degradada |
| Precondición | Un order.invoiced previo para el mismo orderId |
Qué hay en trigger.data
Mismo snapshot V4 que order.cancelled — incluyendo el mismo bloque cancellation de auditoría — con un sub-objeto extra sefazCancellation dentro de cancellation.metadata.fiscal. Esa es la única diferencia estructural.
status es "CANCELLED". La orden es la misma referenciada por el evento order.cancelled previo del mismo orderId.
Ejemplo — payload real de producción (BR, sanitizado)
Referencia de data.cancellation.metadata.fiscal.sefazCancellation
Este es el único bloque que es único de order.reversed. Cada otro campo se comparte con order.cancelled — consulta esa página para los campos de auditoría de cancelación.
Confirmación SEFAZ de la cancelación. Presente solo después de que SEFAZ haya estampado el protocolo de cancelación.
Lifecycle
Para una orden brasileña fiscal-enabled, espera los cuatro eventos arriba. Para órdenes brasileñas sin autorización fiscal (porque la orden se canceló antes de la emisión fiscal, o fiscal estaba deshabilitado), solo disparaorder.cancelled — no order.reversed.
Handler de ejemplo
Errores comunes
- No proceses
order.reversedsinorder.cancelledprimero. Disparan en orden en flujo normal, pero entrega fuera de orden es posible. Si recibesorder.reversedpara unorderIdque no tienes registrado como cancelado, loguéalo y crea el registro desde el bloquecancellationde este evento — no botes el evento. sefazCancellation.dateycStatpueden sernullen sandbox. No hagas que la production-readiness dependa de que estén presentes en entornos dev.- El XML URL de cancelación es distinto del XML del documento original. Asegúrate que tu lógica de archivado guarde ambos — los necesitarás para auditoría.
- Mismo
cancellation.cancellationIdqueorder.cancelled. Ambos eventos para la misma cancelación comparten el cancellation ID — útil como llave de join cuando correlacionas los dos eventos en tu sistema. - No hay evento para cancelación SEFAZ fallida. Si SEFAZ rechaza la solicitud de cancelación, no dispara evento. Monitorea el log de ejecuciones del dashboard para esos casos.
Eventos relacionados
order.cancelled
Dispara antes de este evento — la cancelación misma.
order.invoiced
El evento previo que estableció el documento fiscal que se cancela acá.

