Skip to main content
Deprecated (v1). Previous contract, kept only as a historical reference. The current version is order.reversed — v2.
order.reversed fires when SEFAZ confirms the cancellation of a fiscal document (NFC-e or NF-e) that had been previously authorized. It is the SEFAZ-confirmed counterpart to order.cancelled: the order is cancelled first inside Fire (firing order.cancelled), Fire then requests cancellation at SEFAZ via your fiscal provider, and order.reversed fires only when SEFAZ stamps the cancellation protocol.

Trigger condition

Fire emits order.reversed once per fiscal cancellation, the first time all of these are true:
  • The order is in a store with fiscal billing enabled (storeFiscalConfig.enabled === true)
  • A fiscal document had been previously authorized (i.e. order.invoiced was emitted earlier)
  • A cancellation request was submitted to your fiscal provider
  • your fiscal provider reports the fiscal authority’s confirmation of the cancellation

What’s in trigger.data

Same V4 order snapshot as order.cancelled — including the same cancellation audit block — with an extra sefazCancellation sub-object inside cancellation.metadata.fiscal. That’s the only structural difference. status is "CANCELLED". The order is the same one referenced by the earlier order.cancelled event for the same orderId.

Example — real production payload (BR, sanitized)

data.cancellation.metadata.fiscal.sefazCancellation reference

This is the only block that’s unique to order.reversed. Every other field is shared with order.cancelled — see that page for the cancellation audit fields.
object
SEFAZ confirmation of the cancellation. Present only after SEFAZ has stamped the cancellation protocol.

Lifecycle

For a Brazilian fiscal-enabled order, expect the four events above. For Brazilian orders without fiscal authorization (because the order was cancelled before fiscal emission, or fiscal was disabled), only order.cancelled fires — no order.reversed.

Handler example

Common pitfalls

  • Don’t process order.reversed without order.cancelled first. They fire in order in normal flow, but out-of-order delivery is possible. If you receive order.reversed for an orderId you don’t have a cancellation record for, log it and create the record from this event’s cancellation block — don’t drop the event.
  • sefazCancellation.date and cStat may be null in sandbox. Don’t make production-readiness depend on them being present in dev environments.
  • The cancellation XML URL is distinct from the original document XML. Make sure your archival logic stores both — you’ll need them for audit.
  • Same cancellation.cancellationId as order.cancelled. Both events for the same cancellation share the cancellation ID — useful as a join key when correlating the two events in your system.
  • No event for failed SEFAZ cancellation. If SEFAZ rejects the cancellation request, no event fires. Monitor the dashboard’s executions log for those cases.

order.cancelled

Fires before this event — the cancellation itself.

order.invoiced

The earlier event that established the fiscal document being cancelled here.