Events

Compensation End Event

Ends the path while triggering compensation of previously completed activities. Thick circle with rewind arrows.

The Compensation End Event is the closing counterpart of the compensation throw: as its final act, the path demands the undo of earlier completed work. Typical in failure-wrap-up branches: *we're done here — and roll back what was built*.

When to use and avoid

When to use

  • To end rejection/abort paths that must also undo prior steps.

  • In saga-style flows without a formal transaction construct.

  • When 'finish' and 'compensate' coincide — no extra steps after the undo request.

When NOT to use

  • Mid-flow, with work still to do after compensating — that is the intermediate Compensation Throw.

  • When nothing completed needs undoing.

  • Inside a transaction that will be cancelled anyway — the Cancel End already compensates.

Business example

Ending a rejected request and undoing its bookings

Diagrama BPMN: Ending a rejected request and undoing its bookings
Ending a rejected request and undoing its bookings

Open this example in the HEFLO process editor and explore the diagram from the inside.

Open in the HEFLO editor →

Step by step

  1. Book hotel completed earlier and registered its undo handler.
  2. Payment is declined; the flow takes the rejection branch.
  3. The compensation trigger (highlighted) invokes the handlers — the booking is cancelled — and the path ends as rejected. In a pure ending form, the same trigger is drawn as a thick-bordered Compensation End Event.

Differences

Compensation End vs Compensation Throw (intermediate)

Same trigger, different position: the intermediate throw compensates and continues; the end compensates and finishes the path. Choose by whether anything follows the undo.

FAQ

Can it target one specific activity?

Yes — a compensation event may reference a single activity to compensate, instead of the default 'everything completed in scope'.

Does it wait for the handlers to finish?

Conceptually the compensation is performed as part of the event's semantics — handlers run before the scope truly closes.

Related elements