Intermediate Event
Explanation
Section titled “Explanation”An intermediate event is an event placed in the middle of a process, not at its start or end. For the general idea of events, see the article BPMN Event.
Throwing and catching
The inner icon shows the direction. A throwing event has an icon filled with black. A catching event has a white, unfilled icon.
- A throwing event fires a trigger when execution reaches it.
- A catching event waits for a trigger when execution reaches it.
Message events follow the same rule. The message catch icon is white to show that it catches.
What waiting means
A catching event stops the token until the awaited event occurs. The token marks where the process instance currently is. For a message, the engine creates a subscription. The instance then waits until the message is correlated, meaning matched to it.
Waiting for several messages
To wait for several messages and merge them, combine receive tasks with a parallel gateway. A receive task is a task that waits for a message.
Where an event sits
An intermediate event can sit in the normal sequence flow. It can also sit on the edge of an activity that it may interrupt. Then it is a boundary event. Boundary events always catch and never throw. See the article Boundary Event.
Which types can catch or throw
Some types are restricted:
- Timer and conditional events can only catch.
- Link events are used only as intermediate events. See the article Link Event.
- A catching error event must be attached to an activity.
Waiting for one of several events
An event-based gateway routes by which event happens next, not by data. The instance waits at the gateway until one event triggers. Then the others can no longer fire. See the article Event-Based Gateway.
Example
Section titled “Example”A process sends an order confirmation, then waits for the customer’s payment message. The send step is a throwing message event with a filled envelope. The wait step is a catching message event with a white envelope. The token stays at the white envelope until the payment message arrives. Then the process continues.
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"> <message id="msgConfirm" name="Order confirmation" /> <message id="msgPayment" name="Payment" /> <process id="p1" isExecutable="false"> <startEvent id="s" name="Order received"> <outgoing>f1</outgoing> </startEvent> <intermediateThrowEvent id="t" name="Send confirmation"> <incoming>f1</incoming> <outgoing>f2</outgoing> <messageEventDefinition messageRef="msgConfirm" /> </intermediateThrowEvent> <intermediateCatchEvent id="c" name="Payment received"> <incoming>f2</incoming> <outgoing>f3</outgoing> <messageEventDefinition messageRef="msgPayment" /> </intermediateCatchEvent> <endEvent id="e" name="Order paid"> <incoming>f3</incoming> </endEvent> <sequenceFlow id="f1" sourceRef="s" targetRef="t" /> <sequenceFlow id="f2" sourceRef="t" targetRef="c" /> <sequenceFlow id="f3" sourceRef="c" targetRef="e" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_p1"> <bpmndi:BPMNPlane id="BPMNPlane_p1" bpmnElement="p1"> <bpmndi:BPMNShape id="BPMNShape_s" bpmnElement="s"> <dc:Bounds x="80" y="80" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="68" y="121" width="60" height="28" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="BPMNShape_t" bpmnElement="t"> <dc:Bounds x="216" y="80" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="192" y="121" width="84" height="42" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="BPMNShape_c" bpmnElement="c"> <dc:Bounds x="352" y="80" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="340" y="121" width="60" height="28" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="BPMNShape_e" bpmnElement="e"> <dc:Bounds x="488" y="80" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="470" y="121" width="73" height="14" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="BPMNEdge_f1" bpmnElement="f1"> <di:waypoint x="116" y="98" /> <di:waypoint x="216" y="98" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="BPMNEdge_f2" bpmnElement="f2"> <di:waypoint x="252" y="98" /> <di:waypoint x="352" y="98" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="BPMNEdge_f3" bpmnElement="f3"> <di:waypoint x="388" y="98" /> <di:waypoint x="488" y="98" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram></definitions>Checks
Section titled “Checks”- Catching events use an unfilled icon and throwing events use a filled icon, consistently across the diagrams.
- Boundary events are modeled only as catching events.
- Timer and conditional events are modeled as catching events only.
- Waiting for several messages uses receive tasks combined with a parallel gateway.
Related
Section titled “Related”Sources
Section titled “Sources”- BPMN 2.0 Constructs · Flowable Open Source Documentation — flowable.com, accessed 2026-11-09
- Overview | Camunda 8 Docs — docs.camunda.io, accessed 2026-11-08
- BPMN 2.0 Symbols - A complete guide with examples. | Camunda — camunda.com, accessed 2026-11-09
- Event-based gateway | Camunda 8 Docs — docs.camunda.io, accessed 2026-11-08
- Message events | Camunda 8 Docs — docs.camunda.io, accessed 2026-11-09
- BPMN and Microservices Orchestration, Part 1 of 2 | Camunda — camunda.com, accessed 2026-11-09