Compared to other BPM engines¶
People choosing a workflow engine often know one of the open source BPM engines already. This page compares Orchestra with three of them, feature by feature:
- Camunda 7 Community Edition, and Operaton, the community fork that carries it on. Camunda 7 Community Edition reached its end of life in October 2025, with 7.24 as its last release (announcement). Operaton 1.0 is compatible with Camunda 7.24 and is licensed under Apache 2.0 (repository). One column covers both.
- Camunda 8, whose engine is Zeebe. Since Camunda 8.6, running it in production on your own servers needs a license from Camunda; development use is free (licensing).
- Flowable, its open source engines, licensed under Apache 2.0. Flowable 7 keeps the BPMN, CMMN and DMN engines and removes the form engine, the content engine and the UI applications (7.0.0 release).
jBPM, Bonita and Activiti are covered at the end, in less detail: Other engines says why.
Read this page as a map, not a verdict
The other engines' cells say what their own documentation says, linked where a cell is not common knowledge about that engine. They were checked in November 2026. Those engines change too: before choosing, check the point that matters to you in their current documentation. A cell that says "not found" means their documentation did not show it, not that it cannot be built.
At a glance¶
Orchestra's cells link to the page that explains each feature. Their color says where Orchestra stands:
| Color | Means |
|---|---|
| Yes | Orchestra does it. |
| Partly | Orchestra does part of it, or does it another way. |
| Not yet | An issue is open for it. |
| No | Orchestra does not do it, and nothing is planned. |
Modeling¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Graphical modeler | Yes: a BPMN.io canvas, and a form-based modeler for people who do not use a canvas (Integrations) | Yes: Camunda Modeler | Yes: Camunda Modeler; Web Modeler is limited to five users without a license | Not in the open source engines since 7.0; Flowable Design is a separate application |
| Runs a BPMN 2.0 file drawn in another tool | No: Orchestra runs its own model. The canvas draws it with BPMN shapes, and imports and exports Orchestra's own files (Integrations) | Yes | Yes | Yes |
| Case management (CMMN) | Partly: a case is a workflow whose handlers wait for conditions, each item offered while its condition holds; there is no CMMN file, stage or milestone (Running a workflow as a case) | Yes | No: "not planned for Camunda 8" (migration guide) | Yes |
Flow control¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Exclusive, parallel and inclusive choice | Yes, as a split and a join on any step, not only on a gateway (Joins and splits) | Yes, as gateways | Yes, as gateways | Yes, as gateways |
| One branch per item of a list, all at once or one after another | Yes: the per_item and per_member splits (One branch per item) |
Yes: multi-instance | Yes: multi-instance | Yes: multi-instance |
| Going on when N of M branches are back, or when a vote is decided | Yes: the threshold and quorum joins, which cancel the late branches (Joins and splits) |
Yes: a multi-instance completion condition | Yes: a multi-instance completion condition | Yes: a multi-instance completion condition |
| Branch variables, gathered by the join | Yes: token-scoped variables, collected into a list, a count, a sum, an average, a minimum or a maximum (Merge policy) | Local variables, and a multi-instance output collection | Local variables, and a multi-instance output collection | Local variables, and a multi-instance output collection |
| Loops | Yes: a flow back to an earlier step (Loops and re-entry) | Yes | Yes | Yes |
Work done by people¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Tasks for users, roles or groups, claimed from a pool | Yes (Human tasks) | Yes | Yes | Yes |
| A task list people work from | Yes: the inbox, and Views lists you can change (Views and dashboards) | Yes: Tasklist | Yes: Tasklist, under the production license | Not in the open source engines since 7.0: build your own on the API |
| Forms | Yes: a webform, the edit form of the content the instance is about, or a comment (Webform integration, Content-bound tasks) | Yes: Camunda Forms, and embedded HTML forms | Yes: Camunda Forms | Not in the open source engines since 7.0 |
| Handing a task to someone else | Yes: reassignment, and delegation for an absence period (Delegation) | Yes: assignment and task delegation | Yes: assignment | Yes: assignment and task delegation |
| Reminding, then escalating to a manager | Yes: a ladder of timers on the step, with no code (Timers) | Through timers on the task, and code that sends the reminder | Through timers on the task, and a worker that sends the reminder | Through timers on the task, and code that sends the reminder |
Work done by machines¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Calling an HTTP endpoint | Yes: the HTTP request step, limited to the hosts its author names (HTTP request tasks) | Yes: the HTTP connector | Yes: the REST connector, under the production license | Yes: the HTTP task |
| Running code of your own | Yes: a Drupal Action, a Tool API tool, or a task type plugin (Action tasks, Tool API, Extending) | Yes: Java delegates | Yes: job workers, in any language | Yes: Java delegates |
| A program outside the engine taking the work (external worker) | Yes: a Job for a program step; programs take the jobs of a topic over the HTTP API, leased, and complete or fail each (Jobs for programs) | Yes: external tasks | Yes: every service task is done by a job worker | Yes: the external worker task (documentation) |
| Script steps | No: computed values and conditions are expressions, not scripts (Expressions) | Yes: JavaScript, Groovy and other JSR-223 languages | Yes: FEEL expressions, or a job worker | Yes: JSR-223 languages |
| Decision tables | Partly: in Orchestra's own format, not DMN, with the first-match and collect hit policies (Decision tables) | Yes: DMN | Yes: DMN | Yes: DMN |
Events and time¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Waiting for a message addressed to one instance, by a business key or variable values | Yes (Waiting for an event) | Yes: message correlation | Yes: message correlation | Yes: message correlation |
| A message for every instance waiting for it (signal) | Yes: a broadcast event (Deliver, or broadcast) | Yes: signals | Yes: signals | Yes: signals |
| Sending a message from a step | Yes: the Send an event step delivers an event to the step waiting for it, broadcasts it to every one, or starts the workflows that start on it (Sending an event) | A signal, by a throw event; a message throw event runs your Java code | A signal, by a throw event; a message throw event is done by a job worker | A signal, by a throw event; an event registry event, by the send event task |
| Starting on a message, from a signed webhook, or on a schedule | Yes (Event starts, Incoming webhooks, Scheduled starts) | Message and timer starts; webhooks through your own endpoint | Message and timer starts; webhooks through the inbound webhook connector, under the production license | Message and timer starts; webhooks through your own endpoint |
| Something that can happen at any step (event subprocess) | Yes: handlers, which interrupt or leave the rest running, and can wait for a condition first (Handlers) | Yes | Yes | Yes |
| A deadline on a step, which moves it on or runs alongside (boundary timer) | Yes (Timers) | Yes | Yes | Yes |
| Durations, dates and repeats | Yes; cron expressions for scheduled starts (Timers, Scheduled starts) | Yes: ISO 8601 and cron (timer events) | Yes: ISO 8601 | Yes: ISO 8601 |
| Working time: working hours and closed days | Yes: working calendars, with holidays that follow Easter (Working calendars) | A Java interface to implement; none of the shipped ones counts working hours (BusinessCalendar) | Not found | A timer can name a business calendar, a Java class; none counting working hours was found (documentation) |
Errors¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Retries, then an incident an operator resolves | Yes, and the instance's other branches go on (Incidents) | Yes | Yes | Yes: dead-letter jobs |
| A step's failure routed as an outcome (error event) | Yes: the failed outcome (If a step fails) |
Yes: error events | Yes: error events | Yes: error events |
| Undoing completed steps (compensation) | Not yet: #3634775, postponed | Yes | Yes (compensation events) | Yes |
Running workflows¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| A running instance keeps the version it started on | Yes (Versioning) | Yes | Yes | Yes |
| Moving running instances to a newer version | Yes, from the Versions tab (Versions and migration) | Yes, by the API; the Cockpit screen for it is enterprise only (Cockpit) | Yes, by the API, and from Operate under the production license (migration) | Yes, by the API (migration) |
| Canceling a running step, or moving it to another step | Partly: a waiting step is canceled, or moved to a step inside the same parallel sections, and a waiting handler is fired by hand. Any other step cannot be started on its own, and a step cannot be moved into or out of a parallel section (Canceling or moving a step) | Yes, by the API: process instance modification; the Cockpit screen for it is enterprise only (modification) | Yes: cancel, add or move tokens in Operate, under the production license (modification) | Yes, by the API: change activity state (ChangeActivityStateBuilder) |
| A called workflow, run as a separate instance or inside the parent | Yes: both, pinned to a child version (Subprocesses) | Yes: call activity and embedded subprocess | Yes: call activity and embedded subprocess | Yes: call activity and embedded subprocess |
| History of each instance | Yes: the trace, and a tamper-evident audit log that outlives the instance (Audit log) | Yes: history tables, shown in Cockpit | Yes: Operate, under the production license | Yes: history tables |
| Deleting old finished instances | Yes, per workflow and per tenant (Retention) | Yes: history cleanup by time to live | Yes: archived data is deleted after a minimum age, when deletion is turned on (data retention) | Yes: history cleaning, off by default (housekeeping) |
| Dashboards | Yes: Views, which a site builder changes without code (Views and dashboards) | Cockpit | Operate and Optimize, under the production license | Not in the open source engines since 7.0 |
Architecture¶
| Feature | Orchestra | Camunda 7 / Operaton | Camunda 8 | Flowable |
|---|---|---|---|---|
| Where the engine runs | Inside a Drupal site, in PHP, on the site's database | Inside a Java application, or as its own server | As its own cluster (Zeebe), which applications call over the network | Inside a Java application, or as its own server |
| Several isolated tenants in one install | Yes (Multi-tenancy) | Yes: tenant identifiers (multi-tenancy) | Yes, on your own servers with Identity (multi-tenancy) | Yes: tenant identifiers |
| An HTTP API | Yes, with OAuth (The HTTP API) | Yes: REST | Yes: REST and gRPC | Yes: REST |
| The same calling code, on this site or another site | Yes: one client contract, local or remote (Distributed execution) | No: callers use the Java API or REST | No: callers use a client over the network | No: callers use the Java API or REST |
| Scaling out | Partly: several web servers on one database; a lock backend off the database for heavy load (High concurrency) | Several engines on one database | Partitions spread over brokers | Several engines on one database |
| License | GPL-2.0-or-later | Camunda 7: Apache 2.0, no more releases. Operaton: Apache 2.0 | Camunda License 1.0: free for development, a license for production | Apache 2.0 |
Where Orchestra differs¶
It lives in a Drupal site. The people who work tasks are the site's users. A step can open the edit form of the content the instance is about, run a Drupal Action, or show a webform. The dashboards are Views. Nothing else needs to be installed, run or kept in step with the site.
Routing is on the step. A choice, a fork or a wait is a split or a join on any step, not a separate gateway. A join can wait for the branches that can still arrive, stop at N of M, or decide a vote as soon as it is settled. The others express the last two with a multi-instance completion condition.
Branches keep their own values. A variable can belong to one branch. The join gathers the branches' values into a list, a count, a sum, an average, a minimum or a maximum. In the others, a branch's variables are local to the branch, and a multi-instance activity collects one output.
People without an account can take part. A step can send a link to its page, or show a webform on another site, and the instance goes on when it is answered (External interaction).
AI agents can take part. An agent can work a human task, and eight tools let an agent or an MCP client start, follow and correct workflows (Agents, Tool API).
Working time is built in. Deadlines and timers count working hours and skip closed days, from a calendar the site keeps (Working calendars).
Where the others still lead¶
- BPMN interchange. They run a standard BPMN 2.0 file drawn in another tool. Orchestra runs its own model, and a BPMN file from another engine does not import as it is.
- Case management. Camunda 7 and Flowable run CMMN models, with stages and milestones. In Orchestra, a case is a workflow whose handlers wait for conditions (Running a workflow as a case), and a CMMN file does not import.
- Undoing completed steps. They run compensation. In Orchestra it is #3634775, postponed.
- Changing where an instance stands. Their operators cancel, start or move tokens anywhere in an instance. Orchestra cancels a waiting step, moves it inside the same parallel sections, and fires a waiting handler (Canceling or moving a step).
- Standard decisions. They run DMN files, Camunda's with FEEL expressions. Orchestra's decision tables have their own format, and their expressions are Symfony ExpressionLanguage.
- Script steps. They run scripts in a step. Orchestra has expressions, and code goes in a plugin.
- Scale. Camunda 8 spreads one workflow's instances over a cluster. Orchestra runs in the web servers of one Drupal site, on its database.
- Maturity. They have years of production use, books, training and consultancies. Orchestra is a new project.
Other engines¶
These are not in the tables, because their open source editions are hard to compare line by line.
- jBPM is now part of Apache KIE, still in the Apache Incubator. Its engine runs as part of Kogito, and it is released with Drools and the other KIE projects, 10.2.0 being the latest (Apache KIE, repository). The jBPM 7 documentation describes a different runtime, the KIE Server, so its features do not tell you what the current release does.
- Bonita Community is free, and runs BPMN processes designed in Bonita Studio (components). Running cases stay on the process version they started on (process management). Changing a running application is the subscription editions' live update (live update). Multi-tenancy was never in the Community edition, and was removed from all editions in 2023.1 (multi-tenancy).
- Activiti is the engine Flowable was forked from. Its open source repository is a BPMN 2 engine for Java, under the Apache license (repository). Flowable has added to its engines since the fork, CMMN among them, so the Flowable column does not describe Activiti.
For Drupal's own workflow engine, see Compared to Maestro. For commercial platforms, see Compared to commercial platforms.