Supplier evaluation BPMN example
Supplier evaluation is the periodic health check on the vendors you already trade with: how they score on spend, delivery, and quality, and what happens when they fall short. Teams map it because evaluations that live in spreadsheets happen inconsistently or not at all, and underperforming suppliers drift on for years because nobody owns the consequence of a bad score.
The model is one pool with Procurement, Quality, and Category manager lanes. A parallel gateway is the feature worth noticing: spend analysis and the delivery audit genuinely do not depend on each other, so the model forks them with a parallel split and joins them before scoring, which halves the elapsed time compared with running them in sequence.
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
Two streams of work run at once in this flow. When the evaluation falls due, a parallel gateway in the Procurement lane forks the token: Procurement compiles the spend report while Quality audits delivery performance. A parallel join waits for both to finish, then the Category manager scores the supplier using a business rule task that applies the weighted scorecard.
The single decision, "Score below threshold?", follows the scoring. On the Yes branch the category manager drafts an improvement plan and Procurement sends it to the supplier, ending at "Improvement plan issued". The default No branch has Procurement update the preferred supplier list, and the process completes at "Evaluation completed". Neither outcome removes the supplier; that would be a separate offboarding process.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Evaluation due |
| End event | 2 | Improvement plan issued, Evaluation completed |
| Task | 1 | Audit delivery performance |
| User task | 1 | Draft improvement plan |
| Service task | 2 | Compile spend report, Update preferred list |
| Send task | 1 | Send plan to supplier |
| Business rule task | 1 | Score supplier |
| Exclusive gateway | 1 | Score below threshold? |
| 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_se" name="Supplier evaluation" processRef="Process_pool_se" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_se" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_se">
<bpmn2:lane id="lane_se_proc" name="Procurement">
<bpmn2:flowNodeRef>start_se</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_se_split</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_se_spend</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_se_sendplan</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_se_plan</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_se_update</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_se_done</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_se_qual" name="Quality">
<bpmn2:flowNodeRef>t_se_quality</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_se_cat" name="Category manager">
<bpmn2:flowNodeRef>g_se_join</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_se_score</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_se_threshold</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_se_plan</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_se" name="Evaluation due">
<bpmn2:outgoing>fse1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:parallelGateway id="g_se_split">
<bpmn2:incoming>fse1</bpmn2:incoming>
<bpmn2:outgoing>fse2</bpmn2:outgoing>
<bpmn2:outgoing>fse3</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:serviceTask id="t_se_spend" name="Compile spend report">
<bpmn2:incoming>fse2</bpmn2:incoming>
<bpmn2:outgoing>fse4</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:task id="t_se_quality" name="Audit delivery performance">
<bpmn2:incoming>fse3</bpmn2:incoming>
<bpmn2:outgoing>fse5</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:parallelGateway id="g_se_join">
<bpmn2:incoming>fse4</bpmn2:incoming>
<bpmn2:incoming>fse5</bpmn2:incoming>
<bpmn2:outgoing>fse6</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:businessRuleTask id="t_se_score" name="Score supplier">
<bpmn2:incoming>fse6</bpmn2:incoming>
<bpmn2:outgoing>fse7</bpmn2:outgoing>
</bpmn2:businessRuleTask>
<bpmn2:exclusiveGateway id="g_se_threshold" name="Score below threshold?" default="fse9">
<bpmn2:incoming>fse7</bpmn2:incoming>
<bpmn2:outgoing>fse8</bpmn2:outgoing>
<bpmn2:outgoing>fse9</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="t_se_plan" name="Draft improvement plan">
<bpmn2:incoming>fse8</bpmn2:incoming>
<bpmn2:outgoing>fse10</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sendTask id="t_se_sendplan" name="Send plan to supplier">
<bpmn2:incoming>fse10</bpmn2:incoming>
<bpmn2:outgoing>fse11</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_se_plan" name="Improvement plan issued">
<bpmn2:incoming>fse11</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:serviceTask id="t_se_update" name="Update preferred list">
<bpmn2:incoming>fse9</bpmn2:incoming>
<bpmn2:outgoing>fse12</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:endEvent id="end_se_done" name="Evaluation completed">
<bpmn2:incoming>fse12</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="fse1" sourceRef="start_se" targetRef="g_se_split" />
<bpmn2:sequenceFlow id="fse2" sourceRef="g_se_split" targetRef="t_se_spend" />
<bpmn2:sequenceFlow id="fse3" sourceRef="g_se_split" targetRef="t_se_quality" />
<bpmn2:sequenceFlow id="fse4" sourceRef="t_se_spend" targetRef="g_se_join" />
<bpmn2:sequenceFlow id="fse5" sourceRef="t_se_quality" targetRef="g_se_join" />
<bpmn2:sequenceFlow id="fse6" sourceRef="g_se_join" targetRef="t_se_score" />
<bpmn2:sequenceFlow id="fse7" sourceRef="t_se_score" targetRef="g_se_threshold" />
<bpmn2:sequenceFlow id="fse8" name="Yes" sourceRef="g_se_threshold" targetRef="t_se_plan">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="fse9" name="No" sourceRef="g_se_threshold" targetRef="t_se_update" />
<bpmn2:sequenceFlow id="fse10" sourceRef="t_se_plan" targetRef="t_se_sendplan" />
<bpmn2:sequenceFlow id="fse11" sourceRef="t_se_sendplan" targetRef="end_se_plan" />
<bpmn2:sequenceFlow id="fse12" sourceRef="t_se_update" targetRef="end_se_done" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_se_di" bpmnElement="pool_se" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1420" height="500" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_se_proc_di" bpmnElement="lane_se_proc" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1390" height="240" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_se_qual_di" bpmnElement="lane_se_qual" isHorizontal="true">
<dc:Bounds x="50" y="260" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_se_cat_di" bpmnElement="lane_se_cat" isHorizontal="true">
<dc:Bounds x="50" y="390" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_se_di" bpmnElement="start_se">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="93" y="101" width="75" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_se_split_di" bpmnElement="g_se_split">
<dc:Bounds x="255" y="52" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_se_spend_di" bpmnElement="t_se_spend">
<dc:Bounds x="380" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_se_quality_di" bpmnElement="t_se_quality">
<dc:Bounds x="380" y="277" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_se_join_di" bpmnElement="g_se_join">
<dc:Bounds x="555" y="422" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_se_score_di" bpmnElement="t_se_score">
<dc:Bounds x="680" y="407" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_se_threshold_di" bpmnElement="g_se_threshold">
<dc:Bounds x="855" y="422" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="822" y="402" width="117" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_se_plan_di" bpmnElement="t_se_plan">
<dc:Bounds x="980" y="407" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_se_sendplan_di" bpmnElement="t_se_sendplan">
<dc:Bounds x="1130" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_se_plan_di" bpmnElement="end_se_plan">
<dc:Bounds x="1312" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1268" y="101" width="125" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_se_update_di" bpmnElement="t_se_update">
<dc:Bounds x="980" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_se_done_di" bpmnElement="end_se_done">
<dc:Bounds x="1162" y="169" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1126" y="211" width="108" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="fse1_di" bpmnElement="fse1">
<di:waypoint x="148" y="77" />
<di:waypoint x="255" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse2_di" bpmnElement="fse2">
<di:waypoint x="305" y="77" />
<di:waypoint x="380" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse3_di" bpmnElement="fse3">
<di:waypoint x="305" y="77" />
<di:waypoint x="360" y="77" />
<di:waypoint x="360" y="317" />
<di:waypoint x="380" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse4_di" bpmnElement="fse4">
<di:waypoint x="480" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="447" />
<di:waypoint x="555" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse5_di" bpmnElement="fse5">
<di:waypoint x="480" y="317" />
<di:waypoint x="510" y="317" />
<di:waypoint x="510" y="447" />
<di:waypoint x="555" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse6_di" bpmnElement="fse6">
<di:waypoint x="605" y="447" />
<di:waypoint x="680" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse7_di" bpmnElement="fse7">
<di:waypoint x="780" y="447" />
<di:waypoint x="855" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse8_di" bpmnElement="fse8">
<di:waypoint x="905" y="447" />
<di:waypoint x="980" y="447" />
<bpmndi:BPMNLabel><dc:Bounds x="911" y="427" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse9_di" bpmnElement="fse9">
<di:waypoint x="905" y="447" />
<di:waypoint x="960" y="447" />
<di:waypoint x="960" y="77" />
<di:waypoint x="980" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="911" y="453" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse10_di" bpmnElement="fse10">
<di:waypoint x="1080" y="447" />
<di:waypoint x="1110" y="447" />
<di:waypoint x="1110" y="77" />
<di:waypoint x="1130" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse11_di" bpmnElement="fse11">
<di:waypoint x="1230" y="77" />
<di:waypoint x="1312" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fse12_di" bpmnElement="fse12">
<di:waypoint x="1080" y="77" />
<di:waypoint x="1110" y="77" />
<di:waypoint x="1110" y="187" />
<di:waypoint x="1162" y="187" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why a parallel gateway here instead of two exclusive branches?
Exclusive branches would mean choosing one activity or the other, but an evaluation needs both the spend report and the delivery audit. The parallel split releases a token down each path simultaneously, and the parallel join holds the flow until both arrive. That both-must-finish semantics is exactly what a scorecard needs.
What makes "Score supplier" a business rule task?
The score comes from applying a fixed scorecard, weighted criteria against gathered data, which is decision logic rather than human judgement or system integration. A business rule task signals that the logic could live in a decision table or rules engine. If your managers score by feel, model it as a user task instead.
How should the follow up on an improvement plan be modelled?
Keep it out of this process. The evaluation ends when the plan is issued; monitoring the supplier against the plan is a separate process that starts on a timer, say ninety days later, and re-runs the scoring. Bundling months of monitoring into this diagram would leave the instance running long after the evaluation itself is finished.
Related BPMN examples
Purchase requisition
A purchase requisition process as a BPMN 2.0 diagram: request, completeness check, manager approval, and PO creation. View the swimlanes and download the .bpmn file free.
Purchase order approval
A purchase order approval workflow as a BPMN 2.0 diagram, with a value threshold routing orders to the budget holder or finance. Free .bpmn file download included.
Vendor onboarding
A vendor onboarding process as a BPMN 2.0 diagram: document collection, sanctions screening, bank verification, and activation. Download the .bpmn file free.
Tender process
A competitive tender process as a BPMN 2.0 diagram with a supplier pool, timer deadline, bid scoring, and award. Download the .bpmn file free and edit it online.
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