#Process elements
The designer lets you draw every BPMN element, but only some of them run, so this page lists which ones Chester executes and which it rejects.
#Why the palette offers more than runs
The BPMN editor offers the full BPMN 2.0 palette, because a
documentation-only process may use any of it. In an
executable process, validation marks every element Chester cannot run as an error
("not implemented"), and a process with errors cannot be deployed. You find out while
modelling, not when the process runs.
flowchart LR
E[Element in the diagram] --> Q{Process executable?}
Q -- "no" --> OK1["Allowed — documentation only"]
Q -- "yes" --> S{Supported by Chester?}
S -- "yes" --> OK2["Configured and run"]
S -- "partly" --> W["Deploys, but behaves as described below"]
S -- "no" --> X["Validation error — blocks deployment"]
#What is supported
✅ runs as described · ⚠️ deploys, but with the limit noted · ❌ rejected by validation
#Start and end events
| Element |
Status |
Note |
| Start event (none) |
✅ |
Started by a person once Manual start is on, optionally with a start form, or by a calling process. See Start a process |
| Message start event |
✅ |
Started by an incoming webhook or a request to a fixed URL, optionally followed by a delta query. See Start a process from an incoming request |
| Timer start event |
⚠️ |
Deploys, but never fires — nothing starts the process when the time comes |
| Signal, conditional, error and escalation start events |
⚠️ |
Deploy, but nothing triggers them |
| Compensation start event |
⚠️ |
Runs like a plain start event |
| End event (none) |
✅ |
Ends the whole instance as soon as any path reaches it. Steps still open on other paths are not withdrawn. See End a process |
| Terminate, error, message, signal, escalation, cancel and compensation end events |
⚠️ |
All behave like a plain end event: terminate does not withdraw the other paths' open steps, error throws nothing, message and signal send nothing |
#Tasks and activities
| Element |
Status |
Note |
| Task (none) |
✅ |
Passes straight through — useful as a documented placeholder |
| User task |
✅ |
A person works on it in a form. See Hand work to a person with a user task |
| Service task |
✅ |
Calls a system through an HTTP or GraphQL action. See Call a system with a service task |
| Send task |
✅ |
Sends an email through an email adapter. See Send an email with a send task |
| Call activity |
✅ |
Runs the production deployment of another process or an agent and waits for it. See Call another process or an agent |
| Sub-process |
✅ |
Runs its steps as a separate part that sees only the inputs passed in. See Group steps in a sub-process |
| Ad-hoc sub-process |
✅ |
The building block of an agent. ⚠️ Without an agent configuration it runs like a plain sub-process |
| Event sub-process |
⚠️ |
Deploys, but never runs — no event starts it |
| Script, business rule, receive and manual tasks |
❌ |
|
| Transaction |
❌ |
|
#Gateways
| Element |
Status |
Note |
| Exclusive gateway |
✅ |
Takes the first path whose condition holds, or the default path if none does. With neither, the step fails. See Decide which path a gateway takes |
| Inclusive gateway |
✅ |
Takes every path whose condition holds, or the default path if none does |
| Parallel gateway |
❌ |
Not available. For parallel work use an inclusive gateway whose conditions all hold, or a multi-instance activity |
| Event-based gateway |
✅ |
Waits for the timer, message or signal events that follow it; the first to happen decides the path. Cannot be retried from the instance view |
| Complex gateway |
❌ |
|
| Element |
Status |
Note |
| Message catch event |
⚠️ |
Waits for an incoming request. In webhook mode it needs a challenge on the adapter, and a message that arrives early is lost. See Wait for an incoming message |
| Message throw event |
✅ |
Calls an outbound action and waits for its answer, like a service task. See Send a message to a system |
| Timer catch event |
⚠️ |
Waits for a fixed duration in days, hours, minutes and seconds only — no date, cycle or expression, and at most about 24 days. See Wait for a while with a timer event |
| Signal catch and throw events |
⚠️ |
A throw wakes every waiting catch for that signal, in every process and environment; a signal nobody waits for is lost. See Wake waiting processes with a signal |
| Link catch and throw events |
⚠️ |
Jump from one point to another on the same level of the diagram. A throw without a matching catch still deploys, and fails at run time. See Jump across the diagram with link events |
| Intermediate catch and throw events (none) |
✅ |
Pass straight through — useful as a documented milestone |
| Conditional catch, escalation throw and compensation throw events |
⚠️ |
Deploy, but do nothing: the process passes straight through, without waiting for the condition or throwing anything |
| Error boundary event (interrupting) |
✅ |
Takes over when the activity it sits on fails — any failure, there is no filter by error code. See Handle a failed step with an error boundary event |
| Timer, message, signal, escalation, conditional, compensation and cancel boundary events |
❌ |
A timeout on a task is not available |
#Markers
| Marker |
Status |
Note |
| Multi-instance (parallel or sequential) |
✅ |
On user, service and send tasks, sub-processes and call activities — one run per item of a list or per member of a user group. Sequential runs one at a time on every element. ⚠️ The Assignee expression of a user task is not used. See Run a step once per item |
| Loop |
❌ |
Has no effect: the activity runs once |
Only executable processes show the configuration of an element. Select it in the
diagram and the properties panel opens beside the canvas. What can be set depends on the
element: a service task needs a system, an adapter and an action; a user task needs an
assignee and a form; a condition lives on the outgoing sequence flow of a
gateway, not on the gateway itself. Values that depend on the running process are
written as expressions.