flowable/flowable-engine · warning

start event of event subprocess must be of type 'error', 'me

Error message

start event of event subprocess must be of type 'error', 'message' or 'signal' for start event {}

What it means

This is a validation warning emitted during BPMN parsing by Flowable's engine when an event subprocess contains a start event whose event definition is not one of the supported types (error, message, or signal). The parser skips generating a start behavior for it, so the event subprocess will not trigger as modeled. Per the BPMN 2.0 spec, event subprocesses may only be entered via error, message, compensation or signal start events, so other definitions (e.g. timer or none) are rejected at parse time.

Source

Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/StartEventParseHandler.java:129

        ScopeImpl scope = bpmnParse.getCurrentScope();
        Object triggeredByEvent = scope.getProperty("triggeredByEvent");
        boolean isTriggeredByEvent = triggeredByEvent != null && ((Boolean) triggeredByEvent);

        if (isTriggeredByEvent) { // event subprocess

            // all start events of an event subprocess share common behavior
            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

  1. Change the event subprocess start event's definition to an errorEventDefinition, messageEventDefinition, or signalEventDefinition in the BPMN XML/modeler.
  2. If a timer-triggered subprocess is needed, use a regular subprocess with an intermediate timer catch event instead of an event subprocess.
  3. Verify the start event XML contains exactly the intended child event definition element and correct namespace.
  4. Check the modeled model export: some designers emit empty or wrong event definitions; inspect startEvent.getEventDefinitions() in the deployed BPMN.

Example fix

// before
<subProcess id="evSub" triggeredByEvent="true">
  <startEvent id="start1">
    <timerEventDefinition><timeDuration>PT1H</timeDuration></timerEventDefinition>
  </startEvent>
</subProcess>
// after
<subProcess id="evSub" triggeredByEvent="true">
  <startEvent id="start1">
    <signalEventDefinition signalRef="mySignal"/>
  </startEvent>
</subProcess>
Defensive patterns

Strategy: validation

Validate before calling

boolean isValidEventSubprocessStart(StartEvent start) {
  if (start.getEventDefinitions().isEmpty()) return false;
  EventDefinition d = start.getEventDefinitions().get(0);
  return d instanceof ErrorEventDefinition
      || d instanceof MessageEventDefinition
      || d instanceof SignalEventDefinition;
}

Prevention

When it happens

Trigger: A <startEvent> inside a <subProcess triggeredByEvent="true"> whose first eventDefinition is not ErrorEventDefinition, MessageEventDefinition, or SignalEventDefinition (e.g. a timerEventDefinition, conditionalEventDefinition, or no definition at all). Thrown from StartEventParseHandler.createScopeStartEvent during executeParse.

Common situations: Modeling an event subprocess in the BPMN designer and dragging in a timer start event; copying a regular subprocess start event into an event subprocess; upgrading models where event definitions were dropped or renamed so the start event ends up with none/unsupported definitions.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/c0a0013ca9955375. Report an issue: GitHub.