SwimdraftPricingSign inStart free

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.

User access request: BPMN 2.0 diagram
User access 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
Access requested
Ends with
Request refused · Access granted
Lanes
Requester · Line manager · IT operations
Decisions
Request approved?

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

ElementCountIn this diagram
Start event1Access requested
End event2Request refused, Access granted
Task1Update access register
User task2Complete access request form, Review access request
Service task1Provision application access
Send task2Notify requester of refusal, Confirm access with requester
Exclusive gateway1Request 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_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

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