flowable/flowable-engine · warning
event definitions only allowed on start event if subprocess
Error message
event definitions only allowed on start event if subprocess is an event subprocess {} What it means
This warning is raised during BPMN parsing when a start event inside a regular (non-event) subprocess carries event definitions. Per BPMN semantics, event definitions on start events are only meaningful for event subprocesses; the engine ignores them here and treats the start as a none start event. It indicates the process model is likely invalid or the author intended an event subprocess.
Source
Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/StartEventParseHandler.java:137
EventSubProcessStartEventActivityBehavior activityBehavior = bpmnParse.getActivityBehaviorFactory().createEventSubProcessStartEventActivityBehavior(startEvent, startEventActivity.getId());
startEventActivity.setActivityBehavior(activityBehavior);
if (!startEvent.getEventDefinitions().isEmpty()) {
EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);
if (eventDefinition instanceof org.flowable.bpmn.model.ErrorEventDefinition
|| eventDefinition instanceof MessageEventDefinition
|| eventDefinition instanceof SignalEventDefinition) {
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
} else {
LOGGER.warn("start event of event subprocess must be of type 'error', 'message' or 'signal' for start event {}", startEvent.getId());
}
}
} else { // "regular" subprocess
if (!startEvent.getEventDefinitions().isEmpty()) {
LOGGER.warn("event definitions only allowed on start event if subprocess is an event subprocess {}", bpmnParse.getCurrentSubProcess().getId());
}
if (scope.getProperty(PROPERTYNAME_INITIAL) == null) {
scope.setProperty(PROPERTYNAME_INITIAL, startEventActivity);
startEventActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createNoneStartEventActivityBehavior(startEvent));
} else {
LOGGER.warn("multiple start events not supported for subprocess {}", bpmnParse.getCurrentSubProcess().getId());
}
}
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Add triggeredByEvent="true" to the subprocess element if an event subprocess was intended.
- Remove the event definition from the start event if a plain subprocess was intended (start events in regular subprocesses must be none/empty).
- Validate the BPMN XML with the Flowable model validator before deployment to catch this earlier.
Example fix
// before
<subProcess id="sub1">
<startEvent id="start1">
<errorEventDefinition errorRef="myError"/>
</startEvent>
</subProcess>
// after
<subProcess id="sub1" triggeredByEvent="true">
<startEvent id="start1">
<errorEventDefinition errorRef="myError"/>
</startEvent>
</subProcess> Defensive patterns
Strategy: validation
Validate before calling
boolean isEventDefinitionsOnRegularSubprocessStart(SubProcess sub, StartEvent start) {
return !Boolean.TRUE.equals(sub.isTriggeredByEvent())
&& !start.getEventDefinitions().isEmpty();
} Prevention
- Set triggeredByEvent="true" whenever start events carry event definitions inside subprocesses
- Run BPMN XSD/semantic validation in CI before deploying
- Keep regular subprocess start events empty (none start events)
When it happens
Trigger: A <subProcess> without triggeredByEvent="true" contains a <startEvent> with a child event definition (e.g. timerEventDefinition, errorEventDefinition). Thrown from StartEventParseHandler.createScopeStartEvent in the else branch handling regular subprocesses during executeParse.
Common situations: Author forgot to set triggeredByEvent="true" on the subprocess while modeling an event subprocess; a designer exported the subprocess incorrectly; copy-pasting an event start event from a process level into a subprocess.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- multiple start events not supported for subprocess {}
- start event of event subprocess must be of type 'error', 'me
- Timer needs configuration (either timeDate, timeCycle or tim
- BPMN XSD could not be found
- The bpmn 2.0 xml is not properly encoded
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/349b007f067543a4.
Report an issue: GitHub.