Performance review BPMN example
Performance reviews are mapped less for efficiency and more for fairness: every employee should go through the same stages in the same order, and HR needs evidence that they did. The common failure modes are assessments written after the meeting they were supposed to inform, and objectives that are discussed but never agreed, leaving both sides with a different memory of the outcome.
This model is a single pool with HR, Employee, and Manager lanes. A parallel gateway lets the self assessment and the manager appraisal happen simultaneously, and both must exist before the meeting. The feature worth noticing is the rework loop: if objectives are not agreed at the meeting, the flow returns to a revision task and the meeting recurs, which is more honest than pretending agreement always happens first time.
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
HR opens the cycle at the "Review cycle opened" start event and issues the review forms. A parallel gateway then splits the flow: the Employee completes a self assessment while the Manager drafts the appraisal, and the joining gateway holds the process until both documents are in. This pairing guarantees that neither party walks into the meeting having seen only their own version of events.
With both assessments ready, the Manager holds the review meeting, leading to the exclusive gateway "Objectives agreed?". The No branch, marked as the default, sends the flow to "Revise objectives" and loops back to the meeting, and the loop repeats until agreement is reached. On Yes, HR records the review outcome and the process ends at "Review completed", a single end event because a review cannot fail, only take longer.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Review cycle opened |
| End event | 1 | Review completed |
| User task | 4 | Complete self assessment, Draft manager appraisal, Hold review meeting, Revise objectives |
| Service task | 2 | Issue review forms, Record review outcome |
| Exclusive gateway | 1 | Objectives agreed? |
| 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_pr" name="Performance review" processRef="Process_pool_pr" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_pr" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_pr">
<bpmn2:lane id="lane_pr_hr" name="HR">
<bpmn2:flowNodeRef>start_pr</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_pr_forms</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_pr_split</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_pr_record</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_pr</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_pr_emp" name="Employee">
<bpmn2:flowNodeRef>t_pr_self</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_pr_mgr" name="Manager">
<bpmn2:flowNodeRef>t_pr_draft</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_pr_join</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_pr_meet</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_pr_agree</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_pr_revise</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_pr" name="Review cycle opened">
<bpmn2:outgoing>fpr1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:serviceTask id="t_pr_forms" name="Issue review forms">
<bpmn2:incoming>fpr1</bpmn2:incoming>
<bpmn2:outgoing>fpr2</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:parallelGateway id="g_pr_split">
<bpmn2:incoming>fpr2</bpmn2:incoming>
<bpmn2:outgoing>fpr3</bpmn2:outgoing>
<bpmn2:outgoing>fpr4</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:userTask id="t_pr_self" name="Complete self assessment">
<bpmn2:incoming>fpr3</bpmn2:incoming>
<bpmn2:outgoing>fpr5</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="t_pr_draft" name="Draft manager appraisal">
<bpmn2:incoming>fpr4</bpmn2:incoming>
<bpmn2:outgoing>fpr6</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:parallelGateway id="g_pr_join">
<bpmn2:incoming>fpr5</bpmn2:incoming>
<bpmn2:incoming>fpr6</bpmn2:incoming>
<bpmn2:outgoing>fpr7</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:userTask id="t_pr_meet" name="Hold review meeting">
<bpmn2:incoming>fpr7</bpmn2:incoming>
<bpmn2:incoming>fpr11</bpmn2:incoming>
<bpmn2:outgoing>fpr8</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_pr_agree" name="Objectives agreed?" default="fpr10">
<bpmn2:incoming>fpr8</bpmn2:incoming>
<bpmn2:outgoing>fpr9</bpmn2:outgoing>
<bpmn2:outgoing>fpr10</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="t_pr_revise" name="Revise objectives">
<bpmn2:incoming>fpr10</bpmn2:incoming>
<bpmn2:outgoing>fpr11</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:serviceTask id="t_pr_record" name="Record review outcome">
<bpmn2:incoming>fpr9</bpmn2:incoming>
<bpmn2:outgoing>fpr12</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:endEvent id="end_pr" name="Review completed">
<bpmn2:incoming>fpr12</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="fpr1" sourceRef="start_pr" targetRef="t_pr_forms" />
<bpmn2:sequenceFlow id="fpr2" sourceRef="t_pr_forms" targetRef="g_pr_split" />
<bpmn2:sequenceFlow id="fpr3" sourceRef="g_pr_split" targetRef="t_pr_self" />
<bpmn2:sequenceFlow id="fpr4" sourceRef="g_pr_split" targetRef="t_pr_draft" />
<bpmn2:sequenceFlow id="fpr5" sourceRef="t_pr_self" targetRef="g_pr_join" />
<bpmn2:sequenceFlow id="fpr6" sourceRef="t_pr_draft" targetRef="g_pr_join" />
<bpmn2:sequenceFlow id="fpr7" sourceRef="g_pr_join" targetRef="t_pr_meet" />
<bpmn2:sequenceFlow id="fpr8" sourceRef="t_pr_meet" targetRef="g_pr_agree" />
<bpmn2:sequenceFlow id="fpr9" name="Yes" sourceRef="g_pr_agree" targetRef="t_pr_record">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="fpr10" name="No" sourceRef="g_pr_agree" targetRef="t_pr_revise" />
<bpmn2:sequenceFlow id="fpr11" sourceRef="t_pr_revise" targetRef="t_pr_meet" />
<bpmn2:sequenceFlow id="fpr12" sourceRef="t_pr_record" targetRef="end_pr" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_pr_di" bpmnElement="pool_pr" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1420" height="390" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_pr_hr_di" bpmnElement="lane_pr_hr" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_pr_emp_di" bpmnElement="lane_pr_emp" isHorizontal="true">
<dc:Bounds x="50" y="150" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_pr_mgr_di" bpmnElement="lane_pr_mgr" isHorizontal="true">
<dc:Bounds x="50" y="280" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_pr_di" bpmnElement="start_pr">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="77" y="101" width="106" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_pr_forms_di" bpmnElement="t_pr_forms">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_pr_split_di" bpmnElement="g_pr_split">
<dc:Bounds x="405" y="52" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_pr_self_di" bpmnElement="t_pr_self">
<dc:Bounds x="530" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_pr_draft_di" bpmnElement="t_pr_draft">
<dc:Bounds x="530" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_pr_join_di" bpmnElement="g_pr_join">
<dc:Bounds x="705" y="312" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_pr_meet_di" bpmnElement="t_pr_meet">
<dc:Bounds x="830" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_pr_agree_di" bpmnElement="g_pr_agree">
<dc:Bounds x="1005" y="312" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="982" y="292" width="97" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_pr_revise_di" bpmnElement="t_pr_revise">
<dc:Bounds x="1130" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_pr_record_di" bpmnElement="t_pr_record">
<dc:Bounds x="1130" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_pr_di" bpmnElement="end_pr">
<dc:Bounds x="1312" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1284" y="101" width="92" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="fpr1_di" bpmnElement="fpr1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr2_di" bpmnElement="fpr2">
<di:waypoint x="330" y="77" />
<di:waypoint x="405" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr3_di" bpmnElement="fpr3">
<di:waypoint x="455" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="207" />
<di:waypoint x="530" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr4_di" bpmnElement="fpr4">
<di:waypoint x="455" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="337" />
<di:waypoint x="530" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr5_di" bpmnElement="fpr5">
<di:waypoint x="630" y="207" />
<di:waypoint x="660" y="207" />
<di:waypoint x="660" y="337" />
<di:waypoint x="705" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr6_di" bpmnElement="fpr6">
<di:waypoint x="630" y="337" />
<di:waypoint x="705" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr7_di" bpmnElement="fpr7">
<di:waypoint x="755" y="337" />
<di:waypoint x="830" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr8_di" bpmnElement="fpr8">
<di:waypoint x="930" y="337" />
<di:waypoint x="1005" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr9_di" bpmnElement="fpr9">
<di:waypoint x="1055" y="337" />
<di:waypoint x="1110" y="337" />
<di:waypoint x="1110" y="77" />
<di:waypoint x="1130" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="1061" y="317" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr10_di" bpmnElement="fpr10">
<di:waypoint x="1055" y="337" />
<di:waypoint x="1130" y="337" />
<bpmndi:BPMNLabel><dc:Bounds x="1061" y="343" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr11_di" bpmnElement="fpr11">
<di:waypoint x="1230" y="337" />
<di:waypoint x="1260" y="337" />
<di:waypoint x="1260" y="392" />
<di:waypoint x="810" y="392" />
<di:waypoint x="810" y="337" />
<di:waypoint x="830" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fpr12_di" bpmnElement="fpr12">
<di:waypoint x="1230" y="77" />
<di:waypoint x="1312" y="77" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Does the rework loop risk running forever?
In the model, yes, deliberately: BPMN describes what may happen, and revision genuinely can recur. In practice you would bound it. Attach a boundary timer to the meeting task or count iterations and escalate to HR after, say, the second loop. Modelling the escape route explicitly is better than assuming goodwill converges.
Why do the assessments run in parallel rather than one after the other?
Sequencing them would imply one document should inform the other, which biases the conversation. The parallel gateway states they are independent, and the join makes the meeting wait for both. It also halves the elapsed time, which matters when HR is chasing hundreds of reviews to a deadline.
Where would calibration or moderation fit in this model?
Calibration compares outcomes across employees, so it belongs after "Record review outcome" but spans many process instances at once. Within a single instance model you would add a "Calibrate ratings" task in the HR lane before the end event, with an exclusive gateway looping back to the meeting if a rating is adjusted.
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.
Employee offboarding
Employee offboarding as a BPMN 2.0 diagram: handover planning, a last day timer, parallel access revocation, and final pay. 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.
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