Procure-to-pay with three-way match
P2P collaboration from purchase requisition to supplier payment: budget-holder approval, PO issue, goods receipt and invoice receipt in parallel, a three-way match (PO, goods receipt, invoice) with a variance-resolution loop, then payment and remittance. Four lanes and five message flows to the supplier. Illustrative tolerances.
Rendering…
Make it your own.
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="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="Process_ProcureToPay_defs" targetNamespace="http://flowss.ai/bpmn">
<bpmn:process id="Process_ProcureToPay" name="Procure to pay" isExecutable="false">
<bpmn:documentation>Procure-to-pay (P2P). A requisition is approved by the budget holder before procurement sources the supplier and issues the purchase order. Goods and the supplier's invoice may arrive in either order, so they are awaited in parallel and joined before the three-way match of purchase order, goods receipt and invoice. A variance outside tolerance is resolved with the supplier (credit note or corrected invoice) and matched again. The ±2 % price tolerance is an illustrative policy value.</bpmn:documentation>
<bpmn:laneSet id="Process_ProcureToPay_lanes">
<bpmn:lane id="Lane_Requester" name="Requester"><bpmn:flowNodeRef>Start_Need</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Requisition</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_NotifyReject</bpmn:flowNodeRef><bpmn:flowNodeRef>End_Rejected</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_GoodsReceipt</bpmn:flowNodeRef></bpmn:lane>
<bpmn:lane id="Lane_BudgetHolder" name="Budget holder"><bpmn:flowNodeRef>Task_ApproveReq</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_ReqApproved</bpmn:flowNodeRef></bpmn:lane>
<bpmn:lane id="Lane_Procurement" name="Procurement"><bpmn:flowNodeRef>Task_CreatePO</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_SendPO</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_AwaitFork</bpmn:flowNodeRef></bpmn:lane>
<bpmn:lane id="Lane_AP" name="Accounts payable"><bpmn:flowNodeRef>Task_ReceiveInvoice</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_AwaitJoin</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_MatchMerge</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Match</bpmn:flowNodeRef><bpmn:flowNodeRef>Gw_Tolerance</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Resolve</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_PaymentRun</bpmn:flowNodeRef><bpmn:flowNodeRef>Task_Pay</bpmn:flowNodeRef><bpmn:flowNodeRef>End_Paid</bpmn:flowNodeRef></bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="Start_Need" name="Purchase need identified"/>
<bpmn:userTask id="Task_Requisition" name="Raise purchase requisition"/>
<bpmn:userTask id="Task_ApproveReq" name="Approve requisition"/>
<bpmn:exclusiveGateway id="Gw_ReqApproved" name="Requisition approved?" default="Flow_5"/>
<bpmn:sendTask id="Task_NotifyReject" name="Notify requester of rejection"/>
<bpmn:endEvent id="End_Rejected" name="Requisition rejected"/>
<bpmn:userTask id="Task_CreatePO" name="Select supplier and create PO"/>
<bpmn:sendTask id="Task_SendPO" name="Send purchase order"/>
<bpmn:parallelGateway id="Gw_AwaitFork"/>
<bpmn:userTask id="Task_GoodsReceipt" name="Post goods receipt"/>
<bpmn:receiveTask id="Task_ReceiveInvoice" name="Receive supplier invoice"/>
<bpmn:parallelGateway id="Gw_AwaitJoin"/>
<bpmn:exclusiveGateway id="Gw_MatchMerge"/>
<bpmn:serviceTask id="Task_Match" name="Perform three-way match"/>
<bpmn:exclusiveGateway id="Gw_Tolerance" name="Within tolerance?" default="Flow_16"/>
<bpmn:userTask id="Task_Resolve" name="Resolve variance"/>
<bpmn:serviceTask id="Task_PaymentRun" name="Release invoice to payment run"/>
<bpmn:sendTask id="Task_Pay" name="Pay supplier"/>
<bpmn:endEvent id="End_Paid" name="Invoice paid"/>
<bpmn:sequenceFlow id="Flow_1" sourceRef="Start_Need" targetRef="Task_Requisition"/>
<bpmn:sequenceFlow id="Flow_2" sourceRef="Task_Requisition" targetRef="Task_ApproveReq"/>
<bpmn:sequenceFlow id="Flow_3" sourceRef="Task_ApproveReq" targetRef="Gw_ReqApproved"/>
<bpmn:sequenceFlow id="Flow_4" name="rejected" sourceRef="Gw_ReqApproved" targetRef="Task_NotifyReject"><bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=requisitionApproved = false</bpmn:conditionExpression></bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_5" name="approved" sourceRef="Gw_ReqApproved" targetRef="Task_CreatePO"/>
<bpmn:sequenceFlow id="Flow_6" sourceRef="Task_NotifyReject" targetRef="End_Rejected"/>
<bpmn:sequenceFlow id="Flow_7" sourceRef="Task_CreatePO" targetRef="Task_SendPO"/>
<bpmn:sequenceFlow id="Flow_8" sourceRef="Task_SendPO" targetRef="Gw_AwaitFork"/>
<bpmn:sequenceFlow id="Flow_9" sourceRef="Gw_AwaitFork" targetRef="Task_GoodsReceipt"/>
<bpmn:sequenceFlow id="Flow_10" sourceRef="Gw_AwaitFork" targetRef="Task_ReceiveInvoice"/>
<bpmn:sequenceFlow id="Flow_11" sourceRef="Task_GoodsReceipt" targetRef="Gw_AwaitJoin"/>
<bpmn:sequenceFlow id="Flow_12" sourceRef="Task_ReceiveInvoice" targetRef="Gw_AwaitJoin"/>
<bpmn:sequenceFlow id="Flow_13" sourceRef="Gw_AwaitJoin" targetRef="Gw_MatchMerge"/>
<bpmn:sequenceFlow id="Flow_14" sourceRef="Gw_MatchMerge" targetRef="Task_Match"/>
<bpmn:sequenceFlow id="Flow_15" sourceRef="Task_Match" targetRef="Gw_Tolerance"/>
<bpmn:sequenceFlow id="Flow_16" name="yes" sourceRef="Gw_Tolerance" targetRef="Task_PaymentRun"/>
<bpmn:sequenceFlow id="Flow_17" name="variance" sourceRef="Gw_Tolerance" targetRef="Task_Resolve"><bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=matchStatus = "VARIANCE"</bpmn:conditionExpression></bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_18" sourceRef="Task_Resolve" targetRef="Gw_MatchMerge"/>
<bpmn:sequenceFlow id="Flow_19" sourceRef="Task_PaymentRun" targetRef="Task_Pay"/>
<bpmn:sequenceFlow id="Flow_20" sourceRef="Task_Pay" targetRef="End_Paid"/>
<bpmn:textAnnotation id="Note_Tolerance"><bpmn:text>Match tolerance: ±2 % on price, exact on quantity (illustrative).</bpmn:text></bpmn:textAnnotation>
<bpmn:association id="Note_Tolerance_as" sourceRef="Task_Match" targetRef="Note_Tolerance"/>
</bpmn:process>
<bpmn:collaboration id="Process_ProcureToPay_collab">
<bpmn:participant id="Process_ProcureToPay_pool" name="Buyer — procure to pay" processRef="Process_ProcureToPay"/>
<bpmn:participant id="Participant_Supplier" name="Supplier"/>
<bpmn:messageFlow id="MsgFlow_PO" name="Purchase order" sourceRef="Task_SendPO" targetRef="Participant_Supplier"/>
<bpmn:messageFlow id="MsgFlow_Goods" name="Goods and delivery note" sourceRef="Participant_Supplier" targetRef="Task_GoodsReceipt"/>
<bpmn:messageFlow id="MsgFlow_Invoice" name="Invoice" sourceRef="Participant_Supplier" targetRef="Task_ReceiveInvoice"/>
<bpmn:messageFlow id="MsgFlow_CreditNote" name="Credit note or corrected invoice" sourceRef="Participant_Supplier" targetRef="Task_Resolve"/>
<bpmn:messageFlow id="MsgFlow_Payment" name="Payment and remittance advice" sourceRef="Task_Pay" targetRef="Participant_Supplier"/>
</bpmn:collaboration>
<bpmndi:BPMNDiagram id="Process_ProcureToPay_di">
<bpmndi:BPMNPlane id="Process_ProcureToPay_plane" bpmnElement="Process_ProcureToPay_collab">
<bpmndi:BPMNShape id="Process_ProcureToPay_pool_di" bpmnElement="Process_ProcureToPay_pool" isHorizontal="true"><dc:Bounds x="160" y="80" width="2448" height="740"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Lane_Requester_di" bpmnElement="Lane_Requester" isHorizontal="true"><dc:Bounds x="190" y="80" width="2418" height="150"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Lane_BudgetHolder_di" bpmnElement="Lane_BudgetHolder" isHorizontal="true"><dc:Bounds x="190" y="230" width="2418" height="150"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Lane_Procurement_di" bpmnElement="Lane_Procurement" isHorizontal="true"><dc:Bounds x="190" y="380" width="2418" height="150"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Lane_AP_di" bpmnElement="Lane_AP" isHorizontal="true"><dc:Bounds x="190" y="530" width="2418" height="290"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Participant_Supplier_di" bpmnElement="Participant_Supplier" isHorizontal="true"><dc:Bounds x="160" y="900" width="2448" height="60"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Start_Need_di" bpmnElement="Start_Need"><dc:Bounds x="262" y="137" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="242" y="178" width="76" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_Requisition_di" bpmnElement="Task_Requisition"><dc:Bounds x="380" y="115" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_ApproveReq_di" bpmnElement="Task_ApproveReq"><dc:Bounds x="530" y="265" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gw_ReqApproved_di" bpmnElement="Gw_ReqApproved" isMarkerVisible="true"><dc:Bounds x="705" y="280" width="50" height="50"/><bpmndi:BPMNLabel><dc:Bounds x="657" y="250" width="57" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_NotifyReject_di" bpmnElement="Task_NotifyReject"><dc:Bounds x="830" y="115" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="End_Rejected_di" bpmnElement="End_Rejected"><dc:Bounds x="1012" y="137" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="1002" y="178" width="57" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_CreatePO_di" bpmnElement="Task_CreatePO"><dc:Bounds x="830" y="415" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_SendPO_di" bpmnElement="Task_SendPO"><dc:Bounds x="980" y="415" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gw_AwaitFork_di" bpmnElement="Gw_AwaitFork"><dc:Bounds x="1155" y="430" width="50" height="50"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_GoodsReceipt_di" bpmnElement="Task_GoodsReceipt"><dc:Bounds x="1280" y="115" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_ReceiveInvoice_di" bpmnElement="Task_ReceiveInvoice"><dc:Bounds x="1430" y="575" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gw_AwaitJoin_di" bpmnElement="Gw_AwaitJoin"><dc:Bounds x="1605" y="590" width="50" height="50"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gw_MatchMerge_di" bpmnElement="Gw_MatchMerge" isMarkerVisible="true"><dc:Bounds x="1755" y="590" width="50" height="50"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_Match_di" bpmnElement="Task_Match"><dc:Bounds x="1880" y="575" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gw_Tolerance_di" bpmnElement="Gw_Tolerance" isMarkerVisible="true"><dc:Bounds x="2055" y="590" width="50" height="50"/><bpmndi:BPMNLabel><dc:Bounds x="2037" y="571" width="87" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_Resolve_di" bpmnElement="Task_Resolve"><dc:Bounds x="2180" y="695" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_PaymentRun_di" bpmnElement="Task_PaymentRun"><dc:Bounds x="2180" y="575" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_Pay_di" bpmnElement="Task_Pay"><dc:Bounds x="2330" y="575" width="100" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="End_Paid_di" bpmnElement="End_Paid"><dc:Bounds x="2512" y="597" width="36" height="36"/><bpmndi:BPMNLabel><dc:Bounds x="2500" y="638" width="61" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1"><di:waypoint x="298" y="155"/><di:waypoint x="380" y="155"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="480" y="155"/><di:waypoint x="505" y="155"/><di:waypoint x="505" y="305"/><di:waypoint x="530" y="305"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="630" y="305"/><di:waypoint x="705" y="305"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="730" y="280"/><di:waypoint x="730" y="155"/><di:waypoint x="830" y="155"/><bpmndi:BPMNLabel><dc:Bounds x="736" y="261" width="42" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="730" y="330"/><di:waypoint x="730" y="455"/><di:waypoint x="830" y="455"/><bpmndi:BPMNLabel><dc:Bounds x="736" y="333" width="48" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="930" y="155"/><di:waypoint x="1012" y="155"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_7_di" bpmnElement="Flow_7"><di:waypoint x="930" y="455"/><di:waypoint x="980" y="455"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_8_di" bpmnElement="Flow_8"><di:waypoint x="1080" y="455"/><di:waypoint x="1155" y="455"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_9_di" bpmnElement="Flow_9"><di:waypoint x="1180" y="430"/><di:waypoint x="1180" y="155"/><di:waypoint x="1280" y="155"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_10_di" bpmnElement="Flow_10"><di:waypoint x="1180" y="480"/><di:waypoint x="1180" y="615"/><di:waypoint x="1430" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_11_di" bpmnElement="Flow_11"><di:waypoint x="1380" y="155"/><di:waypoint x="1630" y="155"/><di:waypoint x="1630" y="590"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_12_di" bpmnElement="Flow_12"><di:waypoint x="1530" y="615"/><di:waypoint x="1605" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_13_di" bpmnElement="Flow_13"><di:waypoint x="1655" y="615"/><di:waypoint x="1755" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_14_di" bpmnElement="Flow_14"><di:waypoint x="1805" y="615"/><di:waypoint x="1880" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_15_di" bpmnElement="Flow_15"><di:waypoint x="1980" y="615"/><di:waypoint x="2055" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16_di" bpmnElement="Flow_16"><di:waypoint x="2105" y="615"/><di:waypoint x="2180" y="615"/><bpmndi:BPMNLabel><dc:Bounds x="2111" y="596" width="20" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_17_di" bpmnElement="Flow_17"><di:waypoint x="2080" y="640"/><di:waypoint x="2080" y="735"/><di:waypoint x="2180" y="735"/><bpmndi:BPMNLabel><dc:Bounds x="2086" y="643" width="44" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_18_di" bpmnElement="Flow_18"><di:waypoint x="2230" y="775"/><di:waypoint x="2230" y="797"/><di:waypoint x="1780" y="797"/><di:waypoint x="1780" y="640"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_19_di" bpmnElement="Flow_19"><di:waypoint x="2280" y="615"/><di:waypoint x="2330" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_20_di" bpmnElement="Flow_20"><di:waypoint x="2430" y="615"/><di:waypoint x="2512" y="615"/></bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Note_Tolerance_di" bpmnElement="Note_Tolerance"><dc:Bounds x="1870" y="405" width="190" height="50"/></bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Note_Tolerance_as_di" bpmnElement="Note_Tolerance_as"><di:waypoint x="1930" y="575"/><di:waypoint x="1930" y="455"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="MsgFlow_PO_di" bpmnElement="MsgFlow_PO"><di:waypoint x="1030" y="495"/><di:waypoint x="1030" y="900"/><bpmndi:BPMNLabel><dc:Bounds x="1036" y="853" width="78" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="MsgFlow_Goods_di" bpmnElement="MsgFlow_Goods"><di:waypoint x="1330" y="900"/><di:waypoint x="1330" y="195"/><bpmndi:BPMNLabel><dc:Bounds x="1336" y="846" width="65" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="MsgFlow_Invoice_di" bpmnElement="MsgFlow_Invoice"><di:waypoint x="1500" y="900"/><di:waypoint x="1500" y="655"/><bpmndi:BPMNLabel><dc:Bounds x="1506" y="853" width="37" height="15"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="MsgFlow_CreditNote_di" bpmnElement="MsgFlow_CreditNote"><di:waypoint x="2255" y="900"/><di:waypoint x="2255" y="775"/><bpmndi:BPMNLabel><dc:Bounds x="2261" y="846" width="86" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="MsgFlow_Payment_di" bpmnElement="MsgFlow_Payment"><di:waypoint x="2380" y="655"/><di:waypoint x="2380" y="900"/><bpmndi:BPMNLabel><dc:Bounds x="2386" y="846" width="89" height="28"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>