SwimdraftPricingSign inStart free

Training request BPMN example

Training requests sit at the junction of three interests: the employee wants the course, the manager wants the business case, and learning and development guards a finite budget. Teams map the process because informal versions produce two bad outcomes, courses booked with no budget cover, and requests that quietly die because nobody owned the next step.

The model is a single pool with Employee, Line manager, and Learning and development lanes, and it separates the two refusable decisions: managerial support and budget availability. The detail worth noticing is what happens when the budget is exhausted: instead of a flat rejection, an intermediate timer event parks the request until the next budget cycle and then rechecks, modelling deferral as a first class outcome.

Training request: BPMN 2.0 diagram
Training request 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
Training need identified
Ends with
Request declined · Training booked
Lanes
Employee · Line manager · Learning and development
Decisions
Request supported? · Budget available?

How to read this diagram

The trigger is an employee identifying a training need and submitting a request. Their Line manager assesses the business case at the gateway "Request supported?": the No branch, the default flow, leads to "Explain refusal to employee" and the "Request declined" end event, so unsupported requests end with a conversation rather than silence.

Supported requests move to Learning and development, where a business rule task checks the training budget and the gateway "Budget available?" makes the call. When funds are exhausted, the default No branch waits at the "Next budget cycle" timer event and then loops back to recheck the budget, so deferred requests are parked, not lost. Once budget exists, the course place is booked, the booking confirmed to the employee, and the flow ends at "Training booked".

BPMN elements used

ElementCountIn this diagram
Start event1Training need identified
End event2Request declined, Training booked
Intermediate catch event1Next budget cycle
Task1Explain refusal to employee
User task2Submit training request, Assess business case
Service task1Book course place
Send task1Confirm booking
Business rule task1Check training budget
Exclusive gateway2Request supported?, Budget available?
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_tr" name="Training request" processRef="Process_pool_tr" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_tr" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_tr">
      <bpmn2:lane id="lane_tr_emp" name="Employee">
        <bpmn2:flowNodeRef>start_tr</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tr_submit</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_tr_mgr" name="Line manager">
        <bpmn2:flowNodeRef>t_tr_case</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_tr_support</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tr_refuse</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_tr_declined</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_tr_ld" name="Learning and development">
        <bpmn2:flowNodeRef>t_tr_budget</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_tr_budget</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>ev_tr_cycle</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tr_book</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_tr_confirm</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_tr_booked</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_tr" name="Training need identified">
      <bpmn2:outgoing>ftr1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="t_tr_submit" name="Submit training request">
      <bpmn2:incoming>ftr1</bpmn2:incoming>
      <bpmn2:outgoing>ftr2</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:userTask id="t_tr_case" name="Assess business case">
      <bpmn2:incoming>ftr2</bpmn2:incoming>
      <bpmn2:outgoing>ftr3</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_tr_support" name="Request supported?" default="ftr5">
      <bpmn2:incoming>ftr3</bpmn2:incoming>
      <bpmn2:outgoing>ftr4</bpmn2:outgoing>
      <bpmn2:outgoing>ftr5</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:task id="t_tr_refuse" name="Explain refusal to employee">
      <bpmn2:incoming>ftr5</bpmn2:incoming>
      <bpmn2:outgoing>ftr6</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:endEvent id="end_tr_declined" name="Request declined">
      <bpmn2:incoming>ftr6</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:businessRuleTask id="t_tr_budget" name="Check training budget">
      <bpmn2:incoming>ftr4</bpmn2:incoming>
      <bpmn2:incoming>ftr10</bpmn2:incoming>
      <bpmn2:outgoing>ftr7</bpmn2:outgoing>
    </bpmn2:businessRuleTask>
    <bpmn2:exclusiveGateway id="g_tr_budget" name="Budget available?" default="ftr9">
      <bpmn2:incoming>ftr7</bpmn2:incoming>
      <bpmn2:outgoing>ftr8</bpmn2:outgoing>
      <bpmn2:outgoing>ftr9</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:intermediateCatchEvent id="ev_tr_cycle" name="Next budget cycle">
      <bpmn2:incoming>ftr9</bpmn2:incoming>
      <bpmn2:outgoing>ftr10</bpmn2:outgoing>
      <bpmn2:timerEventDefinition id="ev_tr_cycle_def" />
    </bpmn2:intermediateCatchEvent>
    <bpmn2:serviceTask id="t_tr_book" name="Book course place">
      <bpmn2:incoming>ftr8</bpmn2:incoming>
      <bpmn2:outgoing>ftr11</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:sendTask id="t_tr_confirm" name="Confirm booking">
      <bpmn2:incoming>ftr11</bpmn2:incoming>
      <bpmn2:outgoing>ftr12</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:endEvent id="end_tr_booked" name="Training booked">
      <bpmn2:incoming>ftr12</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="ftr1" sourceRef="start_tr" targetRef="t_tr_submit" />
    <bpmn2:sequenceFlow id="ftr2" sourceRef="t_tr_submit" targetRef="t_tr_case" />
    <bpmn2:sequenceFlow id="ftr3" sourceRef="t_tr_case" targetRef="g_tr_support" />
    <bpmn2:sequenceFlow id="ftr4" name="Yes" sourceRef="g_tr_support" targetRef="t_tr_budget">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="ftr5" name="No" sourceRef="g_tr_support" targetRef="t_tr_refuse" />
    <bpmn2:sequenceFlow id="ftr6" sourceRef="t_tr_refuse" targetRef="end_tr_declined" />
    <bpmn2:sequenceFlow id="ftr7" sourceRef="t_tr_budget" targetRef="g_tr_budget" />
    <bpmn2:sequenceFlow id="ftr8" name="Yes" sourceRef="g_tr_budget" targetRef="t_tr_book">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="ftr9" name="No" sourceRef="g_tr_budget" targetRef="ev_tr_cycle" />
    <bpmn2:sequenceFlow id="ftr10" sourceRef="ev_tr_cycle" targetRef="t_tr_budget" />
    <bpmn2:sequenceFlow id="ftr11" sourceRef="t_tr_book" targetRef="t_tr_confirm" />
    <bpmn2:sequenceFlow id="ftr12" sourceRef="t_tr_confirm" targetRef="end_tr_booked" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_tr_di" bpmnElement="pool_tr" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1420" height="500" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_tr_emp_di" bpmnElement="lane_tr_emp" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1390" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_tr_mgr_di" bpmnElement="lane_tr_mgr" isHorizontal="true">
        <dc:Bounds x="50" y="150" width="1390" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_tr_ld_di" bpmnElement="lane_tr_ld" isHorizontal="true">
        <dc:Bounds x="50" y="280" width="1390" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_tr_di" bpmnElement="start_tr">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="72" y="101" width="117" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tr_submit_di" bpmnElement="t_tr_submit">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tr_case_di" bpmnElement="t_tr_case">
        <dc:Bounds x="380" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_tr_support_di" bpmnElement="g_tr_support">
        <dc:Bounds x="555" y="182" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="529" y="162" width="102" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tr_refuse_di" bpmnElement="t_tr_refuse">
        <dc:Bounds x="680" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_tr_declined_di" bpmnElement="end_tr_declined">
        <dc:Bounds x="862" y="189" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="837" y="231" width="87" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tr_budget_di" bpmnElement="t_tr_budget">
        <dc:Bounds x="680" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_tr_budget_di" bpmnElement="g_tr_budget">
        <dc:Bounds x="855" y="312" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="835" y="292" width="90" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ev_tr_cycle_di" bpmnElement="ev_tr_cycle">
        <dc:Bounds x="1012" y="429" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="985" y="471" width="90" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tr_book_di" bpmnElement="t_tr_book">
        <dc:Bounds x="980" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_tr_confirm_di" bpmnElement="t_tr_confirm">
        <dc:Bounds x="1130" y="297" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_tr_booked_di" bpmnElement="end_tr_booked">
        <dc:Bounds x="1312" y="319" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1290" y="361" width="81" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="ftr1_di" bpmnElement="ftr1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr2_di" bpmnElement="ftr2">
        <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="ftr3_di" bpmnElement="ftr3">
        <di:waypoint x="480" y="207" />
        <di:waypoint x="555" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr4_di" bpmnElement="ftr4">
        <di:waypoint x="605" y="207" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="660" y="337" />
        <di:waypoint x="680" y="337" />
        <bpmndi:BPMNLabel><dc:Bounds x="611" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr5_di" bpmnElement="ftr5">
        <di:waypoint x="605" y="207" />
        <di:waypoint x="680" y="207" />
        <bpmndi:BPMNLabel><dc:Bounds x="611" y="213" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr6_di" bpmnElement="ftr6">
        <di:waypoint x="780" y="207" />
        <di:waypoint x="862" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr7_di" bpmnElement="ftr7">
        <di:waypoint x="780" y="337" />
        <di:waypoint x="855" y="337" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr8_di" bpmnElement="ftr8">
        <di:waypoint x="905" y="337" />
        <di:waypoint x="980" y="337" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="317" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr9_di" bpmnElement="ftr9">
        <di:waypoint x="905" y="337" />
        <di:waypoint x="960" y="337" />
        <di:waypoint x="960" y="447" />
        <di:waypoint x="1012" y="447" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="343" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr10_di" bpmnElement="ftr10">
        <di:waypoint x="1048" y="447" />
        <di:waypoint x="1110" y="447" />
        <di:waypoint x="1110" y="502" />
        <di:waypoint x="660" y="502" />
        <di:waypoint x="660" y="337" />
        <di:waypoint x="680" y="337" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr11_di" bpmnElement="ftr11">
        <di:waypoint x="1080" y="337" />
        <di:waypoint x="1130" y="337" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="ftr12_di" bpmnElement="ftr12">
        <di:waypoint x="1230" y="337" />
        <di:waypoint x="1312" y="337" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why defer on budget with a timer instead of just declining?

Declining tells the employee to start again next quarter, which most never do, and the organisation loses the signal about unmet demand. The timer loop keeps the request alive in the process itself: it waits, rechecks, and books when funds arrive. If your policy genuinely rejects on budget, replace the timer branch with an end event.

Could the two decisions be combined into one gateway?

They have different owners and different consequences, so no. Manager support is a judgement about relevance; budget is a fact about money, checked by a business rule task. Combining them into one "Approved?" gateway would hide who said no and why, which is precisely the ambiguity a process map exists to remove.

How do I extend this for courses above a spending threshold?

Add an exclusive gateway after the budget check, for example "Cost over 1,000?", routing expensive requests through an extra approval task in a senior lane before booking. Threshold gateways like this are the standard BPMN pattern for tiered authorisation and slot in without disturbing the rest of the flow.

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