SwimdraftPricingSign inStart free

Customer onboarding BPMN example

Customer onboarding is the stretch between a signed contract and a customer who is actually using what they bought. It is where churn is won or lost, and it is notoriously easy to fumble: sales moves on to the next deal, IT provisions accounts late, and the customer's first impression is a queue. Teams map onboarding to pin down who owns each step in the first weeks of the relationship.

This model spans four lanes in one pool: Sales, Onboarding, IT, and Finance. A parallel gateway is the key structural choice, splitting account provisioning and billing setup to run concurrently after the kickoff call, since neither blocks the other. A go live checklist gateway with a rework loop then holds the gate: the customer is not declared live until every item is closed.

Customer onboarding: BPMN 2.0 diagram
Customer onboarding 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
Contract signed
Ends with
Customer live
Lanes
Sales · Onboarding · IT · Finance
Decisions
Go live criteria met?

How to read this diagram

Signature in hand, the Sales lane opens the process at "Contract signed" by handing over account notes to the Onboarding lane, which runs the kickoff call with the customer. After kickoff, a parallel gateway starts two branches at once: IT provisions the user accounts while Finance sets up the billing profile. The joining gateway releases the flow only when both branches are done, and Onboarding then delivers the training session.

Before anything goes live, Onboarding reviews the go live checklist. At the gateway "Go live criteria met?", the default No branch loops through a task that closes outstanding actions and returns to the review, repeating until the checklist is clean. The Yes branch sends a go live confirmation to the customer and the process finishes at the "Customer live" end event. One end state, deliberately: onboarding either completes or keeps iterating.

BPMN elements used

ElementCountIn this diagram
Start event1Contract signed
End event1Customer live
Task3Hand over account notes, Set up billing profile, Close outstanding actions
User task3Run kickoff call, Deliver training session, Review go live checklist
Service task1Provision user accounts
Send task1Confirm go live to customer
Exclusive gateway1Go live criteria met?
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_cob" name="Customer onboarding" processRef="Process_pool_cob" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_cob" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_cob">
      <bpmn2:lane id="lane_cob_sales" name="Sales">
        <bpmn2:flowNodeRef>start_cob</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cob_handover</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_cob_onb" name="Onboarding">
        <bpmn2:flowNodeRef>t_cob_kickoff</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_cob_split</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_cob_join</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cob_training</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cob_review</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_cob_live</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cob_actions</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cob_confirm</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_cob_live</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_cob_it" name="IT">
        <bpmn2:flowNodeRef>t_cob_provision</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_cob_fin" name="Finance">
        <bpmn2:flowNodeRef>t_cob_billing</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_cob" name="Contract signed">
      <bpmn2:outgoing>fcob1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:task id="t_cob_handover" name="Hand over account notes">
      <bpmn2:incoming>fcob1</bpmn2:incoming>
      <bpmn2:outgoing>fcob2</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:userTask id="t_cob_kickoff" name="Run kickoff call">
      <bpmn2:incoming>fcob2</bpmn2:incoming>
      <bpmn2:outgoing>fcob3</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:parallelGateway id="g_cob_split">
      <bpmn2:incoming>fcob3</bpmn2:incoming>
      <bpmn2:outgoing>fcob4</bpmn2:outgoing>
      <bpmn2:outgoing>fcob5</bpmn2:outgoing>
    </bpmn2:parallelGateway>
    <bpmn2:serviceTask id="t_cob_provision" name="Provision user accounts">
      <bpmn2:incoming>fcob4</bpmn2:incoming>
      <bpmn2:outgoing>fcob6</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:task id="t_cob_billing" name="Set up billing profile">
      <bpmn2:incoming>fcob5</bpmn2:incoming>
      <bpmn2:outgoing>fcob7</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:parallelGateway id="g_cob_join">
      <bpmn2:incoming>fcob6</bpmn2:incoming>
      <bpmn2:incoming>fcob7</bpmn2:incoming>
      <bpmn2:outgoing>fcob8</bpmn2:outgoing>
    </bpmn2:parallelGateway>
    <bpmn2:userTask id="t_cob_training" name="Deliver training session">
      <bpmn2:incoming>fcob8</bpmn2:incoming>
      <bpmn2:outgoing>fcob9</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:userTask id="t_cob_review" name="Review go live checklist">
      <bpmn2:incoming>fcob9</bpmn2:incoming>
      <bpmn2:incoming>fcob13</bpmn2:incoming>
      <bpmn2:outgoing>fcob10</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_cob_live" name="Go live criteria met?" default="fcob12">
      <bpmn2:incoming>fcob10</bpmn2:incoming>
      <bpmn2:outgoing>fcob11</bpmn2:outgoing>
      <bpmn2:outgoing>fcob12</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:task id="t_cob_actions" name="Close outstanding actions">
      <bpmn2:incoming>fcob12</bpmn2:incoming>
      <bpmn2:outgoing>fcob13</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:sendTask id="t_cob_confirm" name="Confirm go live to customer">
      <bpmn2:incoming>fcob11</bpmn2:incoming>
      <bpmn2:outgoing>fcob14</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:endEvent id="end_cob_live" name="Customer live">
      <bpmn2:incoming>fcob14</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="fcob1" sourceRef="start_cob" targetRef="t_cob_handover" />
    <bpmn2:sequenceFlow id="fcob2" sourceRef="t_cob_handover" targetRef="t_cob_kickoff" />
    <bpmn2:sequenceFlow id="fcob3" sourceRef="t_cob_kickoff" targetRef="g_cob_split" />
    <bpmn2:sequenceFlow id="fcob4" sourceRef="g_cob_split" targetRef="t_cob_provision" />
    <bpmn2:sequenceFlow id="fcob5" sourceRef="g_cob_split" targetRef="t_cob_billing" />
    <bpmn2:sequenceFlow id="fcob6" sourceRef="t_cob_provision" targetRef="g_cob_join" />
    <bpmn2:sequenceFlow id="fcob7" sourceRef="t_cob_billing" targetRef="g_cob_join" />
    <bpmn2:sequenceFlow id="fcob8" sourceRef="g_cob_join" targetRef="t_cob_training" />
    <bpmn2:sequenceFlow id="fcob9" sourceRef="t_cob_training" targetRef="t_cob_review" />
    <bpmn2:sequenceFlow id="fcob10" sourceRef="t_cob_review" targetRef="g_cob_live" />
    <bpmn2:sequenceFlow id="fcob11" name="Yes" sourceRef="g_cob_live" targetRef="t_cob_confirm">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fcob12" name="No" sourceRef="g_cob_live" targetRef="t_cob_actions" />
    <bpmn2:sequenceFlow id="fcob13" sourceRef="t_cob_actions" targetRef="t_cob_review" />
    <bpmn2:sequenceFlow id="fcob14" sourceRef="t_cob_confirm" targetRef="end_cob_live" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_cob_di" bpmnElement="pool_cob" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1720" height="630" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cob_sales_di" bpmnElement="lane_cob_sales" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1690" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cob_onb_di" bpmnElement="lane_cob_onb" isHorizontal="true">
        <dc:Bounds x="50" y="150" width="1690" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cob_it_di" bpmnElement="lane_cob_it" isHorizontal="true">
        <dc:Bounds x="50" y="390" width="1690" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cob_fin_di" bpmnElement="lane_cob_fin" isHorizontal="true">
        <dc:Bounds x="50" y="520" width="1690" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_cob_di" bpmnElement="start_cob">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="90" y="101" width="80" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_handover_di" bpmnElement="t_cob_handover">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_kickoff_di" bpmnElement="t_cob_kickoff">
        <dc:Bounds x="380" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_cob_split_di" bpmnElement="g_cob_split">
        <dc:Bounds x="555" y="182" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_provision_di" bpmnElement="t_cob_provision">
        <dc:Bounds x="680" y="407" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_billing_di" bpmnElement="t_cob_billing">
        <dc:Bounds x="680" y="537" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_cob_join_di" bpmnElement="g_cob_join">
        <dc:Bounds x="855" y="182" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_training_di" bpmnElement="t_cob_training">
        <dc:Bounds x="980" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_review_di" bpmnElement="t_cob_review">
        <dc:Bounds x="1130" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_cob_live_di" bpmnElement="g_cob_live">
        <dc:Bounds x="1305" y="182" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="1280" y="162" width="100" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_actions_di" bpmnElement="t_cob_actions">
        <dc:Bounds x="1430" y="277" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cob_confirm_di" bpmnElement="t_cob_confirm">
        <dc:Bounds x="1430" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_cob_live_di" bpmnElement="end_cob_live">
        <dc:Bounds x="1612" y="189" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1595" y="231" width="70" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="fcob1_di" bpmnElement="fcob1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob2_di" bpmnElement="fcob2">
        <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="fcob3_di" bpmnElement="fcob3">
        <di:waypoint x="480" y="207" />
        <di:waypoint x="555" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob4_di" bpmnElement="fcob4">
        <di:waypoint x="605" y="207" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="660" y="447" />
        <di:waypoint x="680" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob5_di" bpmnElement="fcob5">
        <di:waypoint x="605" y="207" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="660" y="577" />
        <di:waypoint x="680" y="577" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob6_di" bpmnElement="fcob6">
        <di:waypoint x="780" y="447" />
        <di:waypoint x="810" y="447" />
        <di:waypoint x="810" y="207" />
        <di:waypoint x="855" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob7_di" bpmnElement="fcob7">
        <di:waypoint x="780" y="577" />
        <di:waypoint x="810" y="577" />
        <di:waypoint x="810" y="207" />
        <di:waypoint x="855" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob8_di" bpmnElement="fcob8">
        <di:waypoint x="905" y="207" />
        <di:waypoint x="980" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob9_di" bpmnElement="fcob9">
        <di:waypoint x="1080" y="207" />
        <di:waypoint x="1130" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob10_di" bpmnElement="fcob10">
        <di:waypoint x="1230" y="207" />
        <di:waypoint x="1305" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob11_di" bpmnElement="fcob11">
        <di:waypoint x="1355" y="207" />
        <di:waypoint x="1430" y="207" />
        <bpmndi:BPMNLabel><dc:Bounds x="1361" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob12_di" bpmnElement="fcob12">
        <di:waypoint x="1355" y="207" />
        <di:waypoint x="1410" y="207" />
        <di:waypoint x="1410" y="317" />
        <di:waypoint x="1430" y="317" />
        <bpmndi:BPMNLabel><dc:Bounds x="1361" y="213" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob13_di" bpmnElement="fcob13">
        <di:waypoint x="1530" y="317" />
        <di:waypoint x="1560" y="317" />
        <di:waypoint x="1560" y="372" />
        <di:waypoint x="1110" y="372" />
        <di:waypoint x="1110" y="207" />
        <di:waypoint x="1130" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcob14_di" bpmnElement="fcob14">
        <di:waypoint x="1530" y="207" />
        <di:waypoint x="1612" y="207" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why keep the customer out of the diagram rather than adding a customer pool?

This model documents internal accountability, so the customer appears only as the counterparty of the kickoff and confirmation tasks. Adding a black box customer pool with message flows is a reasonable extension once you want to show what you send and receive, but it doubles the visual weight for little internal insight.

Why does the checklist loop return to the review task instead of the gateway?

A gateway routes tokens, it does not do work, so the loop must re-enter through the activity that produces the decision data. Looping back to "Review go live checklist" means the criteria are checked again after actions are closed, and the gateway simply reads the fresh result. Flows into a gateway from a loop also blur its split semantics.

Where would an escalation fit if onboarding stalls?

Attach a timer to the rework loop, for example a boundary timer on "Close outstanding actions" set to a week. When it fires, route to an escalation task in the Sales lane so the account owner re-engages the customer. This keeps the happy path clean while making chronic stalls visible to someone with authority to fix them.

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