Timer events
Timer events act on the passage of time: they start processes on a schedule, delay a flow, or bound how long an activity may run. The engine schedules the timers itself — they are persisted with the process state and fire automatically, without any external trigger. Timer events are always catching.
| Position | Icon | Behavior |
|---|---|---|
| Timer start event | Creates a process instance at a fixed time or on a recurring schedule. | |
| Timer intermediate catch event | Pauses the token until the timer fires. | |
| Timer boundary event | Fires while an activity is active — interrupting or non-interrupting. |
Use cases
- Scheduled processes — run a reporting or cleanup process every night at 2:00 with a cycle timer start event.
- Delays — wait 24 hours after registration before sending a follow-up.
- Timeouts — cancel a user task that has not been completed within its SLA and route to an escalation path (interrupting boundary).
- Reminders — send a reminder every two days while an approval is pending, without disturbing the task itself (non-interrupting boundary with a cycle).
Usage in BPMN
A timer event contains a bpmn:timerEventDefinition with exactly one of three time specifications:
| Element | Meaning | Format | Example |
|---|---|---|---|
bpmn:timeDate | Fire once, at a fixed moment | ISO 8601 date-time | 2026-10-01T12:00:00Z |
bpmn:timeDuration | Fire once, a period after the event activates | ISO 8601 duration | PT15M, P14D |
bpmn:timeCycle | Fire repeatedly | ISO 8601 repeating interval, or a cron expression | R5/PT10S, R/P1D, 0 2 * * * |
Supported cycle forms:
R[n]/<duration>— repeat every duration, starting one period after activation;Rwithout a number repeats indefinitely, e.g.R3/P2DorR/PT1H.R[n]/<start>/<duration>,R[n]/<duration>/<end>,R[n]/<start>/<end>— repeating intervals with an explicit first occurrence or end date.- Cron expressions with 5, 6, or 7 fields (optional seconds and year,
?treated as*), e.g.0 2 * * *for every night at 2:00.
Where each specification applies:
- Timer start event —
timeDatefor a one-shot start,timeCyclefor a schedule. - Intermediate catch and boundary events — typically
timeDuration(relative to when the token arrived or the activity started) ortimeDate; a non-interrupting boundary event additionally acceptstimeCycleto fire repeatedly.
Timer start event
Schedules process instance creation without any external trigger. A timeDate timer creates one instance at the given moment; a timeCycle timer creates an instance at each occurrence and re-arms itself until the cycle's repetitions or end date are exhausted. The schedule is registered when the process definition is deployed.
A timer start event inside an Event sub process additionally supports timeDuration, measured from when its containing scope becomes active.
Timer intermediate catch event
Pauses the flow: the token waits at the event until the timer fires — after a timeDuration measured from the token's arrival, or at an absolute timeDate — and then continues along the outgoing flow. Together with an Event-based gateway, a timer catch event commonly models a timeout branch racing against a message.
Timer boundary event
Arms a timer when the attached activity starts and cancels it when the activity completes. If the timer fires first:
- Interrupting (solid border) — the activity is cancelled and the token continues along the boundary event's outgoing flow. Use for timeouts and SLAs.
- Non-interrupting (dashed border,
cancelActivity="false") — the activity keeps running and a parallel token is created on the outgoing flow. With atimeCycle, the timer re-arms after each occurrence for as long as the activity is active — use for repeated reminders.
Related documentation
- Events overview — shared boundary event behavior: subscription lifecycle, interrupting vs non-interrupting.
- Event-based gateway — racing a timer against a message to model timeouts.
- User task — the activity most commonly guarded by timer boundary events.
XML example
A nightly schedule, a 24-hour delay, and a repeated reminder on a user task:
<bpmn:startEvent id="Start_Nightly" name="Every night at 2:00">
<bpmn:outgoing>Flow_1</bpmn:outgoing>
<bpmn:timerEventDefinition>
<bpmn:timeCycle>0 2 * * *</bpmn:timeCycle>
</bpmn:timerEventDefinition>
</bpmn:startEvent>
<bpmn:intermediateCatchEvent id="Wait_OneDay" name="Wait 24 hours">
<bpmn:incoming>Flow_1</bpmn:incoming>
<bpmn:outgoing>Flow_2</bpmn:outgoing>
<bpmn:timerEventDefinition>
<bpmn:timeDuration>P1D</bpmn:timeDuration>
</bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>
<bpmn:boundaryEvent id="Boundary_Reminder" name="Every 2 days"
attachedToRef="Activity_ApproveRequest" cancelActivity="false">
<bpmn:outgoing>Flow_SendReminder</bpmn:outgoing>
<bpmn:timerEventDefinition>
<bpmn:timeCycle>R/P2D</bpmn:timeCycle>
</bpmn:timerEventDefinition>
</bpmn:boundaryEvent>