| Row | eventKey | reversesEventKey | Amount columns | _op columns |
|---|---|---|---|---|
| Original | New and unique | blank | a non-negative amount | add |
| Cancellation | New and unique | the original's eventKey | blank | blank |
eventKey. An original and its cancellation must pass through the same workflow.eventKey, so a replayed event never reaches the workflow.processingMode: reversible is the switch. identifier is the community's active identifier field, for example email, or a custom identifier when that field is the lookup key.eventKey, reversesEventKey, and optionally eventType, account_id, trade_id, tradeStatus, occurredAt, plus Total XP, Total XP_op, Total Coins, Total Coins_op. Any other header fails the whole job. Custom user fields cannot be written by a reversible node, so a second standard-mode step is needed for those.options.inputs and its source in options.sourceCode.code.eventKey derived from the source event, reversesEventKey for a cancellation, and the amount columns.account_id or trade_id is present, the original and its cancellation must carry the same values, derived from the same source fields.POST /{workflowId}/nodes and read the workflow back to confirm what was stored:eventKey you chose, read the output, and only then dry-run the rest. See the playbook Code steps through the API.simulated, and wouldDo carries rowCount, a small sample, the payload format, the processing mode and the identifier. Nothing is uploaded and no job is created.simulated with no output, and every step after it is failed with UNRESOLVED_SIMULATED_REFERENCE. Live-test the builder alone first, then read this trace as the evidence for the bulk step and the router.applied with the expected change.reversesEventKey is the original's eventKey.applied with a negative change equal to what was applied.skipped, and the member's value must not move.skipped, not re-awarded. A cancellation whose original was never applied fails as unresolved and changes nothing.| What you see | What it means | What to do |
|---|---|---|
| Job failed, every row unreachable | A header the reversible mode does not accept | Use only the documented headers. |
Row unresolved | The cancellation arrived before its original completed, or in a different workflow | Send it in a later batch, through the same workflow. |
Row skipped on a cancellation | A second cancellation of the same original | Nothing to do; the ledger is correct. |
| Row failed with a different-amounts message | The same original eventKey arrived again with different inputs | Use one eventKey per exact reward. |
Event ingest skipped | A duplicate batch or record id | Send a new cancellation eventKey rather than reusing the failed one. |