Lead qualification BPMN example
Lead qualification decides which enquiries deserve a salesperson's time and which should mature in a nurture campaign. Teams map it because the handover between marketing and sales is where most pipelines leak: leads sit unscored, discovery calls never get booked, and nobody agrees on what "qualified" means. A shared diagram turns those arguments into explicit gateway conditions.
This example models qualification as one pool with three lanes: Marketing, Sales development, and Account executive. Two exclusive gateways carry the logic, one for the automated score and one for the human judgement after discovery. Worth noticing: both rejection branches route into the same nurture task rather than a dead end, so no lead ever falls out of the process entirely.
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
Everything begins in the Marketing lane when a lead is captured from the website. A service task scores the lead automatically, and the gateway "Score above threshold?" makes the first cut. The No branch, marked as the default flow, adds the lead to a nurture campaign and closes at the "Lead nurtured" end event. The Yes branch drops into the Sales development lane, where the rep researches the account and books a discovery call.
Running the discovery call produces the evidence for the second decision. At "Fit confirmed?", the Yes branch hands the opportunity to the Account executive lane, where creating the opportunity record ends the process at "Opportunity created". The No branch, again the default, sends the lead back to the nurture task in Marketing. Two end events tell the reader that every lead finishes either as pipeline or as a nurture contact, never in limbo.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Lead captured |
| End event | 2 | Lead nurtured, Opportunity created |
| Task | 2 | Add lead to nurture campaign, Create opportunity record |
| User task | 2 | Research the account, Run discovery call |
| Service task | 1 | Score lead |
| Send task | 1 | Book discovery call |
| Exclusive gateway | 2 | Score above threshold?, Fit confirmed? |
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_lq" name="Lead qualification" processRef="Process_pool_lq" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_lq" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_lq">
<bpmn2:lane id="lane_lq_mkt" name="Marketing">
<bpmn2:flowNodeRef>start_lq</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_lq_score</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_lq_score</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_lq_nurture</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_lq_nurture</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_lq_sdr" name="Sales development">
<bpmn2:flowNodeRef>t_lq_research</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_lq_book</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_lq_call</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_lq_fit</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_lq_ae" name="Account executive">
<bpmn2:flowNodeRef>t_lq_opp</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_lq_opp</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_lq" name="Lead captured">
<bpmn2:outgoing>flq1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:serviceTask id="t_lq_score" name="Score lead">
<bpmn2:incoming>flq1</bpmn2:incoming>
<bpmn2:outgoing>flq2</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:exclusiveGateway id="g_lq_score" name="Score above threshold?" default="flq4">
<bpmn2:incoming>flq2</bpmn2:incoming>
<bpmn2:outgoing>flq3</bpmn2:outgoing>
<bpmn2:outgoing>flq4</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="t_lq_nurture" name="Add lead to nurture campaign">
<bpmn2:incoming>flq4</bpmn2:incoming>
<bpmn2:incoming>flq10</bpmn2:incoming>
<bpmn2:outgoing>flq5</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="end_lq_nurture" name="Lead nurtured">
<bpmn2:incoming>flq5</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:userTask id="t_lq_research" name="Research the account">
<bpmn2:incoming>flq3</bpmn2:incoming>
<bpmn2:outgoing>flq6</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sendTask id="t_lq_book" name="Book discovery call">
<bpmn2:incoming>flq6</bpmn2:incoming>
<bpmn2:outgoing>flq7</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:userTask id="t_lq_call" name="Run discovery call">
<bpmn2:incoming>flq7</bpmn2:incoming>
<bpmn2:outgoing>flq8</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_lq_fit" name="Fit confirmed?" default="flq10">
<bpmn2:incoming>flq8</bpmn2:incoming>
<bpmn2:outgoing>flq9</bpmn2:outgoing>
<bpmn2:outgoing>flq10</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="t_lq_opp" name="Create opportunity record">
<bpmn2:incoming>flq9</bpmn2:incoming>
<bpmn2:outgoing>flq11</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="end_lq_opp" name="Opportunity created">
<bpmn2:incoming>flq11</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="flq1" sourceRef="start_lq" targetRef="t_lq_score" />
<bpmn2:sequenceFlow id="flq2" sourceRef="t_lq_score" targetRef="g_lq_score" />
<bpmn2:sequenceFlow id="flq3" name="Yes" sourceRef="g_lq_score" targetRef="t_lq_research">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flq4" name="No" sourceRef="g_lq_score" targetRef="t_lq_nurture" />
<bpmn2:sequenceFlow id="flq5" sourceRef="t_lq_nurture" targetRef="end_lq_nurture" />
<bpmn2:sequenceFlow id="flq6" sourceRef="t_lq_research" targetRef="t_lq_book" />
<bpmn2:sequenceFlow id="flq7" sourceRef="t_lq_book" targetRef="t_lq_call" />
<bpmn2:sequenceFlow id="flq8" sourceRef="t_lq_call" targetRef="g_lq_fit" />
<bpmn2:sequenceFlow id="flq9" name="Yes" sourceRef="g_lq_fit" targetRef="t_lq_opp">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="flq10" name="No" sourceRef="g_lq_fit" targetRef="t_lq_nurture" />
<bpmn2:sequenceFlow id="flq11" sourceRef="t_lq_opp" targetRef="end_lq_opp" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_lq_di" bpmnElement="pool_lq" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1420" height="390" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_lq_mkt_di" bpmnElement="lane_lq_mkt" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_lq_sdr_di" bpmnElement="lane_lq_sdr" isHorizontal="true">
<dc:Bounds x="50" y="150" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_lq_ae_di" bpmnElement="lane_lq_ae" isHorizontal="true">
<dc:Bounds x="50" y="280" width="1390" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_lq_di" bpmnElement="start_lq">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="94" y="101" width="73" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_lq_score_di" bpmnElement="t_lq_score">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_lq_score_di" bpmnElement="g_lq_score">
<dc:Bounds x="405" y="52" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="371" y="32" width="119" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_lq_nurture_di" bpmnElement="t_lq_nurture">
<dc:Bounds x="1130" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_lq_nurture_di" bpmnElement="end_lq_nurture">
<dc:Bounds x="1312" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1295" y="101" width="71" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_lq_research_di" bpmnElement="t_lq_research">
<dc:Bounds x="530" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_lq_book_di" bpmnElement="t_lq_book">
<dc:Bounds x="680" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_lq_call_di" bpmnElement="t_lq_call">
<dc:Bounds x="830" y="167" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_lq_fit_di" bpmnElement="g_lq_fit">
<dc:Bounds x="1005" y="182" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="994" y="162" width="72" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_lq_opp_di" bpmnElement="t_lq_opp">
<dc:Bounds x="1130" y="297" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_lq_opp_di" bpmnElement="end_lq_opp">
<dc:Bounds x="1312" y="319" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1281" y="361" width="99" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="flq1_di" bpmnElement="flq1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq2_di" bpmnElement="flq2">
<di:waypoint x="330" y="77" />
<di:waypoint x="405" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq3_di" bpmnElement="flq3">
<di:waypoint x="455" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="207" />
<di:waypoint x="530" y="207" />
<bpmndi:BPMNLabel><dc:Bounds x="461" y="57" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq4_di" bpmnElement="flq4">
<di:waypoint x="455" y="77" />
<di:waypoint x="1130" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="461" y="83" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq5_di" bpmnElement="flq5">
<di:waypoint x="1230" y="77" />
<di:waypoint x="1312" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq6_di" bpmnElement="flq6">
<di:waypoint x="630" y="207" />
<di:waypoint x="680" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq7_di" bpmnElement="flq7">
<di:waypoint x="780" y="207" />
<di:waypoint x="830" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq8_di" bpmnElement="flq8">
<di:waypoint x="930" y="207" />
<di:waypoint x="1005" y="207" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq9_di" bpmnElement="flq9">
<di:waypoint x="1055" y="207" />
<di:waypoint x="1110" y="207" />
<di:waypoint x="1110" y="337" />
<di:waypoint x="1130" y="337" />
<bpmndi:BPMNLabel><dc:Bounds x="1061" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq10_di" bpmnElement="flq10">
<di:waypoint x="1055" y="207" />
<di:waypoint x="1110" y="207" />
<di:waypoint x="1110" y="77" />
<di:waypoint x="1130" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="1061" y="213" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="flq11_di" bpmnElement="flq11">
<di:waypoint x="1230" y="337" />
<di:waypoint x="1312" y="337" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why are Marketing and Sales lanes in one pool rather than two pools?
Both teams work inside the same organisation on the same process instance, so lanes in a single pool are correct. Pools imply independent participants that communicate only by message flows. Splitting marketing and sales into pools would force artificial message flows for what is really a simple handover between colleagues.
Why do both No branches point at the same nurture task?
BPMN allows several sequence flows to target one activity, which acts as an implicit merge. Reusing the nurture task keeps the model compact and shows that a failed score and a failed discovery call have the same outcome. If the two rejection paths needed different treatment, you would split them into separate tasks.
How would I add a service level timer to this model?
Attach an intermediate timer event on the path before the discovery call, or a boundary timer on the "Book discovery call" task, set to your response target. When the timer fires you can route to an escalation task in the Sales development lane, which makes slow follow up visible instead of silently tolerated.
Related BPMN examples
Quote approval
A quote approval workflow as a BPMN 2.0 diagram: pricing rules, discount escalation to finance, and a rework loop. See the diagram and download the .bpmn file free.
Sales order processing
Sales order processing as a BPMN 2.0 diagram: stock check, back order timer loop, parallel picking and invoicing. View it and download the .bpmn file free.
Customer onboarding
A customer onboarding process as a BPMN 2.0 diagram: kickoff, parallel provisioning and billing setup, go live checklist. Download the .bpmn file free.
Contract approval
A contract approval workflow as a BPMN 2.0 diagram: legal review, redline loop, finance sign off, and customer signature. Download the .bpmn file 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