Boundary Event

Boundary Timer Event

bottom port — attach to host taskright port — path taken when fired
Service Tasknormalon fireEscalation

Attached to a task — watches it from the outside. If the task takes too long, the timer fires and routes to the boundary event’s outgoing flow.

Properties

PropertyTypeRequiredDescription
IDstringyesUnique element identifier
NamestringnoDisplay label
Attached Toelement IDyesThe task this boundary event is attached to
Timer ExpressionISO 8601 durationyesTime elapsed since the host task became active (duration only)
InterruptingbooleanyesSee behavior table below

Interrupting vs Non-Interrupting

ModeBehavior
Interrupting (default)Cancels the host task, then follows the boundary path
Non-interruptingSpawns a parallel path; the host task keeps running

Timer Expression (Duration Only)

Boundary timers only support duration format — absolute dates and cycles are not supported here.

ExpressionMeaning
PT15M15 minutes
PT2H2 hours
P1D1 day
P1DT4H1 day and 4 hours

Format: P prefix, then [n]Y[n]M[n]D for calendar parts, T[n]H[n]M[n]S for time parts. Only include units you need — e.g. PT30M not P0DT0H30M0S.

XML Example

<bpmn:userTask id="manager_review" name="Manager Review">
  <bpmn:incoming>flow_to_review</bpmn:incoming>
  <bpmn:outgoing>flow_approved</bpmn:outgoing>
</bpmn:userTask>

<!-- Interrupting boundary timer: escalate after 48 hours -->
<bpmn:boundaryEvent id="review_timeout" attachedToRef="manager_review">
  <bpmn:timerEventDefinition>
    <bpmn:timeDuration>P2D</bpmn:timeDuration>
  </bpmn:timerEventDefinition>
  <bpmn:outgoing>flow_to_escalate</bpmn:outgoing>
</bpmn:boundaryEvent>

<bpmn:serviceTask id="escalate" name="Escalate to Director">
  <bpmn:incoming>flow_to_escalate</bpmn:incoming>
  <bpmn:outgoing>flow_done</bpmn:outgoing>
</bpmn:serviceTask>

Boundary Timer vs Timer Catch Event

Boundary TimerTimer Catch Event
PositionAttached to a taskSits in the sequence flow
PurposeTimeout / escalationDeliberate wait step
All tokens pass through?No — only triggers if task is still activeYes — every token pauses here
Supports cycles?NoYes