Employee offboarding BPMN example
Employee offboarding is the mirror of onboarding and is mapped for a harder reason: risk. A leaver who keeps system access after their last day is a security incident waiting to happen, and unreturned equipment is a cost that quietly accumulates. Teams document the process because the steps are spread across HR, IT, and the line manager, and because most of them must not happen until a specific date arrives.
The model is a single pool with HR, IT, and Line manager lanes. Its distinctive feature is an intermediate timer event that holds the process until the last working day, keeping handover planning before the timer and revocation after it. A parallel gateway then fires the exit interview, access revocation, and equipment collection together, because none of the three depends on the others.
Standard BPMN 2.0 interchange XML: opens in Camunda Modeler, Signavio, Bizagi, and any other compliant tool.
The process at a glance
How to read this diagram
From the "Resignation received" start event in the HR lane, HR confirms the leaving date and the Line manager plans the handover. The token then waits at the "Last working day" timer event: nothing after that point may happen early, and the timer makes the wait explicit rather than burying it in a task name. When the date arrives, a parallel gateway splits the flow three ways.
In parallel, HR holds the exit interview while IT revokes system access and collects the laptop, pass, and any other equipment. The joining parallel gateway waits for all three, after which HR processes the final pay and the flow finishes at the "Employee offboarded" end event. There is deliberately only one end event: unlike onboarding, an offboarding process has no rejection path, it simply must complete.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Resignation received |
| End event | 1 | Employee offboarded |
| Intermediate catch event | 1 | Last working day |
| Task | 1 | Collect equipment |
| User task | 3 | Confirm leaving date, Plan handover, Hold exit interview |
| Service task | 2 | Revoke system access, Process final pay |
| Parallel gateway | 2 |
View the BPMN 2.0 XML for this diagram
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="swimdraft" exporterVersion="1.0">
<bpmn2:collaboration id="Collaboration_1">
<bpmn2:participant id="pool_off" name="Employee offboarding" processRef="Process_pool_off" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_off" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_off">
<bpmn2:lane id="lane_off_hr" name="HR">
<bpmn2:flowNodeRef>start_off</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_off_date</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>ev_off_lastday</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_off_split</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_off_exit</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_off_join</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_off_pay</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_off</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_off_it" name="IT">
<bpmn2:flowNodeRef>t_off_revoke</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_off_kit</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_off_mgr" name="Line manager">
<bpmn2:flowNodeRef>t_off_plan</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_off" name="Resignation received">
<bpmn2:outgoing>foff1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="t_off_date" name="Confirm leaving date">
<bpmn2:incoming>foff1</bpmn2:incoming>
<bpmn2:outgoing>foff2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="t_off_plan" name="Plan handover">
<bpmn2:incoming>foff2</bpmn2:incoming>
<bpmn2:outgoing>foff3</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:intermediateCatchEvent id="ev_off_lastday" name="Last working day">
<bpmn2:incoming>foff3</bpmn2:incoming>
<bpmn2:outgoing>foff4</bpmn2:outgoing>
<bpmn2:timerEventDefinition id="ev_off_lastday_def" />
</bpmn2:intermediateCatchEvent>
<bpmn2:parallelGateway id="g_off_split">
<bpmn2:incoming>foff4</bpmn2:incoming>
<bpmn2:outgoing>foff5</bpmn2:outgoing>
<bpmn2:outgoing>foff6</bpmn2:outgoing>
<bpmn2:outgoing>foff7</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:userTask id="t_off_exit" name="Hold exit interview">
<bpmn2:incoming>foff5</bpmn2:incoming>
<bpmn2:outgoing>foff8</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:serviceTask id="t_off_revoke" name="Revoke system access">
<bpmn2:incoming>foff6</bpmn2:incoming>
<bpmn2:outgoing>foff9</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:task id="t_off_kit" name="Collect equipment">
<bpmn2:incoming>foff7</bpmn2:incoming>
<bpmn2:outgoing>foff10</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:parallelGateway id="g_off_join">
<bpmn2:incoming>foff8</bpmn2:incoming>
<bpmn2:incoming>foff9</bpmn2:incoming>
<bpmn2:incoming>foff10</bpmn2:incoming>
<bpmn2:outgoing>foff11</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:serviceTask id="t_off_pay" name="Process final pay">
<bpmn2:incoming>foff11</bpmn2:incoming>
<bpmn2:outgoing>foff12</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:endEvent id="end_off" name="Employee offboarded">
<bpmn2:incoming>foff12</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="foff1" sourceRef="start_off" targetRef="t_off_date" />
<bpmn2:sequenceFlow id="foff2" sourceRef="t_off_date" targetRef="t_off_plan" />
<bpmn2:sequenceFlow id="foff3" sourceRef="t_off_plan" targetRef="ev_off_lastday" />
<bpmn2:sequenceFlow id="foff4" sourceRef="ev_off_lastday" targetRef="g_off_split" />
<bpmn2:sequenceFlow id="foff5" sourceRef="g_off_split" targetRef="t_off_exit" />
<bpmn2:sequenceFlow id="foff6" sourceRef="g_off_split" targetRef="t_off_revoke" />
<bpmn2:sequenceFlow id="foff7" sourceRef="g_off_split" targetRef="t_off_kit" />
<bpmn2:sequenceFlow id="foff8" sourceRef="t_off_exit" targetRef="g_off_join" />
<bpmn2:sequenceFlow id="foff9" sourceRef="t_off_revoke" targetRef="g_off_join" />
<bpmn2:sequenceFlow id="foff10" sourceRef="t_off_kit" targetRef="g_off_join" />
<bpmn2:sequenceFlow id="foff11" sourceRef="g_off_join" targetRef="t_off_pay" />
<bpmn2:sequenceFlow id="foff12" sourceRef="t_off_pay" targetRef="end_off" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_off_di" bpmnElement="pool_off" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1420" height="500" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_off_hr_di" bpmnElement="lane_off_hr" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_off_it_di" bpmnElement="lane_off_it" isHorizontal="true">
<dc:Bounds x="50" y="150" width="1390" height="240" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_off_mgr_di" bpmnElement="lane_off_mgr" isHorizontal="true">
<dc:Bounds x="50" y="390" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_off_di" bpmnElement="start_off">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="78" y="101" width="105" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_off_date_di" bpmnElement="t_off_date">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_off_plan_di" bpmnElement="t_off_plan">
<dc:Bounds x="380" y="407" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_off_lastday_di" bpmnElement="ev_off_lastday">
<dc:Bounds x="562" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="538" y="101" width="85" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_off_split_di" bpmnElement="g_off_split">
<dc:Bounds x="705" y="52" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_off_exit_di" bpmnElement="t_off_exit">
<dc:Bounds x="830" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_off_revoke_di" bpmnElement="t_off_revoke">
<dc:Bounds x="830" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_off_kit_di" bpmnElement="t_off_kit">
<dc:Bounds x="830" y="277" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_off_join_di" bpmnElement="g_off_join">
<dc:Bounds x="1005" y="52" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_off_pay_di" bpmnElement="t_off_pay">
<dc:Bounds x="1130" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_off_di" bpmnElement="end_off">
<dc:Bounds x="1312" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1277" y="101" width="107" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="foff1_di" bpmnElement="foff1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff2_di" bpmnElement="foff2">
<di:waypoint x="330" y="77" />
<di:waypoint x="360" y="77" />
<di:waypoint x="360" y="447" />
<di:waypoint x="380" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff3_di" bpmnElement="foff3">
<di:waypoint x="480" y="447" />
<di:waypoint x="510" y="447" />
<di:waypoint x="510" y="77" />
<di:waypoint x="562" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff4_di" bpmnElement="foff4">
<di:waypoint x="598" y="77" />
<di:waypoint x="705" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff5_di" bpmnElement="foff5">
<di:waypoint x="755" y="77" />
<di:waypoint x="830" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff6_di" bpmnElement="foff6">
<di:waypoint x="755" y="77" />
<di:waypoint x="810" y="77" />
<di:waypoint x="810" y="207" />
<di:waypoint x="830" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff7_di" bpmnElement="foff7">
<di:waypoint x="755" y="77" />
<di:waypoint x="810" y="77" />
<di:waypoint x="810" y="317" />
<di:waypoint x="830" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff8_di" bpmnElement="foff8">
<di:waypoint x="930" y="77" />
<di:waypoint x="1005" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff9_di" bpmnElement="foff9">
<di:waypoint x="930" y="207" />
<di:waypoint x="960" y="207" />
<di:waypoint x="960" y="77" />
<di:waypoint x="1005" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff10_di" bpmnElement="foff10">
<di:waypoint x="930" y="317" />
<di:waypoint x="960" y="317" />
<di:waypoint x="960" y="77" />
<di:waypoint x="1005" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff11_di" bpmnElement="foff11">
<di:waypoint x="1055" y="77" />
<di:waypoint x="1130" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="foff12_di" bpmnElement="foff12">
<di:waypoint x="1230" y="77" />
<di:waypoint x="1312" y="77" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why model the last working day as a timer event rather than a task?
Waiting is not work. A task implies someone is actively doing something, while an intermediate timer catch event says the process is paused until a date arrives, which matches reality here. Timer events also give tools something to schedule against if you later automate the process in an engine such as Camunda.
Where would an escalation attach if equipment is never returned?
The cleanest extension is a boundary timer on the "Collect equipment" task: if the task is still open after, say, ten days, an escalation flow routes to a recovery or invoicing step. This example keeps to plain sequence flows for readability, but that task boundary is the natural attachment point.
Should payroll have its own lane for the final pay step?
It depends on how your organisation splits responsibility. One task rarely justifies a lane, so final pay sits with HR here. If your payroll team also handles pension notifications, benefit cancellations, and P45 issue as separate steps, promote those to their own lane so the diagram reflects the real ownership.
Related BPMN examples
Employee onboarding
An employee onboarding process diagram in BPMN 2.0: background checks, parallel IT setup, and induction. View the swimlane diagram and download the .bpmn file free.
Recruitment
A recruitment process in BPMN 2.0: screening, interviews, offer, and a candidate pool with message flows. View the diagram and download the .bpmn file free.
Leave request
A leave request process as a BPMN 2.0 diagram: balance check, manager approval, and booking confirmation. View the swimlanes and download the .bpmn file free.
Performance review
A performance review process in BPMN 2.0: parallel self and manager assessments, a review meeting, and an objectives rework loop. Download the .bpmn file free.
Generate your own version of this diagram
Describe how the process works in your organisation: plain English, meeting notes, a transcript, or a spreadsheet. Swimdraft turns it into a spec-validated BPMN 2.0 diagram you can edit in the browser and export as .bpmn, SVG, or PNG.
Start freeNo credit card required