User access request BPMN example
A user access request process controls who gets access to which systems, and on whose authority. Security teams map it because access granted informally is access nobody remembers to revoke, and every audit finding about orphaned accounts traces back to a gap in this process. The usual weaknesses are approvals that happen in chat rather than on record, and provisioning steps that finish without anyone updating the access register.
This model is a single pool with three lanes: Requester, Line manager, and IT operations. One exclusive gateway handles the approval decision, and a parallel gateway then splits provisioning into two concurrent activities: granting the application access and updating the access register. The parallel split is the choice worth noticing, because it asserts that the register update is not an optional afterthought but a mandatory branch the process cannot complete without.
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
Work begins when access is requested in the Requester lane and a request form is completed. The Line manager reviews it, and the exclusive gateway "Request approved?" makes the only decision in the flow: the default No branch notifies the requester of the refusal and ends at "Request refused", while the Yes branch hands over to IT operations.
On approval, a parallel gateway splits the flow into two branches that run concurrently: "Provision application access" and "Update access register". A second parallel gateway joins them, so neither branch can be skipped, then IT operations confirms the access with the requester and the process ends at "Access granted". Note the unlabelled flows around the parallel pair: parallel gateways take every branch unconditionally, so condition labels would be meaningless there.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Access requested |
| End event | 2 | Request refused, Access granted |
| Task | 1 | Update access register |
| User task | 2 | Complete access request form, Review access request |
| Service task | 1 | Provision application access |
| Send task | 2 | Notify requester of refusal, Confirm access with requester |
| Exclusive gateway | 1 | Request 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_ua" name="User access request" processRef="Process_pool_ua" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_ua" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_ua">
<bpmn2:lane id="lane_ua_req" name="Requester">
<bpmn2:flowNodeRef>start_ua</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_ua_form</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_ua_mgr" name="Line manager">
<bpmn2:flowNodeRef>t_ua_review</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_ua_appr</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_ua_refuse</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_ua_ref</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_ua_it" name="IT operations">
<bpmn2:flowNodeRef>g_ua_split</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_ua_prov</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_ua_reg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_ua_join</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_ua_confirm</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_ua_ok</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_ua" name="Access requested">
<bpmn2:outgoing>fua1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="t_ua_form" name="Complete access request form">
<bpmn2:incoming>fua1</bpmn2:incoming>
<bpmn2:outgoing>fua2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:userTask id="t_ua_review" name="Review access request">
<bpmn2:incoming>fua2</bpmn2:incoming>
<bpmn2:outgoing>fua3</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_ua_appr" name="Request approved?" default="fua5">
<bpmn2:incoming>fua3</bpmn2:incoming>
<bpmn2:outgoing>fua4</bpmn2:outgoing>
<bpmn2:outgoing>fua5</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sendTask id="t_ua_refuse" name="Notify requester of refusal">
<bpmn2:incoming>fua5</bpmn2:incoming>
<bpmn2:outgoing>fua6</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_ua_ref" name="Request refused">
<bpmn2:incoming>fua6</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:parallelGateway id="g_ua_split">
<bpmn2:incoming>fua4</bpmn2:incoming>
<bpmn2:outgoing>fua7</bpmn2:outgoing>
<bpmn2:outgoing>fua8</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:serviceTask id="t_ua_prov" name="Provision application access">
<bpmn2:incoming>fua7</bpmn2:incoming>
<bpmn2:outgoing>fua9</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:task id="t_ua_reg" name="Update access register">
<bpmn2:incoming>fua8</bpmn2:incoming>
<bpmn2:outgoing>fua10</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:parallelGateway id="g_ua_join">
<bpmn2:incoming>fua9</bpmn2:incoming>
<bpmn2:incoming>fua10</bpmn2:incoming>
<bpmn2:outgoing>fua11</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:sendTask id="t_ua_confirm" name="Confirm access with requester">
<bpmn2:incoming>fua11</bpmn2:incoming>
<bpmn2:outgoing>fua12</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_ua_ok" name="Access granted">
<bpmn2:incoming>fua12</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="fua1" sourceRef="start_ua" targetRef="t_ua_form" />
<bpmn2:sequenceFlow id="fua2" sourceRef="t_ua_form" targetRef="t_ua_review" />
<bpmn2:sequenceFlow id="fua3" sourceRef="t_ua_review" targetRef="g_ua_appr" />
<bpmn2:sequenceFlow id="fua4" name="Yes" sourceRef="g_ua_appr" targetRef="g_ua_split">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="fua5" name="No" sourceRef="g_ua_appr" targetRef="t_ua_refuse" />
<bpmn2:sequenceFlow id="fua6" sourceRef="t_ua_refuse" targetRef="end_ua_ref" />
<bpmn2:sequenceFlow id="fua7" sourceRef="g_ua_split" targetRef="t_ua_prov" />
<bpmn2:sequenceFlow id="fua8" sourceRef="g_ua_split" targetRef="t_ua_reg" />
<bpmn2:sequenceFlow id="fua9" sourceRef="t_ua_prov" targetRef="g_ua_join" />
<bpmn2:sequenceFlow id="fua10" sourceRef="t_ua_reg" targetRef="g_ua_join" />
<bpmn2:sequenceFlow id="fua11" sourceRef="g_ua_join" targetRef="t_ua_confirm" />
<bpmn2:sequenceFlow id="fua12" sourceRef="t_ua_confirm" targetRef="end_ua_ok" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_ua_di" bpmnElement="pool_ua" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1420" height="500" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_ua_req_di" bpmnElement="lane_ua_req" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_ua_mgr_di" bpmnElement="lane_ua_mgr" isHorizontal="true">
<dc:Bounds x="50" y="150" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_ua_it_di" bpmnElement="lane_ua_it" isHorizontal="true">
<dc:Bounds x="50" y="280" width="1390" height="240" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_ua_di" bpmnElement="start_ua">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="85" y="101" width="90" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_ua_form_di" bpmnElement="t_ua_form">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_ua_review_di" bpmnElement="t_ua_review">
<dc:Bounds x="380" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_ua_appr_di" bpmnElement="g_ua_appr">
<dc:Bounds x="555" y="182" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="531" y="162" width="98" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_ua_refuse_di" bpmnElement="t_ua_refuse">
<dc:Bounds x="680" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_ua_ref_di" bpmnElement="end_ua_ref">
<dc:Bounds x="862" y="189" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="839" y="231" width="83" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_ua_split_di" bpmnElement="g_ua_split">
<dc:Bounds x="705" y="312" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_ua_prov_di" bpmnElement="t_ua_prov">
<dc:Bounds x="830" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_ua_reg_di" bpmnElement="t_ua_reg">
<dc:Bounds x="830" y="407" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_ua_join_di" bpmnElement="g_ua_join">
<dc:Bounds x="1005" y="312" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_ua_confirm_di" bpmnElement="t_ua_confirm">
<dc:Bounds x="1130" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_ua_ok_di" bpmnElement="end_ua_ok">
<dc:Bounds x="1312" y="319" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1291" y="361" width="78" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="fua1_di" bpmnElement="fua1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua2_di" bpmnElement="fua2">
<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="fua3_di" bpmnElement="fua3">
<di:waypoint x="480" y="207" />
<di:waypoint x="555" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua4_di" bpmnElement="fua4">
<di:waypoint x="605" y="207" />
<di:waypoint x="660" y="207" />
<di:waypoint x="660" y="337" />
<di:waypoint x="705" y="337" />
<bpmndi:BPMNLabel><dc:Bounds x="611" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua5_di" bpmnElement="fua5">
<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="fua6_di" bpmnElement="fua6">
<di:waypoint x="780" y="207" />
<di:waypoint x="862" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua7_di" bpmnElement="fua7">
<di:waypoint x="755" y="337" />
<di:waypoint x="830" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua8_di" bpmnElement="fua8">
<di:waypoint x="755" y="337" />
<di:waypoint x="810" y="337" />
<di:waypoint x="810" y="447" />
<di:waypoint x="830" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua9_di" bpmnElement="fua9">
<di:waypoint x="930" y="337" />
<di:waypoint x="1005" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua10_di" bpmnElement="fua10">
<di:waypoint x="930" y="447" />
<di:waypoint x="960" y="447" />
<di:waypoint x="960" y="337" />
<di:waypoint x="1005" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua11_di" bpmnElement="fua11">
<di:waypoint x="1055" y="337" />
<di:waypoint x="1130" y="337" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="fua12_di" bpmnElement="fua12">
<di:waypoint x="1230" y="337" />
<di:waypoint x="1312" y="337" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why use a parallel gateway instead of two sequential tasks?
Sequencing would claim the register can only be updated after provisioning finishes, which is not a real constraint. The parallel split says both must happen and neither depends on the other. The joining gateway then guarantees the confirmation task waits for both, which is exactly the control an auditor wants to see.
Why are there no labels on the flows leaving the parallel gateway?
BPMN semantics forbid conditions on parallel gateway outputs: every outgoing flow is taken, always. Labels such as "Yes" or "No" belong on exclusive or inclusive gateways where the token chooses a path. A label on a parallel branch would mislead readers into thinking the branch is optional when it never is.
How would I extend this model for privileged access requests?
Insert a second exclusive gateway after manager approval asking "Privileged access?", with the Yes branch routed to an additional security review task before provisioning, and the default No branch continuing straight on. This keeps ordinary requests fast while adding a stronger control exactly where the risk justifies it.
Related BPMN examples
Incident management
An ITIL-style incident management process as a BPMN 2.0 diagram: triage, major incident handling, escalation, and review. Download the .bpmn file free.
Change management
An IT change management process as a BPMN 2.0 swimlane diagram: risk assessment, CAB approval, implementation, and rollback. Free .bpmn download included.
Password reset
A password reset process as a BPMN 2.0 diagram: MFA self-service, manual verification fallback, and a message wait state. Free .bpmn file download included.
Software release
A software release process as a BPMN 2.0 diagram: build, regression testing, approval, parallel deployment, and rollback. Download the free .bpmn file.
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