Learning material · OFL-1.1

BPMN 2.0 Reference

Participants

Pool
Participant
Lane
Lane

Pool

Container for a process. A participant in an interaction. Pools exchange data only via message flows. Can be collapsed to hide details.

Pool with lanes: orchestration model
Pool as a “conductor”: one coordinating process dispatches tasks to participants
Collaboration: two pools exchange messages
Collaboration: independent pools (customer and pizzeria) connected by message flows

Lane

A band inside a pool that shows who performs the tasks (a job title, role, department, or IT system).

Lanes: tasks split by roles
Lanes inside the “shared flat” pool — tasks split among the flatmates (Christian, Falko, Robert); an XOR gateway picks what to cook

Activities

Task types

Abstract
Task (None)
Manual
Manual
User
User Task
Send
Send Task
Receive
Receive Task
Script
Script Task
Service
Service Task
Business Rule
Business Rule

Abstract (None Task)

Type is not specified. Used in early modelling when the execution method is not yet decided, or when it is irrelevant for the diagram's goal. Essentially a placeholder that is later refined into a concrete type.

User Task

Performed by a human via a software interface: a CRM form, a screen in a web app, an item in a task manager. The key difference from a manual task is that the person works inside the system that tracks the task's status.

Examples: approve a request in the system, fill in a form, review a document in a self-service portal.

Manual Task

Performed by a human without involvement of the BPM engine. The system cannot automatically detect when this work starts or ends.

Examples: physically sign a document, call a client on the phone, hold an in-person meeting, deliver a parcel by courier.

Service Task

Executed automatically by a program or a service. No human is involved. The most common task type in executable processes.

Examples: an HTTP request to an API, a database write, a microservice call, running a calculation.

Send Task

Sends a message to a specific external participant (another process or system) and finishes immediately, without waiting for a reply. A fire-and-forget pattern.

Examples: send an e-mail to a client, publish an event to a message queue, send a notification via webhook.

Receive Task

Waits for an inbound message from an external participant. The process pauses at this task until the message arrives.

A special variant is the instantiated Receive: if such a task is the first step in a process, receiving the message itself spawns a new process instance (an alternative to a message start event).

Examples: waiting for a counterparty's reply, waiting for a callback from a payment provider, waiting for a delivery confirmation.

Script Task

Runs an embedded script (code) defined directly inside the process model. Unlike a service task, the code does not call any external system — it runs inside the BPM engine.

Examples: convert a data format, compute a deadline, build a string for an e-mail, check a condition.

Business Rule Task

Invokes a decision engine (e.g. a DMN table). Inputs are fed into a rule set, and a decision is returned.

Examples: determine a discount by customer tier, calculate an insurance premium, check a request against a policy, classify an inquiry.
All BPMN task types on a single diagram
Overview of all task types: abstract, manual, user, receive, send, script, service, business rule

Task markers

Small icons in the centre of the bottom of a task rectangle. They indicate the task's behaviour — not its type.

Loop
Loop
Multi-inst. ∥
Parallel MI
Multi-inst. ≡
Sequential MI
Compensation
Compensation
Ad-hoc ~
Ad-hoc
Subprocess +
Subprocess
MarkerMeaningExample
↻ LoopThe task repeats while a condition holds (one instance, several iterations)Revise a document → submit → if rejected, repeat
∥ Parallel multi-instanceN instances start at the same time — one per item in the collectionSend the notification to every approver at the same time
≡ Sequential multi-instanceSame N instances, but one after anotherInterview each candidate in turn
⏪ CompensationA rollback task: runs only when compensation is triggered, to undo an action that has already completed“Cancel booking” after “Book hotel” has already completed
~ Ad-hocTasks inside the subprocess run in any order, can be repeated or skipped; start and end events are not allowed insideFree choice of steps during a client consultation
+ SubprocessA composite activity with a hidden internal sequence; flows cannot cross its boundary“Order processing” hides 10 internal steps
Loop marker on a task
Loop marker (↻): the task repeats until a condition is met
Multi-instance marker on a task
Parallel multi-instance (∥): “choose pizza” runs one instance per roommate at the same time
Compensation marker on a task
Compensation marker (⏪): a rollback task that runs when a completed action is undone

Subprocess

A composite activity marked with “+”. Contains its own sequence of steps. Flows cannot cross its boundary. Intermediate events attach to the boundary.

Subprocess: hidden complexity
A subprocess encapsulates its internal sequence — from the outside only the “+” marker is visible

Call Activity

Thick border. References a global subprocess (e.g. “Procurement”) that is reused across different processes.

Difference from an embedded subprocess: in an embedded subprocess data is accessible directly (shared scope with the parent). A Call Activity is a separate process — its inputs and outputs require explicit data mapping: what we pass in on the call, what we read back on return.
Call Activity: a shared subprocess reused in multiple processes
Call Activity: a single global subprocess “Purchase article” (thick border) is invoked from both “Order processing” and “Stock maintenance”

Ad-hoc subprocess

Marker “~”. Activities inside may run in any order, repeat, or be skipped. Start/end events are not allowed inside.

Ad-hoc subprocess: tasks in any order
Ad-hoc (~): tasks inside run in any order and may be repeated

Event subprocess

Dashed border inside a process. Triggered by a start event while the parent is active. Interrupting — cancels the parent. Non-interrupting — runs in parallel.

Event subprocess
Event subprocess (dashed border): triggered by an event inside the active parent process

Gateways

Control branching and merging. A gateway is not a task! The decision is made before the gateway.

Exclusive XOR
Either/Or
Parallel AND
And/And
Inclusive OR
One or more
Event-based
Event-based
Complex
Complex
None
None

Exclusive (XOR) Gateway

The most common gateway. When splitting, it activates exactly one outgoing path — the one whose condition holds first. If no condition is met, the process fails with an error (so it is good practice to always define a “default” branch). When merging, it lets every arriving token through immediately, without waiting for the others.

Analogy: a fork in the road where you drive in only one direction.

Examples: “Is the order paid? → Yes / No”, “Is the amount > 10,000? → Yes / No”.
Tip: phrase the question before the gateway and put the answer options on the outgoing arrows.
Exclusive (XOR) gateway — example
XOR gateway: “which dish?” → pick one recipe out of several (only one path is activated)

Parallel (AND) Gateway

When splitting, it activates all outgoing paths at once, unconditionally — no checks. When merging, it waits for tokens on all incoming paths and only when all have arrived does it pass a single token onwards.

Analogy: a manager hands out tasks to five employees and waits until all five are done.

Examples: shipping the goods and issuing the invoice in parallel; different departments reviewing documents at the same time.
Antipattern: do not merge branches with AND if they were split by XOR or if only one of them is ever taken. AND will wait forever for tokens on all inputs — the process deadlocks. Merge after an XOR with an XOR (or an empty diamond).
Parallel (AND) gateway — example
AND gateway: all branches start in parallel and are synchronised at the merge (we wait for all of them)

Inclusive (OR) Gateway

A hybrid of XOR and AND. When splitting, it activates one or more paths depending on the conditions — each condition is evaluated independently. When merging, it waits only for tokens on the paths that were actually activated (not for all of them, as AND does).

Analogy: a buffet — you take one dish, two, or all, but never zero.

Examples: the client chose delivery and/or pickup and/or gift wrapping — execute the selected options and wait for all of them to complete.
Caution: OR gateways are harder to analyse. In branchy diagrams the synchronisation rules can be non-obvious. Not every engine supports them correctly.
Inclusive (OR) gateway — example
OR gateway: one or more paths are activated depending on the conditions; the merge waits only for the branches that were actually taken

Event-based Gateway

Fundamentally different from the others: it routes not by data, but by whichever event arrives first. After the gateway you place intermediate waiting events (timer, message, conditional, signal). As soon as one fires, the others are cancelled.

Analogy: you ordered a pizza — if it has not arrived in 60 minutes, call the pizzeria; if it arrives earlier, you eat.

Examples: waiting for payment with a timer (not paid in 3 days → cancel the order); waiting for the client's reply or for a deadline.
Event-based gateway — example
Event-based gateway: routes by whichever event arrives first (timer vs. message)

Complex Gateway

Used when the branching logic cannot be expressed by standard gateways. The merge condition is defined by an expression (for example, “continue when 3 out of 5 branches have completed” or “when the first reply has arrived and 10 minutes have passed”).

In practice: rarely used and not every BPM engine supports it. If a combination of XOR / AND / OR is enough, prefer that.

None (Default Exclusive)

A diamond with no marker. Semantically equivalent to an exclusive (XOR) gateway — the BPMN standard allows omitting the cross. Some methodologists consider this bad practice because it hurts readability: it is unclear whether the author forgot the marker or deliberately chose XOR.

Events

Key concepts

An event is something that happens (a fact), as opposed to a task (an active action). Drawn as circles.

Start
Thin circle
Intermediate
Double circle
End
Thick circle

Catching (unfilled marker) — waiting. Throwing (filled) — throwing. Boundary events: interrupting (solid) and non-interrupting (dashed).

Event summary table

Icons from bpmn-font (Camunda). “—” = not defined by the standard.

TypeStartIntermediateEnd
NormalEvent sub.Non-int.CatchBoundaryBound. non-int.Throw
None
✉ Message
⏱ Timer
⚡ Error
▲ Signal
📋 Conditional
↗ Escalation
⬤ Terminate
⏪ Compensation
✖ Cancel
➡ Link
⬠ Multiple
➕ Parallel mult.

Message

Exchange with a specific recipient: email, call, HTTP, push. Available in every position.

Message event — example
Message event: sending a pizza order as a throwing event triggers the process on the receiver's side

Timer

Date/time, interval, countdown (deadline). Catching only.

Timer event — example
Timer: start (run on schedule), interrupting boundary (deadline), non-interrupting boundary (reminder)

Error

A serious failure. Catching — only on a boundary. Throwing — only at the end.

Error event — example
A boundary error event on the “Purchase article” subprocess: on failure the flow goes to the “handle purchase failure” handler; the happy path continues with paying the invoice

Conditional

Waiting for an external condition (“the oven is hot”). Catching only.

Conditional event — example
Conditional: the process waits for external conditions to hold — the pizza is not put in the oven until it reaches 180°, and not taken out until it is ready

Signal

Broadcast (vs. an addressed message). Any subscriber reacts.

Signal event — example
Signal: a TV pizza spot starts the process via a signal start; after buying, an appetite kicks in (a condition), then the pizza is eaten; the signal end broadcasts the rating to pizzatest.de

Terminate

Immediately stops the entire process instance. End only.

Parallel process with plain end events
Without Terminate: after the AND split tokens run in parallel. Task 2 takes 45 minutes, task 3 takes 30; the instance finishes after 55 minutes, when both tokens have been consumed by their plain (none) end events.

What if continuing task 2 after task 3 finishes no longer makes sense? Then the pattern below is used:

The same process with a Terminate end event
With Terminate: after task 3 the condition “is task 2 still needed?” is checked. If not — the flow goes into a Terminate event that instantly consumes every remaining token of the instance (including the still-running task 2). Terminate is only valid as an end event.
Link event — example
Link event: a “teleport” — throwing throws the flow out, catching picks it up, replacing a long crossing arrow

Compensation

Reverses a previously completed action. The compensating task is linked via an association.

Compensation event — example
Compensation: a boundary event (outline ⏪) on a completed task triggers its compensation handler via an association

Escalation

Sent from a subprocess to its parent — not an error. Can be non-interrupting.

Escalation event — example
Escalation: the “Delivery” subprocess throws “late”; the parent catches it with a non-interrupting boundary escalation and notifies the customer in parallel — the main flow continues

Cancel

Only in the context of transactions. End — rollback. Boundary — catch.

Data, artefacts, flows

Data Object
Data Object
Data Store
Data Store
Data Input
Data Input
Data Output
Data Output
Annotation
Text Annotation
Group
Group
Flow
Sequence Flow
Message flow
Message Flow
Conditional
Conditional Flow
Default
Default Flow
Transaction
Transaction

Data Object

A “sheet of paper” with a folded corner. Represents information that is created, consumed or passed between tasks within a process instance. It only exists while the instance is alive.

Examples: a customer request, a draft contract, a report that is assembled along the way.

Data Store

A cylinder. Persistent storage that outlives the process instance: a database, a registry, a file store. Tasks read from and write to it.

Examples: CRM, ERP, order database, document archive.

Data Input / Data Output

Parameters of a process or subprocess on its boundary. Input — what is supplied from the outside; output — what is returned. Arrow with an open/filled triangle.

Examples: the “Procurement” subprocess takes a list of items as input and returns an invoice as output.

Text Annotation

A comment attached to any element via a dashed line. Does not affect execution — it only exists to clarify things for the diagram's reader.

Group

A dashed rounded rectangle. A visual grouping of elements (e.g. “all logistics tasks”). It has no execution semantics; flows may freely cross its boundary.

Sequence Flow

A solid arrow with a filled head. Defines the order of execution inside a single pool. Cannot cross pool boundaries.

A conditional flow (with a small diamond at the source) — fires only if its condition is true. Used on outgoing arrows from a task without a gateway.

A default flow (with a tick at the source) — the fallback path of an XOR/OR gateway or a conditional split, taken if no other condition holds.

Message Flow

A dashed arrow with an open head. Connects different pools — a message exchanged between independent participants. Not used inside a single pool.

Examples: the customer sends an order to the pizzeria; the bank sends a payment confirmation.

Transaction

A subprocess with a double border. ACID semantics: either every inner action commits successfully, or the entire transaction rolls back via a Cancel event (with compensations). Used for consistency in distributed operations.

Examples: booking a “flight + hotel + car” package — if any step fails, the whole booking is cancelled.

Ready to try?

Create your first BPMN diagram for free — no sign-up or credit card required.

Start generating BPMN flowcharts with AI
Examples adapted from camunda.com. Compiled by BP1.AI.