SwimdraftPricingSign inStart free

Tender process BPMN example

A tender process runs a formal competition for significant spend: publish an invitation, wait for sealed bids, score them against published criteria, and award. Organisations map it because tenders are procedurally strict, and a missed deadline or an undocumented scoring step can void the award or invite a legal challenge from a losing bidder.

This is the one example in the set with two pools: the tendering organisation, with Procurement and Evaluation panel lanes, plus a collapsed black box pool for the suppliers, connected by message flows for the invitation and the bids. The intermediate timer event is the choice to notice: the wait for the submission deadline is modelled as an event, not buried inside a task.

Tender process: BPMN 2.0 diagram
Tender process 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
Tender approved
Ends with
Tender cancelled · Contract awarded
Lanes
Procurement · Evaluation panel
Decisions
Compliant bid received?

How to read this diagram

From the "Tender approved" start event, Procurement prepares the tender documents and publishes the invitation, shown as a send task with a message flow out to the Suppliers pool. The process then waits at the "Submission deadline" timer event. When it fires, Procurement opens and logs the bids that arrived, a task that receives the suppliers' message flow.

Scoring belongs to the Evaluation panel lane, where bids are scored against the published criteria before the gateway "Compliant bid received?". If no compliant bid arrived, the default No branch cancels the tender and ends at "Tender cancelled". On the Yes branch the panel selects the winning bid, Procurement notifies all bidders of the outcome, awards the contract, and the process ends at "Contract awarded".

BPMN elements used

ElementCountIn this diagram
Start event1Tender approved
End event2Tender cancelled, Contract awarded
Intermediate catch event1Submission deadline
Task3Open and log bids, Cancel tender, Award contract
User task3Prepare tender documents, Score bids against criteria, Select winning bid
Send task2Publish invitation, Notify all bidders
Exclusive gateway1Compliant bid received?
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_tp" name="Tendering organisation" processRef="Process_pool_tp" />
    <bpmn2:participant id="pool_tp_suppliers" name="Suppliers" processRef="Process_pool_tp_suppliers" />
    <bpmn2:messageFlow id="mftp1" name="Invitation to tender" sourceRef="t_tp_publish" targetRef="pool_tp_suppliers" />
    <bpmn2:messageFlow id="mftp2" name="Sealed bids" sourceRef="pool_tp_suppliers" targetRef="t_tp_open" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_tp" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_tp">
      <bpmn2:lane id="lane_tp_proc" name="Procurement">
        <bpmn2:flowNodeRef>start_tp</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_prepare</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_publish</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>ev_tp_deadline</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_open</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_cancel</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_tp_cancel</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_notify</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_award</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_tp_award</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_tp_panel" name="Evaluation panel">
        <bpmn2:flowNodeRef>t_tp_score</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_tp_compliant</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tp_select</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_tp" name="Tender approved">
      <bpmn2:outgoing>ftp1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="t_tp_prepare" name="Prepare tender documents">
      <bpmn2:incoming>ftp1</bpmn2:incoming>
      <bpmn2:outgoing>ftp2</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sendTask id="t_tp_publish" name="Publish invitation">
      <bpmn2:incoming>ftp2</bpmn2:incoming>
      <bpmn2:outgoing>ftp3</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:intermediateCatchEvent id="ev_tp_deadline" name="Submission deadline">
      <bpmn2:incoming>ftp3</bpmn2:incoming>
      <bpmn2:outgoing>ftp4</bpmn2:outgoing>
      <bpmn2:timerEventDefinition id="ev_tp_deadline_def" />
    </bpmn2:intermediateCatchEvent>
    <bpmn2:task id="t_tp_open" name="Open and log bids">
      <bpmn2:incoming>ftp4</bpmn2:incoming>
      <bpmn2:outgoing>ftp5</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:userTask id="t_tp_score" name="Score bids against criteria">
      <bpmn2:incoming>ftp5</bpmn2:incoming>
      <bpmn2:outgoing>ftp6</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_tp_compliant" name="Compliant bid received?" default="ftp8">
      <bpmn2:incoming>ftp6</bpmn2:incoming>
      <bpmn2:outgoing>ftp7</bpmn2:outgoing>
      <bpmn2:outgoing>ftp8</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:task id="t_tp_cancel" name="Cancel tender">
      <bpmn2:incoming>ftp8</bpmn2:incoming>
      <bpmn2:outgoing>ftp9</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:endEvent id="end_tp_cancel" name="Tender cancelled">
      <bpmn2:incoming>ftp9</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:userTask id="t_tp_select" name="Select winning bid">
      <bpmn2:incoming>ftp7</bpmn2:incoming>
      <bpmn2:outgoing>ftp10</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sendTask id="t_tp_notify" name="Notify all bidders">
      <bpmn2:incoming>ftp10</bpmn2:incoming>
      <bpmn2:outgoing>ftp11</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:task id="t_tp_award" name="Award contract">
      <bpmn2:incoming>ftp11</bpmn2:incoming>
      <bpmn2:outgoing>ftp12</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:endEvent id="end_tp_award" name="Contract awarded">
      <bpmn2:incoming>ftp12</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="ftp1" sourceRef="start_tp" targetRef="t_tp_prepare" />
    <bpmn2:sequenceFlow id="ftp2" sourceRef="t_tp_prepare" targetRef="t_tp_publish" />
    <bpmn2:sequenceFlow id="ftp3" sourceRef="t_tp_publish" targetRef="ev_tp_deadline" />
    <bpmn2:sequenceFlow id="ftp4" sourceRef="ev_tp_deadline" targetRef="t_tp_open" />
    <bpmn2:sequenceFlow id="ftp5" sourceRef="t_tp_open" targetRef="t_tp_score" />
    <bpmn2:sequenceFlow id="ftp6" sourceRef="t_tp_score" targetRef="g_tp_compliant" />
    <bpmn2:sequenceFlow id="ftp7" name="Yes" sourceRef="g_tp_compliant" targetRef="t_tp_select">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="ftp8" name="No" sourceRef="g_tp_compliant" targetRef="t_tp_cancel" />
    <bpmn2:sequenceFlow id="ftp9" sourceRef="t_tp_cancel" targetRef="end_tp_cancel" />
    <bpmn2:sequenceFlow id="ftp10" sourceRef="t_tp_select" targetRef="t_tp_notify" />
    <bpmn2:sequenceFlow id="ftp11" sourceRef="t_tp_notify" targetRef="t_tp_award" />
    <bpmn2:sequenceFlow id="ftp12" sourceRef="t_tp_award" targetRef="end_tp_award" />
  </bpmn2:process>
  <bpmn2:process id="Process_pool_tp_suppliers" isExecutable="false">
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_tp_di" bpmnElement="pool_tp" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1720" height="370" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_tp_proc_di" bpmnElement="lane_tp_proc" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1690" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_tp_panel_di" bpmnElement="lane_tp_panel" isHorizontal="true">
        <dc:Bounds x="50" y="260" width="1690" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="pool_tp_suppliers_di" bpmnElement="pool_tp_suppliers" isHorizontal="true">
        <dc:Bounds x="20" y="450" width="1720" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_tp_di" bpmnElement="start_tp">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="87" y="101" width="86" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_prepare_di" bpmnElement="t_tp_prepare">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_publish_di" bpmnElement="t_tp_publish">
        <dc:Bounds x="380" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ev_tp_deadline_di" bpmnElement="ev_tp_deadline">
        <dc:Bounds x="562" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="528" y="101" width="104" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_open_di" bpmnElement="t_tp_open">
        <dc:Bounds x="680" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_score_di" bpmnElement="t_tp_score">
        <dc:Bounds x="830" y="277" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_tp_compliant_di" bpmnElement="g_tp_compliant">
        <dc:Bounds x="1005" y="292" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="970" y="272" width="120" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_cancel_di" bpmnElement="t_tp_cancel">
        <dc:Bounds x="1130" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_tp_cancel_di" bpmnElement="end_tp_cancel">
        <dc:Bounds x="1312" y="169" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1287" y="211" width="87" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_select_di" bpmnElement="t_tp_select">
        <dc:Bounds x="1130" y="277" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_notify_di" bpmnElement="t_tp_notify">
        <dc:Bounds x="1280" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tp_award_di" bpmnElement="t_tp_award">
        <dc:Bounds x="1430" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_tp_award_di" bpmnElement="end_tp_award">
        <dc:Bounds x="1612" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1586" y="101" width="89" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="ftp1_di" bpmnElement="ftp1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp2_di" bpmnElement="ftp2">
        <di:waypoint x="330" y="77" />
        <di:waypoint x="380" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp3_di" bpmnElement="ftp3">
        <di:waypoint x="480" y="77" />
        <di:waypoint x="562" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp4_di" bpmnElement="ftp4">
        <di:waypoint x="598" y="77" />
        <di:waypoint x="680" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp5_di" bpmnElement="ftp5">
        <di:waypoint x="780" y="77" />
        <di:waypoint x="810" y="77" />
        <di:waypoint x="810" y="317" />
        <di:waypoint x="830" y="317" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp6_di" bpmnElement="ftp6">
        <di:waypoint x="930" y="317" />
        <di:waypoint x="1005" y="317" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp7_di" bpmnElement="ftp7">
        <di:waypoint x="1055" y="317" />
        <di:waypoint x="1130" y="317" />
        <bpmndi:BPMNLabel><dc:Bounds x="1061" y="297" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp8_di" bpmnElement="ftp8">
        <di:waypoint x="1055" y="317" />
        <di:waypoint x="1110" y="317" />
        <di:waypoint x="1110" y="77" />
        <di:waypoint x="1130" y="77" />
        <bpmndi:BPMNLabel><dc:Bounds x="1061" y="323" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp9_di" bpmnElement="ftp9">
        <di:waypoint x="1230" y="77" />
        <di:waypoint x="1260" y="77" />
        <di:waypoint x="1260" y="187" />
        <di:waypoint x="1312" y="187" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp10_di" bpmnElement="ftp10">
        <di:waypoint x="1230" y="317" />
        <di:waypoint x="1260" y="317" />
        <di:waypoint x="1260" y="77" />
        <di:waypoint x="1280" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp11_di" bpmnElement="ftp11">
        <di:waypoint x="1380" y="77" />
        <di:waypoint x="1430" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftp12_di" bpmnElement="ftp12">
        <di:waypoint x="1530" y="77" />
        <di:waypoint x="1612" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="mftp1_di" bpmnElement="mftp1">
        <di:waypoint x="430" y="117" />
        <di:waypoint x="430" y="420" />
        <di:waypoint x="430" y="450" />
        <bpmndi:BPMNLabel><dc:Bounds x="436" y="413" width="93" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="mftp2_di" bpmnElement="mftp2">
        <di:waypoint x="730" y="450" />
        <di:waypoint x="730" y="420" />
        <di:waypoint x="730" y="117" />
        <bpmndi:BPMNLabel><dc:Bounds x="736" y="413" width="60" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why are the suppliers a black box pool with no visible tasks?

Because you cannot dictate or observe how each supplier prepares a bid; you only control the messages that cross the boundary. A collapsed pool states that an external participant exists and shows what is exchanged, without inventing internals you do not know. Expanding it would add speculation, not information.

Why model the deadline as a timer event instead of a "wait for bids" task?

A tender closes at a fixed date and time regardless of how many bids are in, which is precisely the semantics of an intermediate timer catch event. A task implies work being performed and finishing when the work is done. The timer also documents the legally significant deadline directly on the diagram.

Will the exported file survive a round trip into other tools?

Yes. Swimdraft exports standard BPMN 2.0 interchange XML validated against 19 normative rules from the OMG 2.0.2 specification, with clause citations, so pools, message flows, and the timer definition open intact in Camunda Modeler, Signavio, or Bizagi. SVG and PNG exports are available for documents and slides.

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