SwimdraftPricingSign inStart free

Sales order processing BPMN example

Sales order processing takes a confirmed order and turns it into a dispatched parcel and an invoice. It is mapped so often because it crosses the boundary between commercial and operational teams: sales admin owns the order record, the warehouse owns the stock, and billing owns the money. The classic failure is an out of stock item that nobody communicates, leaving the customer to discover the delay themselves.

The model is a single pool with Sales admin, Warehouse, and Billing lanes. Its two structural features are worth a look: a timer event inside the back order loop makes the wait for replenishment explicit, and a parallel gateway lets picking and invoicing run at the same time, because neither depends on the other once stock is confirmed.

Sales order processing: BPMN 2.0 diagram
Sales order processing 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
Order received
Ends with
Order dispatched
Lanes
Sales admin · Warehouse · Billing
Decisions
Stock available?

How to read this diagram

From the moment an order is received in the Sales admin lane, the flow is straightforward until stock is questioned. The order is entered into the ERP, then a service task in the Warehouse lane checks stock levels. The gateway "Stock available?" splits the flow: on the default No branch, Sales admin notifies the customer of the delay, an intermediate timer event waits out the replenishment period, and the flow loops back to the stock check.

When stock is available, the Yes branch reaches a parallel gateway that opens two concurrent paths: the Warehouse picks and packs the order while Billing generates the invoice. A joining parallel gateway waits for both to finish before the order is dispatched, and the process ends at "Order dispatched" in the Warehouse lane. The join matters: dispatching before the invoice exists would let a token race ahead of the paperwork.

BPMN elements used

ElementCountIn this diagram
Start event1Order received
End event1Order dispatched
Intermediate catch event1Await replenishment
Task2Enter order in ERP, Pick and pack order
Service task3Check stock levels, Generate invoice, Dispatch order
Send task1Notify customer of delay
Exclusive gateway1Stock available?
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_sop" name="Sales order processing" processRef="Process_pool_sop" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_sop" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_sop">
      <bpmn2:lane id="lane_sop_admin" name="Sales admin">
        <bpmn2:flowNodeRef>start_sop</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sop_enter</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sop_notify</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_sop_wh" name="Warehouse">
        <bpmn2:flowNodeRef>t_sop_check</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_sop_stock</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>ev_sop_wait</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_sop_split</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sop_pick</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_sop_join</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sop_dispatch</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_sop_done</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_sop_bill" name="Billing">
        <bpmn2:flowNodeRef>t_sop_invoice</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_sop" name="Order received">
      <bpmn2:outgoing>fsop1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:task id="t_sop_enter" name="Enter order in ERP">
      <bpmn2:incoming>fsop1</bpmn2:incoming>
      <bpmn2:outgoing>fsop2</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:serviceTask id="t_sop_check" name="Check stock levels">
      <bpmn2:incoming>fsop2</bpmn2:incoming>
      <bpmn2:incoming>fsop7</bpmn2:incoming>
      <bpmn2:outgoing>fsop3</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:exclusiveGateway id="g_sop_stock" name="Stock available?" default="fsop5">
      <bpmn2:incoming>fsop3</bpmn2:incoming>
      <bpmn2:outgoing>fsop4</bpmn2:outgoing>
      <bpmn2:outgoing>fsop5</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:sendTask id="t_sop_notify" name="Notify customer of delay">
      <bpmn2:incoming>fsop5</bpmn2:incoming>
      <bpmn2:outgoing>fsop6</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:intermediateCatchEvent id="ev_sop_wait" name="Await replenishment">
      <bpmn2:incoming>fsop6</bpmn2:incoming>
      <bpmn2:outgoing>fsop7</bpmn2:outgoing>
      <bpmn2:timerEventDefinition id="ev_sop_wait_def" />
    </bpmn2:intermediateCatchEvent>
    <bpmn2:parallelGateway id="g_sop_split">
      <bpmn2:incoming>fsop4</bpmn2:incoming>
      <bpmn2:outgoing>fsop8</bpmn2:outgoing>
      <bpmn2:outgoing>fsop9</bpmn2:outgoing>
    </bpmn2:parallelGateway>
    <bpmn2:task id="t_sop_pick" name="Pick and pack order">
      <bpmn2:incoming>fsop8</bpmn2:incoming>
      <bpmn2:outgoing>fsop10</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:serviceTask id="t_sop_invoice" name="Generate invoice">
      <bpmn2:incoming>fsop9</bpmn2:incoming>
      <bpmn2:outgoing>fsop11</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:parallelGateway id="g_sop_join">
      <bpmn2:incoming>fsop10</bpmn2:incoming>
      <bpmn2:incoming>fsop11</bpmn2:incoming>
      <bpmn2:outgoing>fsop12</bpmn2:outgoing>
    </bpmn2:parallelGateway>
    <bpmn2:serviceTask id="t_sop_dispatch" name="Dispatch order">
      <bpmn2:incoming>fsop12</bpmn2:incoming>
      <bpmn2:outgoing>fsop13</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:endEvent id="end_sop_done" name="Order dispatched">
      <bpmn2:incoming>fsop13</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="fsop1" sourceRef="start_sop" targetRef="t_sop_enter" />
    <bpmn2:sequenceFlow id="fsop2" sourceRef="t_sop_enter" targetRef="t_sop_check" />
    <bpmn2:sequenceFlow id="fsop3" sourceRef="t_sop_check" targetRef="g_sop_stock" />
    <bpmn2:sequenceFlow id="fsop4" name="Yes" sourceRef="g_sop_stock" targetRef="g_sop_split">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fsop5" name="No" sourceRef="g_sop_stock" targetRef="t_sop_notify" />
    <bpmn2:sequenceFlow id="fsop6" sourceRef="t_sop_notify" targetRef="ev_sop_wait" />
    <bpmn2:sequenceFlow id="fsop7" sourceRef="ev_sop_wait" targetRef="t_sop_check" />
    <bpmn2:sequenceFlow id="fsop8" sourceRef="g_sop_split" targetRef="t_sop_pick" />
    <bpmn2:sequenceFlow id="fsop9" sourceRef="g_sop_split" targetRef="t_sop_invoice" />
    <bpmn2:sequenceFlow id="fsop10" sourceRef="t_sop_pick" targetRef="g_sop_join" />
    <bpmn2:sequenceFlow id="fsop11" sourceRef="t_sop_invoice" targetRef="g_sop_join" />
    <bpmn2:sequenceFlow id="fsop12" sourceRef="g_sop_join" targetRef="t_sop_dispatch" />
    <bpmn2:sequenceFlow id="fsop13" sourceRef="t_sop_dispatch" targetRef="end_sop_done" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_sop_di" bpmnElement="pool_sop" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1420" height="500" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_sop_admin_di" bpmnElement="lane_sop_admin" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1390" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_sop_wh_di" bpmnElement="lane_sop_wh" isHorizontal="true">
        <dc:Bounds x="50" y="150" width="1390" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_sop_bill_di" bpmnElement="lane_sop_bill" isHorizontal="true">
        <dc:Bounds x="50" y="390" width="1390" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_sop_di" bpmnElement="start_sop">
        <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="t_sop_enter_di" bpmnElement="t_sop_enter">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sop_check_di" bpmnElement="t_sop_check">
        <dc:Bounds x="380" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_sop_stock_di" bpmnElement="g_sop_stock">
        <dc:Bounds x="555" y="182" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="539" y="162" width="83" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sop_notify_di" bpmnElement="t_sop_notify">
        <dc:Bounds x="680" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ev_sop_wait_di" bpmnElement="ev_sop_wait">
        <dc:Bounds x="862" y="299" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="829" y="341" width="102" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_sop_split_di" bpmnElement="g_sop_split">
        <dc:Bounds x="705" y="182" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sop_pick_di" bpmnElement="t_sop_pick">
        <dc:Bounds x="830" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sop_invoice_di" bpmnElement="t_sop_invoice">
        <dc:Bounds x="830" y="407" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_sop_join_di" bpmnElement="g_sop_join">
        <dc:Bounds x="1005" y="182" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sop_dispatch_di" bpmnElement="t_sop_dispatch">
        <dc:Bounds x="1130" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_sop_done_di" bpmnElement="end_sop_done">
        <dc:Bounds x="1312" y="189" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1287" y="231" width="87" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="fsop1_di" bpmnElement="fsop1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop2_di" bpmnElement="fsop2">
        <di:waypoint x="330" y="77" />
        <di:waypoint x="360" y="77" />
        <di:waypoint x="360" y="207" />
        <di:waypoint x="380" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop3_di" bpmnElement="fsop3">
        <di:waypoint x="480" y="207" />
        <di:waypoint x="555" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop4_di" bpmnElement="fsop4">
        <di:waypoint x="605" y="207" />
        <di:waypoint x="705" y="207" />
        <bpmndi:BPMNLabel><dc:Bounds x="611" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop5_di" bpmnElement="fsop5">
        <di:waypoint x="605" y="207" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="660" y="77" />
        <di:waypoint x="680" y="77" />
        <bpmndi:BPMNLabel><dc:Bounds x="611" y="213" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop6_di" bpmnElement="fsop6">
        <di:waypoint x="780" y="77" />
        <di:waypoint x="810" y="77" />
        <di:waypoint x="810" y="317" />
        <di:waypoint x="862" y="317" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop7_di" bpmnElement="fsop7">
        <di:waypoint x="898" y="317" />
        <di:waypoint x="960" y="317" />
        <di:waypoint x="960" y="372" />
        <di:waypoint x="360" y="372" />
        <di:waypoint x="360" y="207" />
        <di:waypoint x="380" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop8_di" bpmnElement="fsop8">
        <di:waypoint x="755" y="207" />
        <di:waypoint x="830" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop9_di" bpmnElement="fsop9">
        <di:waypoint x="755" y="207" />
        <di:waypoint x="810" y="207" />
        <di:waypoint x="810" y="447" />
        <di:waypoint x="830" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop10_di" bpmnElement="fsop10">
        <di:waypoint x="930" y="207" />
        <di:waypoint x="1005" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop11_di" bpmnElement="fsop11">
        <di:waypoint x="930" y="447" />
        <di:waypoint x="960" y="447" />
        <di:waypoint x="960" y="207" />
        <di:waypoint x="1005" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop12_di" bpmnElement="fsop12">
        <di:waypoint x="1055" y="207" />
        <di:waypoint x="1130" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsop13_di" bpmnElement="fsop13">
        <di:waypoint x="1230" y="207" />
        <di:waypoint x="1312" y="207" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why a parallel gateway instead of doing picking and invoicing in sequence?

Neither activity needs the other's output, so forcing an order between them just adds elapsed time. A parallel gateway states that both must happen and both must complete before dispatch. If your invoice depends on final picked quantities, sequence them instead, because a parallel split would then be wrong.

What does the clock symbol in the back order loop mean?

It is an intermediate timer catch event. The token pauses there for the replenishment period before looping back to the stock check, which models the wait honestly instead of burying it inside a task called "wait". In an executable engine the timer would carry a duration expression such as three working days.

Can I open this diagram in other BPMN tools?

Yes. Swimdraft exports standard BPMN 2.0 interchange XML, validated against 19 normative rules from the OMG 2.0.2 specification, so the downloaded .bpmn file opens in Camunda Modeler, Signavio, or Bizagi with lanes, gateways, and the timer event intact. SVG and PNG exports are available for documents.

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