- v1 · current
- v0 · deprecated
You’re viewing the current (v1) contract. The order snapshot carried here follows the v1
order.cancelled contract — order/product discounts, granular taxes, full itemType enum, deliveryConfirmationCode — plus the cancellation audit block and the SEFAZ sefazCancellation data.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 emitsorder.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.invoicedwas emitted earlier) - A cancellation request was submitted to your fiscal provider
- your fiscal provider reports the fiscal authority’s confirmation of the cancellation
| Coverage | All countries — the country travels in fiscal.countryCode |
| Idempotency key | event.id |
| Fires more than once | No, unless retried |
Latency relative to order.cancelled | Usually seconds; can be minutes if the fiscal authority is degraded |
| Precondition | A previous order.invoiced for the same orderId |
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.
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), onlyorder.cancelled fires — no order.reversed.
Handler example
Common pitfalls
- Don’t process
order.reversedwithoutorder.cancelledfirst. They fire in order in normal flow, but out-of-order delivery is possible. If you receiveorder.reversedfor anorderIdyou don’t have a cancellation record for, log it and create the record from this event’scancellationblock — don’t drop the event. sefazCancellation.dateandcStatmay benullin 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.cancellationIdasorder.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.
Related events
order.cancelled
Fires before this event — the cancellation itself.
order.invoiced
The earlier event that established the fiscal document being cancelled here.

