Event

Timer Catch Event

token waits hereContinue

Sits inside the sequence flow as an explicit wait step. Every token that reaches this event pauses here until the timer fires, then continues along the outgoing flow.

Properties

PropertyTypeRequiredDescription
IDstringyesUnique element identifier
NamestringnoDisplay label
Timer Typeduration | date | cycleyesHow the timer behaves
Timer ExpressionstringyesISO 8601 expression

Timer Expressions

Duration — wait for a fixed amount of time from when the token arrives

ExpressionMeaning
PT30M30 minutes
PT2H2 hours
P1D1 day
P1DT4H30M1 day, 4 hours, 30 minutes

Date — wait until an absolute point in time

ExpressionMeaning
2026-06-01T09:00:00Z1 Jun 2026 at 09:00 UTC
2026-06-01T09:00:00+05:301 Jun 2026 at 09:00 IST

Always include a timezone offset or Z. Omitting it is ambiguous.

Cycle — fire repeatedly; each firing advances the token once and re-arms

ExpressionMeaning
R/PT1HEvery hour, forever
R3/PT30MEvery 30 minutes, 3 times
R5/P1DEvery day, 5 times

Format: R[n]/<duration>. Omit n to repeat forever.

XML Example

<!-- Wait 24 hours before sending a follow-up -->
<bpmn:intermediateCatchEvent id="wait_1d" name="Wait 24h">
  <bpmn:timerEventDefinition>
    <bpmn:timeDuration>P1D</bpmn:timeDuration>
  </bpmn:timerEventDefinition>
  <bpmn:incoming>flow_to_wait</bpmn:incoming>
  <bpmn:outgoing>flow_to_followup</bpmn:outgoing>
</bpmn:intermediateCatchEvent>

Timer Catch Event vs Boundary Timer

Timer Catch EventBoundary Timer Event
PositionIn the sequence flowAttached to a task
PurposeDeliberate scheduled pauseTimeout / escalation
All tokens pass through?YesNo — only fires if task is still active
Supports date and cycle?YesNo — duration only