Month end close BPMN example
Month end close is the recurring sprint to turn a month of transactions into a trustworthy set of accounts. Finance teams map it because it is checklist work under time pressure: dozens of dependent tasks, several people, and a hard reporting deadline. When the sequence lives in one controller's head, the close slips the moment that person is on leave.
The model shows a single pool with Accounts team and Financial controller lanes. Its centrepiece is a parallel gateway pair that fans out three independent workstreams, accruals, bank reconciliations, and depreciation, then synchronises them before the trial balance. An exclusive gateway with an adjustment loop covers the controller's review. The parallel block is the point: these tasks genuinely do not wait for each other.
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
When the period end is reached, the Accounts team closes the subledgers, and a parallel gateway then splits the token three ways with no conditions attached: accruals and prepayments are posted, bank accounts are reconciled, and the depreciation run executes, all at the same time. The joining parallel gateway waits for all three branches to finish before the trial balance is prepared, which is exactly the synchronisation the real process needs.
Review then moves to the Financial controller lane. At "Accounts approved?", the default No branch posts adjusting journals and loops back into review, repeating until the controller is satisfied. The Yes branch distributes the reporting pack and the process ends at "Period closed". One end event is enough here: a close that never finishes is a scheduling problem, not a distinct business outcome.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Period end reached |
| End event | 1 | Period closed |
| Task | 5 | Close subledgers, Post accruals and prepayments, Reconcile bank accounts, Prepare trial balance, Post adjusting journals |
| User task | 1 | Review management accounts |
| Service task | 1 | Run depreciation |
| Send task | 1 | Distribute reporting pack |
| Exclusive gateway | 1 | Accounts approved? |
| Parallel gateway | 2 |
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_mec" name="Month end close" processRef="Process_pool_mec" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_mec" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_mec">
<bpmn2:lane id="lane_mec_acc" name="Accounts team">
<bpmn2:flowNodeRef>start_mec</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_lock</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_mec_split</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_accrue</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_recon</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_depr</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_mec_join</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_tb</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_adjust</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_mec_ctrl" name="Financial controller">
<bpmn2:flowNodeRef>t_mec_review</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_mec_ok</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_mec_pack</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_mec_closed</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_mec" name="Period end reached">
<bpmn2:outgoing>fmec1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:task id="t_mec_lock" name="Close subledgers">
<bpmn2:incoming>fmec1</bpmn2:incoming>
<bpmn2:outgoing>fmec2</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:parallelGateway id="g_mec_split">
<bpmn2:incoming>fmec2</bpmn2:incoming>
<bpmn2:outgoing>fmec3</bpmn2:outgoing>
<bpmn2:outgoing>fmec4</bpmn2:outgoing>
<bpmn2:outgoing>fmec5</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:task id="t_mec_accrue" name="Post accruals and prepayments">
<bpmn2:incoming>fmec3</bpmn2:incoming>
<bpmn2:outgoing>fmec6</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:task id="t_mec_recon" name="Reconcile bank accounts">
<bpmn2:incoming>fmec4</bpmn2:incoming>
<bpmn2:outgoing>fmec7</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:serviceTask id="t_mec_depr" name="Run depreciation">
<bpmn2:incoming>fmec5</bpmn2:incoming>
<bpmn2:outgoing>fmec8</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:parallelGateway id="g_mec_join">
<bpmn2:incoming>fmec6</bpmn2:incoming>
<bpmn2:incoming>fmec7</bpmn2:incoming>
<bpmn2:incoming>fmec8</bpmn2:incoming>
<bpmn2:outgoing>fmec9</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:task id="t_mec_tb" name="Prepare trial balance">
<bpmn2:incoming>fmec9</bpmn2:incoming>
<bpmn2:outgoing>fmec10</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:userTask id="t_mec_review" name="Review management accounts">
<bpmn2:incoming>fmec10</bpmn2:incoming>
<bpmn2:incoming>fmec14</bpmn2:incoming>
<bpmn2:outgoing>fmec11</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_mec_ok" name="Accounts approved?" default="fmec13">
<bpmn2:incoming>fmec11</bpmn2:incoming>
<bpmn2:outgoing>fmec12</bpmn2:outgoing>
<bpmn2:outgoing>fmec13</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="t_mec_adjust" name="Post adjusting journals">
<bpmn2:incoming>fmec13</bpmn2:incoming>
<bpmn2:outgoing>fmec14</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:sendTask id="t_mec_pack" name="Distribute reporting pack">
<bpmn2:incoming>fmec12</bpmn2:incoming>
<bpmn2:outgoing>fmec15</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_mec_closed" name="Period closed">
<bpmn2:incoming>fmec15</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="fmec1" sourceRef="start_mec" targetRef="t_mec_lock" />
<bpmn2:sequenceFlow id="fmec2" sourceRef="t_mec_lock" targetRef="g_mec_split" />
<bpmn2:sequenceFlow id="fmec3" sourceRef="g_mec_split" targetRef="t_mec_accrue" />
<bpmn2:sequenceFlow id="fmec4" sourceRef="g_mec_split" targetRef="t_mec_recon" />
<bpmn2:sequenceFlow id="fmec5" sourceRef="g_mec_split" targetRef="t_mec_depr" />
<bpmn2:sequenceFlow id="fmec6" sourceRef="t_mec_accrue" targetRef="g_mec_join" />
<bpmn2:sequenceFlow id="fmec7" sourceRef="t_mec_recon" targetRef="g_mec_join" />
<bpmn2:sequenceFlow id="fmec8" sourceRef="t_mec_depr" targetRef="g_mec_join" />
<bpmn2:sequenceFlow id="fmec9" sourceRef="g_mec_join" targetRef="t_mec_tb" />
<bpmn2:sequenceFlow id="fmec10" sourceRef="t_mec_tb" targetRef="t_mec_review" />
<bpmn2:sequenceFlow id="fmec11" sourceRef="t_mec_review" targetRef="g_mec_ok" />
<bpmn2:sequenceFlow id="fmec12" name="Yes" sourceRef="g_mec_ok" targetRef="t_mec_pack">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="fmec13" name="No" sourceRef="g_mec_ok" targetRef="t_mec_adjust" />
<bpmn2:sequenceFlow id="fmec14" sourceRef="t_mec_adjust" targetRef="t_mec_review" />
<bpmn2:sequenceFlow id="fmec15" sourceRef="t_mec_pack" targetRef="end_mec_closed" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_mec_di" bpmnElement="pool_mec" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1570" height="480" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_mec_acc_di" bpmnElement="lane_mec_acc" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1540" height="350" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_mec_ctrl_di" bpmnElement="lane_mec_ctrl" isHorizontal="true">
<dc:Bounds x="50" y="370" width="1540" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_mec_di" bpmnElement="start_mec">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="81" y="101" width="98" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_lock_di" bpmnElement="t_mec_lock">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_mec_split_di" bpmnElement="g_mec_split">
<dc:Bounds x="405" y="52" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_accrue_di" bpmnElement="t_mec_accrue">
<dc:Bounds x="530" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_recon_di" bpmnElement="t_mec_recon">
<dc:Bounds x="530" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_depr_di" bpmnElement="t_mec_depr">
<dc:Bounds x="530" y="257" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_mec_join_di" bpmnElement="g_mec_join">
<dc:Bounds x="705" y="52" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_tb_di" bpmnElement="t_mec_tb">
<dc:Bounds x="830" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_review_di" bpmnElement="t_mec_review">
<dc:Bounds x="980" y="387" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_mec_ok_di" bpmnElement="g_mec_ok">
<dc:Bounds x="1155" y="402" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="1129" y="382" width="103" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_adjust_di" bpmnElement="t_mec_adjust">
<dc:Bounds x="1280" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_mec_pack_di" bpmnElement="t_mec_pack">
<dc:Bounds x="1280" y="387" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_mec_closed_di" bpmnElement="end_mec_closed">
<dc:Bounds x="1462" y="409" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1446" y="451" width="69" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="fmec1_di" bpmnElement="fmec1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec2_di" bpmnElement="fmec2">
<di:waypoint x="330" y="77" />
<di:waypoint x="405" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec3_di" bpmnElement="fmec3">
<di:waypoint x="455" y="77" />
<di:waypoint x="530" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec4_di" bpmnElement="fmec4">
<di:waypoint x="455" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="187" />
<di:waypoint x="530" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec5_di" bpmnElement="fmec5">
<di:waypoint x="455" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="297" />
<di:waypoint x="530" y="297" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec6_di" bpmnElement="fmec6">
<di:waypoint x="630" y="77" />
<di:waypoint x="705" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec7_di" bpmnElement="fmec7">
<di:waypoint x="630" y="187" />
<di:waypoint x="660" y="187" />
<di:waypoint x="660" y="77" />
<di:waypoint x="705" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec8_di" bpmnElement="fmec8">
<di:waypoint x="630" y="297" />
<di:waypoint x="660" y="297" />
<di:waypoint x="660" y="77" />
<di:waypoint x="705" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec9_di" bpmnElement="fmec9">
<di:waypoint x="755" y="77" />
<di:waypoint x="830" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec10_di" bpmnElement="fmec10">
<di:waypoint x="930" y="77" />
<di:waypoint x="960" y="77" />
<di:waypoint x="960" y="427" />
<di:waypoint x="980" y="427" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec11_di" bpmnElement="fmec11">
<di:waypoint x="1080" y="427" />
<di:waypoint x="1155" y="427" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec12_di" bpmnElement="fmec12">
<di:waypoint x="1205" y="427" />
<di:waypoint x="1280" y="427" />
<bpmndi:BPMNLabel><dc:Bounds x="1211" y="407" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec13_di" bpmnElement="fmec13">
<di:waypoint x="1205" y="427" />
<di:waypoint x="1260" y="427" />
<di:waypoint x="1260" y="77" />
<di:waypoint x="1280" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="1211" y="433" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec14_di" bpmnElement="fmec14">
<di:waypoint x="1380" y="77" />
<di:waypoint x="1410" y="77" />
<di:waypoint x="1410" y="132" />
<di:waypoint x="960" y="132" />
<di:waypoint x="960" y="427" />
<di:waypoint x="980" y="427" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fmec15_di" bpmnElement="fmec15">
<di:waypoint x="1380" y="427" />
<di:waypoint x="1462" y="427" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why a parallel gateway instead of an inclusive or exclusive one?
All three workstreams must happen every month with no conditions, which is precisely the parallel gateway's meaning: every outgoing path fires, and the join waits for every token. An exclusive gateway would pick one path only, and an inclusive gateway would imply some conditional subset. Unconditional fan-out and synchronisation is the parallel gateway's only job.
Why do the parallel gateway's flows have no labels?
Labels on outgoing flows express conditions, and a parallel split is unconditional by definition, so the BPMN spec expects its flows to be bare. The same applies to default markers. If you find yourself wanting a condition on one branch of a parallel split, that branch belongs behind an exclusive or inclusive gateway instead.
Can I extend this diagram with my own close checklist?
Yes, and it is the natural next step: add tasks such as intercompany eliminations or VAT reconciliation as extra branches between the two parallel gateways. In Swimdraft's editor, built on the same engine as Camunda Modeler, the diagram is re-validated live as you edit, and the result exports as .bpmn, SVG, or PNG.
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