Budget approval BPMN example
Budget approval is the annual negotiation between the people who spend money and the people who answer for it. Organisations map the process because it runs on deadlines and iterations: draft budgets bounce between budget holders, finance, and an approving committee, and without an agreed flow the cycle overruns and the year starts on last year's numbers.
Modelled here as one pool with Budget holder, Finance business partner, and Executive committee lanes, the process contains two exclusive gateways and, unusually for this library, two rework loops that share a task: finance challenge sends drafts back for revision, and committee rejection routes feedback into that same revision task. Sharing the loop target is the modelling choice worth noticing.
Standard BPMN 2.0 interchange XML: opens in Camunda Modeler, Signavio, Bizagi, and any other compliant tool.
The process at a glance
How to read this diagram
Opening the cycle falls to the Budget holder lane, where the draft budget is prepared and passed to the Finance business partner for challenge. The gateway "Revisions needed?" sends the Yes branch back through "Revise budget submission" and into challenge again, as many rounds as it takes, while the default No branch lets finance consolidate the departmental budgets and present the result to the committee.
In the Executive committee lane, "Budget approved?" carries the final decision. Rejection takes the default No branch: the committee issues feedback, which flows into the same revision task the finance loop uses, so a rejected budget re-enters the cycle rather than dying. Approval takes the Yes branch, the budget is loaded into the ERP, and the process ends at "Budget approved".
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Budget cycle opened |
| End event | 1 | Budget approved |
| Task | 2 | Consolidate budgets, Issue committee feedback |
| User task | 4 | Prepare draft budget, Challenge budget assumptions, Revise budget submission, Present budget to committee |
| Service task | 1 | Load budget into ERP |
| Exclusive gateway | 2 | Revisions needed?, Budget 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_bud" name="Budget approval" processRef="Process_pool_bud" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_bud" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_bud">
<bpmn2:lane id="lane_bud_holder" name="Budget holder">
<bpmn2:flowNodeRef>start_bud</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_bud_prep</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_bud_revise</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_bud_fbp" name="Finance business partner">
<bpmn2:flowNodeRef>t_bud_challenge</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_bud_rev</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_bud_consol</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_bud_present</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_bud_load</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_bud_approved</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_bud_exco" name="Executive committee">
<bpmn2:flowNodeRef>g_bud_appr</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_bud_feedback</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_bud" name="Budget cycle opened">
<bpmn2:outgoing>fbud1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="t_bud_prep" name="Prepare draft budget">
<bpmn2:incoming>fbud1</bpmn2:incoming>
<bpmn2:outgoing>fbud2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="t_bud_challenge" name="Challenge budget assumptions">
<bpmn2:incoming>fbud2</bpmn2:incoming>
<bpmn2:incoming>fbud6</bpmn2:incoming>
<bpmn2:outgoing>fbud3</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_bud_rev" name="Revisions needed?" default="fbud5">
<bpmn2:incoming>fbud3</bpmn2:incoming>
<bpmn2:outgoing>fbud4</bpmn2:outgoing>
<bpmn2:outgoing>fbud5</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:userTask id="t_bud_revise" name="Revise budget submission">
<bpmn2:incoming>fbud4</bpmn2:incoming>
<bpmn2:incoming>fbud11</bpmn2:incoming>
<bpmn2:outgoing>fbud6</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:task id="t_bud_consol" name="Consolidate budgets">
<bpmn2:incoming>fbud5</bpmn2:incoming>
<bpmn2:outgoing>fbud7</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:userTask id="t_bud_present" name="Present budget to committee">
<bpmn2:incoming>fbud7</bpmn2:incoming>
<bpmn2:outgoing>fbud8</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_bud_appr" name="Budget approved?" default="fbud10">
<bpmn2:incoming>fbud8</bpmn2:incoming>
<bpmn2:outgoing>fbud9</bpmn2:outgoing>
<bpmn2:outgoing>fbud10</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="t_bud_feedback" name="Issue committee feedback">
<bpmn2:incoming>fbud10</bpmn2:incoming>
<bpmn2:outgoing>fbud11</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:serviceTask id="t_bud_load" name="Load budget into ERP">
<bpmn2:incoming>fbud9</bpmn2:incoming>
<bpmn2:outgoing>fbud12</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:endEvent id="end_bud_approved" name="Budget approved">
<bpmn2:incoming>fbud12</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="fbud1" sourceRef="start_bud" targetRef="t_bud_prep" />
<bpmn2:sequenceFlow id="fbud2" sourceRef="t_bud_prep" targetRef="t_bud_challenge" />
<bpmn2:sequenceFlow id="fbud3" sourceRef="t_bud_challenge" targetRef="g_bud_rev" />
<bpmn2:sequenceFlow id="fbud4" name="Yes" sourceRef="g_bud_rev" targetRef="t_bud_revise">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="fbud5" name="No" sourceRef="g_bud_rev" targetRef="t_bud_consol" />
<bpmn2:sequenceFlow id="fbud6" sourceRef="t_bud_revise" targetRef="t_bud_challenge" />
<bpmn2:sequenceFlow id="fbud7" sourceRef="t_bud_consol" targetRef="t_bud_present" />
<bpmn2:sequenceFlow id="fbud8" sourceRef="t_bud_present" targetRef="g_bud_appr" />
<bpmn2:sequenceFlow id="fbud9" name="Yes" sourceRef="g_bud_appr" targetRef="t_bud_load">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="fbud10" name="No" sourceRef="g_bud_appr" targetRef="t_bud_feedback" />
<bpmn2:sequenceFlow id="fbud11" sourceRef="t_bud_feedback" targetRef="t_bud_revise" />
<bpmn2:sequenceFlow id="fbud12" sourceRef="t_bud_load" targetRef="end_bud_approved" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_bud_di" bpmnElement="pool_bud" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1420" height="390" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_bud_holder_di" bpmnElement="lane_bud_holder" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_bud_fbp_di" bpmnElement="lane_bud_fbp" isHorizontal="true">
<dc:Bounds x="50" y="150" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_bud_exco_di" bpmnElement="lane_bud_exco" isHorizontal="true">
<dc:Bounds x="50" y="280" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_bud_di" bpmnElement="start_bud">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="78" y="101" width="105" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_prep_di" bpmnElement="t_bud_prep">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_challenge_di" bpmnElement="t_bud_challenge">
<dc:Bounds x="380" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_bud_rev_di" bpmnElement="g_bud_rev">
<dc:Bounds x="555" y="182" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="532" y="162" width="96" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_revise_di" bpmnElement="t_bud_revise">
<dc:Bounds x="1280" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_consol_di" bpmnElement="t_bud_consol">
<dc:Bounds x="680" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_present_di" bpmnElement="t_bud_present">
<dc:Bounds x="830" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_bud_appr_di" bpmnElement="g_bud_appr">
<dc:Bounds x="1005" y="312" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="984" y="292" width="92" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_feedback_di" bpmnElement="t_bud_feedback">
<dc:Bounds x="1130" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_bud_load_di" bpmnElement="t_bud_load">
<dc:Bounds x="1130" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_bud_approved_di" bpmnElement="end_bud_approved">
<dc:Bounds x="1312" y="189" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1287" y="231" width="86" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="fbud1_di" bpmnElement="fbud1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud2_di" bpmnElement="fbud2">
<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="fbud3_di" bpmnElement="fbud3">
<di:waypoint x="480" y="207" />
<di:waypoint x="555" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud4_di" bpmnElement="fbud4">
<di:waypoint x="605" y="207" />
<di:waypoint x="660" y="207" />
<di:waypoint x="660" y="156" />
<di:waypoint x="1260" y="156" />
<di:waypoint x="1260" y="77" />
<di:waypoint x="1280" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="611" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud5_di" bpmnElement="fbud5">
<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="fbud6_di" bpmnElement="fbud6">
<di:waypoint x="1380" y="77" />
<di:waypoint x="1410" y="77" />
<di:waypoint x="1410" y="132" />
<di:waypoint x="360" y="132" />
<di:waypoint x="360" y="207" />
<di:waypoint x="380" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud7_di" bpmnElement="fbud7">
<di:waypoint x="780" y="207" />
<di:waypoint x="830" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud8_di" bpmnElement="fbud8">
<di:waypoint x="930" y="207" />
<di:waypoint x="960" y="207" />
<di:waypoint x="960" y="337" />
<di:waypoint x="1005" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud9_di" bpmnElement="fbud9">
<di:waypoint x="1055" y="337" />
<di:waypoint x="1110" y="337" />
<di:waypoint x="1110" y="207" />
<di:waypoint x="1130" y="207" />
<bpmndi:BPMNLabel><dc:Bounds x="1061" y="317" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud10_di" bpmnElement="fbud10">
<di:waypoint x="1055" y="337" />
<di:waypoint x="1130" y="337" />
<bpmndi:BPMNLabel><dc:Bounds x="1061" y="343" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud11_di" bpmnElement="fbud11">
<di:waypoint x="1230" y="337" />
<di:waypoint x="1260" y="337" />
<di:waypoint x="1260" y="77" />
<di:waypoint x="1280" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fbud12_di" bpmnElement="fbud12">
<di:waypoint x="1230" y="207" />
<di:waypoint x="1312" y="207" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Is it acceptable for two loops to share one revision task?
Yes, and it is often the clearer choice. Pointing both the finance challenge and the committee feedback at the same "Revise budget submission" task says that revision is one activity regardless of who triggered it. The alternative, duplicating the task per loop, doubles maintenance and suggests two different kinds of revision that do not really exist.
Why is the executive committee a lane and not a pool?
The committee participates in the same process instance as everyone else: the token physically moves into its lane and back out along sequence flows. A pool would make it a separate participant that only exchanges messages, forcing message flows where none are needed. Inside one organisation, governance bodies are almost always lanes.
Where would a deadline timer attach in this model?
The revision loop is the risk, so attach the timer there. An intermediate timer catch event on a parallel escalation path, or a boundary timer on "Revise budget submission", can force the token onwards once the cycle deadline nears, for example by escalating straight to the committee with the latest draft. Deadlines belong on loops that can spin.
Related BPMN examples
Order to cash
A complete order to cash process as a BPMN 2.0 diagram: credit check, fulfilment, invoicing, and payment. View the swimlane diagram and download the .bpmn file free.
Procure to pay
The complete procure to pay cycle as a BPMN 2.0 diagram: requisition approval, purchase order, goods receipt, three way match, and payment. Free .bpmn download.
Invoice approval
Invoice approval as a BPMN 2.0 swimlane diagram: amount thresholds, manager and director approval, and posting to the ledger. View it and download the .bpmn file free.
Expense reimbursement
An expense reimbursement process in BPMN 2.0: policy checks, receipt audit, an amendment loop, and a timed payment run. View the diagram and download the .bpmn free.
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 freeNo credit card required