SwimdraftPricingSign inStart free

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.

Month end close: BPMN 2.0 diagram
Month end close 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
Period end reached
Ends with
Period closed
Lanes
Accounts team · Financial controller
Decisions
Accounts approved?

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

ElementCountIn this diagram
Start event1Period end reached
End event1Period closed
Task5Close subledgers, Post accruals and prepayments, Reconcile bank accounts, Prepare trial balance, Post adjusting journals
User task1Review management accounts
Service task1Run depreciation
Send task1Distribute reporting pack
Exclusive gateway1Accounts approved?
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_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

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