Skip to content

BPMN 2.0 Notation

BPMN stands for Business Process Model and Notation. Version 2.0 is an industry standard for both modeling and executing processes. OMG, the standards body behind it, calls it a de-facto standard notation. Stakeholders can use it directly, and it does not depend on any implementation environment.

Sequence flow. This is the core idea. A sequence flow defines the order in which the steps of a process happen.

Tasks. Tasks are the basic elements. Each is an atomic unit of work, meaning one step that is not split further. Tasks combine to produce a meaningful result.

Events. A process can react to events. These are catching events. It can also emit events. These are throwing events.

Boundary events. A boundary event models what should happen if something occurs while an activity is running. It must be an intermediate catch event. If it is interrupting, it ends the activity it is attached to once it triggers. See the article Boundary Event.

Gateways. A gateway routes tokens in more complex patterns than plain sequence flow. A token marks the current position of a running process.

  • The event-based gateway waits until one of its events fires. It then follows that event’s flow, and the other events cannot fire afterward. Its outgoing flows must lead to intermediate catch events. In Camunda, these are timer, message, or signal events.
  • The inclusive (OR) gateway follows every outgoing flow whose condition is true. If none is true, it uses the default flow.

An order process starts when an order arrives. A task checks stock. An inclusive gateway then looks at the order. If the customer wants gift wrapping and express delivery, both tasks start. If neither applies, the default flow goes straight to shipping. While the stock check runs, an interrupting boundary event for a cancellation message can stop it.

The facts here cover only the basic elements. They do not describe every BPMN element or variant. The event-based gateway limits its outgoing flows to catch events, which keeps its behavior clear but restricts where it fits. An interrupting boundary event ends the running activity, so any work in progress there stops.

Order process with an inclusive gateway and an interrupting boundary event.

Diagram source
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" targetNamespace="http://example.com/bpmn">
<process id="order" isExecutable="false">
<startEvent id="start" name="Order received">
<outgoing>f1</outgoing>
</startEvent>
<task id="check" name="Check stock">
<incoming>f1</incoming>
<outgoing>f2</outgoing>
</task>
<boundaryEvent id="cancel" name="Cancellation message" attachedToRef="check">
<outgoing>f9</outgoing>
<messageEventDefinition />
</boundaryEvent>
<inclusiveGateway id="split" default="fDefault">
<incoming>f2</incoming>
<outgoing>f3</outgoing>
<outgoing>f4</outgoing>
<outgoing>fDefault</outgoing>
</inclusiveGateway>
<task id="wrap" name="Gift wrap">
<incoming>f3</incoming>
<outgoing>f5</outgoing>
</task>
<task id="express" name="Arrange express delivery">
<incoming>f4</incoming>
<outgoing>f6</outgoing>
</task>
<task id="ship" name="Ship order">
<incoming>f7</incoming>
<outgoing>f8</outgoing>
</task>
<inclusiveGateway id="join">
<incoming>fDefault</incoming>
<incoming>f5</incoming>
<incoming>f6</incoming>
<outgoing>f7</outgoing>
</inclusiveGateway>
<endEvent id="done" name="Order shipped">
<incoming>f8</incoming>
</endEvent>
<endEvent id="cancelled" name="Order cancelled">
<incoming>f9</incoming>
</endEvent>
<sequenceFlow id="f1" sourceRef="start" targetRef="check" />
<sequenceFlow id="f2" sourceRef="check" targetRef="split" />
<sequenceFlow id="f3" name="gift" sourceRef="split" targetRef="wrap">
<conditionExpression>gift</conditionExpression>
</sequenceFlow>
<sequenceFlow id="f4" name="express" sourceRef="split" targetRef="express">
<conditionExpression>express</conditionExpression>
</sequenceFlow>
<sequenceFlow id="fDefault" sourceRef="split" targetRef="join" />
<sequenceFlow id="f5" sourceRef="wrap" targetRef="join" />
<sequenceFlow id="f6" sourceRef="express" targetRef="join" />
<sequenceFlow id="f7" sourceRef="join" targetRef="ship" />
<sequenceFlow id="f8" sourceRef="ship" targetRef="done" />
<sequenceFlow id="f9" sourceRef="cancel" targetRef="cancelled" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_order">
<bpmndi:BPMNPlane id="BPMNPlane_order" bpmnElement="order">
<bpmndi:BPMNShape id="BPMNShape_start" bpmnElement="start">
<dc:Bounds x="80" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="68" y="143" width="60" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_check" bpmnElement="check">
<dc:Bounds x="216" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_split" bpmnElement="split" isMarkerVisible="true">
<dc:Bounds x="552" y="95" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_wrap" bpmnElement="wrap">
<dc:Bounds x="702" y="240" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_express" bpmnElement="express">
<dc:Bounds x="702" y="400" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_ship" bpmnElement="ship">
<dc:Bounds x="1052" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_join" bpmnElement="join" isMarkerVisible="true">
<dc:Bounds x="902" y="95" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_done" bpmnElement="done">
<dc:Bounds x="1252" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1244" y="143" width="53" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_cancelled" bpmnElement="cancelled">
<dc:Bounds x="416" y="262" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="401" y="303" width="67" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_cancel" bpmnElement="cancel">
<dc:Bounds x="248" y="142" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="161" y="183" width="90" height="28" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="BPMNEdge_f1" bpmnElement="f1">
<di:waypoint x="116" y="120" />
<di:waypoint x="216" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f2" bpmnElement="f2">
<di:waypoint x="316" y="120" />
<di:waypoint x="552" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_fDefault" bpmnElement="fDefault">
<di:waypoint x="602" y="120" />
<di:waypoint x="902" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f7" bpmnElement="f7">
<di:waypoint x="952" y="120" />
<di:waypoint x="1052" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f8" bpmnElement="f8">
<di:waypoint x="1152" y="120" />
<di:waypoint x="1252" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f3" bpmnElement="f3">
<di:waypoint x="577" y="145" />
<di:waypoint x="577" y="280" />
<di:waypoint x="702" y="280" />
<bpmndi:BPMNLabel>
<dc:Bounds x="624" y="258" width="32" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f4" bpmnElement="f4">
<di:waypoint x="577" y="145" />
<di:waypoint x="577" y="440" />
<di:waypoint x="702" y="440" />
<bpmndi:BPMNLabel>
<dc:Bounds x="582" y="353" width="53" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f5" bpmnElement="f5">
<di:waypoint x="802" y="280" />
<di:waypoint x="927" y="280" />
<di:waypoint x="927" y="145" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f6" bpmnElement="f6">
<di:waypoint x="802" y="440" />
<di:waypoint x="927" y="440" />
<di:waypoint x="927" y="145" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_f9" bpmnElement="f9">
<di:waypoint x="266" y="178" />
<di:waypoint x="266" y="280" />
<di:waypoint x="416" y="280" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
  • Each process model uses sequence flow to show the order of steps.
  • Every outgoing flow of an event-based gateway leads to an intermediate catch event.
  • Boundary events are modeled as intermediate catch events, and each is marked as interrupting or not on purpose.
  • Inclusive gateways have conditions on their outgoing flows and a default flow.