SwimdraftPricingSign inStart free

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.

Performance review: BPMN 2.0 diagram
Performance review process modelled as a BPMN 2.0 diagram

Standard BPMN 2.0 interchange XML: opens in Camunda Modeler, Signavio, Bizagi, and any other compliant tool.

The process at a glance

Starts when
Review cycle opened
Ends with
Review completed
Lanes
HR · Employee · Manager
Decisions
Objectives agreed?

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

ElementCountIn this diagram
Start event1Review cycle opened
End event1Review completed
User task4Complete self assessment, Draft manager appraisal, Hold review meeting, Revise objectives
Service task2Issue review forms, Record review outcome
Exclusive gateway1Objectives agreed?
Parallel gateway2
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

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 free

No credit card required