SwimdraftPricingSign inStart free

Purchase requisition BPMN example

A purchase requisition is the internal request that starts most spending: someone needs goods or a service, and the organisation needs a record and an approval before money is committed. Teams map it because it is the front door to procurement, and a leaky front door means maverick spend, missing budget codes, and purchase orders raised after the invoice has already arrived.

This example models the requisition as a single pool with three lanes: Requester, Line manager, and Procurement. Two exclusive gateways carry the logic: a completeness check that loops incomplete requests back to the requester, and the approval decision itself. The rework loop is the choice worth noticing, because it shows correction as a cycle rather than a dead end.

Purchase requisition: BPMN 2.0 diagram
Purchase requisition 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
Need identified
Ends with
Requisition rejected · Purchase order sent
Lanes
Requester · Line manager · Procurement
Decisions
Details complete? · Requisition approved?

How to read this diagram

A need identified in the Requester lane starts the process, and the requester raises the requisition. Procurement screens the details and hits the first gateway, "Details complete?". The No branch (the default) sends the request back for correction, which loops to the requester raising it again; the Yes branch passes it to the Line manager lane for review.

At the second gateway, "Requisition approved?", the Yes branch drops into Procurement, which creates the purchase order and sends it to the supplier, ending at "Purchase order sent". The No branch, marked as the default flow, has Procurement notify the requester of the rejection and the process closes at "Requisition rejected". Every token therefore finishes at exactly one of two named end states.

BPMN elements used

ElementCountIn this diagram
Start event1Need identified
End event2Requisition rejected, Purchase order sent
Task1Screen requisition details
User task2Raise requisition, Review and approve request
Service task1Create purchase order
Send task3Return for correction, Notify requester of rejection, Send PO to supplier
Exclusive gateway2Details complete?, Requisition approved?
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_preq" name="Purchase requisition" processRef="Process_pool_preq" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_preq" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_preq">
      <bpmn2:lane id="lane_preq_req" name="Requester">
        <bpmn2:flowNodeRef>start_preq</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_preq_raise</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_preq_mgr" name="Line manager">
        <bpmn2:flowNodeRef>t_preq_approve</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_preq_approved</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_preq_proc" name="Procurement">
        <bpmn2:flowNodeRef>t_preq_screen</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_preq_complete</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_preq_return</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_preq_notify</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_preq_rejected</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_preq_po</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_preq_send</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_preq_done</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_preq" name="Need identified">
      <bpmn2:outgoing>fpreq1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="t_preq_raise" name="Raise requisition">
      <bpmn2:incoming>fpreq1</bpmn2:incoming>
      <bpmn2:incoming>fpreq6</bpmn2:incoming>
      <bpmn2:outgoing>fpreq2</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:task id="t_preq_screen" name="Screen requisition details">
      <bpmn2:incoming>fpreq2</bpmn2:incoming>
      <bpmn2:outgoing>fpreq3</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:exclusiveGateway id="g_preq_complete" name="Details complete?" default="fpreq5">
      <bpmn2:incoming>fpreq3</bpmn2:incoming>
      <bpmn2:outgoing>fpreq4</bpmn2:outgoing>
      <bpmn2:outgoing>fpreq5</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:sendTask id="t_preq_return" name="Return for correction">
      <bpmn2:incoming>fpreq5</bpmn2:incoming>
      <bpmn2:outgoing>fpreq6</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:userTask id="t_preq_approve" name="Review and approve request">
      <bpmn2:incoming>fpreq4</bpmn2:incoming>
      <bpmn2:outgoing>fpreq7</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_preq_approved" name="Requisition approved?" default="fpreq9">
      <bpmn2:incoming>fpreq7</bpmn2:incoming>
      <bpmn2:outgoing>fpreq8</bpmn2:outgoing>
      <bpmn2:outgoing>fpreq9</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:sendTask id="t_preq_notify" name="Notify requester of rejection">
      <bpmn2:incoming>fpreq9</bpmn2:incoming>
      <bpmn2:outgoing>fpreq10</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:endEvent id="end_preq_rejected" name="Requisition rejected">
      <bpmn2:incoming>fpreq10</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:serviceTask id="t_preq_po" name="Create purchase order">
      <bpmn2:incoming>fpreq8</bpmn2:incoming>
      <bpmn2:outgoing>fpreq11</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:sendTask id="t_preq_send" name="Send PO to supplier">
      <bpmn2:incoming>fpreq11</bpmn2:incoming>
      <bpmn2:outgoing>fpreq12</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:endEvent id="end_preq_done" name="Purchase order sent">
      <bpmn2:incoming>fpreq12</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="fpreq1" sourceRef="start_preq" targetRef="t_preq_raise" />
    <bpmn2:sequenceFlow id="fpreq2" sourceRef="t_preq_raise" targetRef="t_preq_screen" />
    <bpmn2:sequenceFlow id="fpreq3" sourceRef="t_preq_screen" targetRef="g_preq_complete" />
    <bpmn2:sequenceFlow id="fpreq4" name="Yes" sourceRef="g_preq_complete" targetRef="t_preq_approve">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fpreq5" name="No" sourceRef="g_preq_complete" targetRef="t_preq_return" />
    <bpmn2:sequenceFlow id="fpreq6" sourceRef="t_preq_return" targetRef="t_preq_raise" />
    <bpmn2:sequenceFlow id="fpreq7" sourceRef="t_preq_approve" targetRef="g_preq_approved" />
    <bpmn2:sequenceFlow id="fpreq8" name="Yes" sourceRef="g_preq_approved" targetRef="t_preq_po">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fpreq9" name="No" sourceRef="g_preq_approved" targetRef="t_preq_notify" />
    <bpmn2:sequenceFlow id="fpreq10" sourceRef="t_preq_notify" targetRef="end_preq_rejected" />
    <bpmn2:sequenceFlow id="fpreq11" sourceRef="t_preq_po" targetRef="t_preq_send" />
    <bpmn2:sequenceFlow id="fpreq12" sourceRef="t_preq_send" targetRef="end_preq_done" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_preq_di" bpmnElement="pool_preq" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1420" height="500" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_preq_req_di" bpmnElement="lane_preq_req" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1390" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_preq_mgr_di" bpmnElement="lane_preq_mgr" isHorizontal="true">
        <dc:Bounds x="50" y="150" width="1390" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_preq_proc_di" bpmnElement="lane_preq_proc" isHorizontal="true">
        <dc:Bounds x="50" y="280" width="1390" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_preq_di" bpmnElement="start_preq">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="92" y="101" width="76" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_raise_di" bpmnElement="t_preq_raise">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_screen_di" bpmnElement="t_preq_screen">
        <dc:Bounds x="380" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_preq_complete_di" bpmnElement="g_preq_complete">
        <dc:Bounds x="555" y="312" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="535" y="292" width="90" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_return_di" bpmnElement="t_preq_return">
        <dc:Bounds x="680" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_approve_di" bpmnElement="t_preq_approve">
        <dc:Bounds x="680" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_preq_approved_di" bpmnElement="g_preq_approved">
        <dc:Bounds x="855" y="182" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="824" y="162" width="112" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_notify_di" bpmnElement="t_preq_notify">
        <dc:Bounds x="980" y="407" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_preq_rejected_di" bpmnElement="end_preq_rejected">
        <dc:Bounds x="1162" y="429" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1131" y="471" width="99" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_po_di" bpmnElement="t_preq_po">
        <dc:Bounds x="980" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_preq_send_di" bpmnElement="t_preq_send">
        <dc:Bounds x="1130" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_preq_done_di" bpmnElement="end_preq_done">
        <dc:Bounds x="1312" y="319" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1279" y="361" width="102" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="fpreq1_di" bpmnElement="fpreq1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq2_di" bpmnElement="fpreq2">
        <di:waypoint x="330" y="77" />
        <di:waypoint x="360" y="77" />
        <di:waypoint x="360" y="337" />
        <di:waypoint x="380" y="337" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq3_di" bpmnElement="fpreq3">
        <di:waypoint x="480" y="337" />
        <di:waypoint x="555" y="337" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq4_di" bpmnElement="fpreq4">
        <di:waypoint x="605" y="337" />
        <di:waypoint x="660" y="337" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="680" y="207" />
        <bpmndi:BPMNLabel><dc:Bounds x="611" y="317" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq5_di" bpmnElement="fpreq5">
        <di:waypoint x="605" y="337" />
        <di:waypoint x="680" y="337" />
        <bpmndi:BPMNLabel><dc:Bounds x="611" y="343" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq6_di" bpmnElement="fpreq6">
        <di:waypoint x="780" y="337" />
        <di:waypoint x="810" y="337" />
        <di:waypoint x="810" y="392" />
        <di:waypoint x="210" y="392" />
        <di:waypoint x="210" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq7_di" bpmnElement="fpreq7">
        <di:waypoint x="780" y="207" />
        <di:waypoint x="855" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq8_di" bpmnElement="fpreq8">
        <di:waypoint x="905" y="207" />
        <di:waypoint x="960" y="207" />
        <di:waypoint x="960" y="337" />
        <di:waypoint x="980" y="337" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq9_di" bpmnElement="fpreq9">
        <di:waypoint x="905" y="207" />
        <di:waypoint x="960" y="207" />
        <di:waypoint x="960" y="447" />
        <di:waypoint x="980" y="447" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="213" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq10_di" bpmnElement="fpreq10">
        <di:waypoint x="1080" y="447" />
        <di:waypoint x="1162" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq11_di" bpmnElement="fpreq11">
        <di:waypoint x="1080" y="337" />
        <di:waypoint x="1130" y="337" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fpreq12_di" bpmnElement="fpreq12">
        <di:waypoint x="1230" y="337" />
        <di:waypoint x="1312" y="337" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why loop incomplete requisitions back instead of ending the process?

Because in reality an incomplete request is corrected, not abandoned. Modelling the correction as a sequence flow back to "Raise requisition" keeps one process instance alive through the fix. A separate end event would force the requester to start again from scratch, which misrepresents how the work actually happens.

Should the line manager be a lane or a separate pool?

A lane. The manager works inside the same organisation and the same process instance, so control passes with a sequence flow. Pools are for independent participants that communicate by message, such as the supplier. If you gave the manager a pool, every handoff would need message flows, adding complexity without adding meaning.

How would I extend this model with an escalation for slow approvals?

Attach a timer to the approval step: model "Review and approve request" waiting alongside an intermediate timer event, or use a boundary timer in a fuller notation. When the deadline fires, route to a task that escalates to the manager's manager, then rejoin the flow before the approval gateway.

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