RFP response BPMN example
Responding to a request for proposal is a project squeezed into a sales process: a hard deadline, contributions from several specialists, and a formal submission at the end. Teams map it because the cost of a chaotic response is high in both directions, either wasted effort on bids you should have declined or a rushed, incoherent document on bids you should have won.
The model runs in one pool with Sales, Bid team, and Presales lanes. Its opening gateway is the famous bid or no bid decision, taken before any drafting effort is spent. A parallel gateway then splits technical drafting from pricing, and a review loop at the end holds submission until the bid manager is satisfied. Notice that the decline path is a send task, not a silent exit: telling the buyer you are not bidding protects the relationship.
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
An invitation to tender starts the clock at the "RFP received" event in the Sales lane, where the account owner assesses bid fit against the qualification criteria. The gateway "Bid on this RFP?" makes the commitment decision early: the default "No bid" branch sends a polite decline to the buyer and ends at "RFP declined", while the "Bid" branch opens a parallel gateway so work can fan out immediately.
On the concurrent branches, Presales drafts the technical sections while Sales prepares the pricing schedule. The joining gateway hands the assembled draft to the Bid team, which reviews the final response. "Ready to submit?" guards the exit: its default No branch routes through addressing review comments and back into review, as many rounds as the deadline allows, and the Yes branch submits the response, ending at "Response submitted". Two end events give an honest picture: some RFPs end with a submission, others with a deliberate decline.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | RFP received |
| End event | 2 | RFP declined, Response submitted |
| Task | 2 | Prepare pricing schedule, Address review comments |
| User task | 3 | Assess bid fit, Draft technical sections, Review final response |
| Send task | 2 | Send decline note, Submit response |
| Exclusive gateway | 2 | Bid on this RFP?, Ready to submit? |
| 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_rfp" name="RFP response" processRef="Process_pool_rfp" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_rfp" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_rfp">
<bpmn2:lane id="lane_rfp_sales" name="Sales">
<bpmn2:flowNodeRef>start_rfp</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_rfp_assess</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_rfp_bid</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_rfp_decline</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_rfp_declined</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_rfp_price</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_rfp_bid" name="Bid team">
<bpmn2:flowNodeRef>g_rfp_split</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_rfp_join</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_rfp_review</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_rfp_ready</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_rfp_fix</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_rfp_submit</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_rfp_submitted</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_rfp_pre" name="Presales">
<bpmn2:flowNodeRef>t_rfp_tech</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_rfp" name="RFP received">
<bpmn2:outgoing>frfp1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="t_rfp_assess" name="Assess bid fit">
<bpmn2:incoming>frfp1</bpmn2:incoming>
<bpmn2:outgoing>frfp2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_rfp_bid" name="Bid on this RFP?" default="frfp4">
<bpmn2:incoming>frfp2</bpmn2:incoming>
<bpmn2:outgoing>frfp3</bpmn2:outgoing>
<bpmn2:outgoing>frfp4</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sendTask id="t_rfp_decline" name="Send decline note">
<bpmn2:incoming>frfp4</bpmn2:incoming>
<bpmn2:outgoing>frfp5</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_rfp_declined" name="RFP declined">
<bpmn2:incoming>frfp5</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:parallelGateway id="g_rfp_split">
<bpmn2:incoming>frfp3</bpmn2:incoming>
<bpmn2:outgoing>frfp6</bpmn2:outgoing>
<bpmn2:outgoing>frfp7</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:userTask id="t_rfp_tech" name="Draft technical sections">
<bpmn2:incoming>frfp6</bpmn2:incoming>
<bpmn2:outgoing>frfp8</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:task id="t_rfp_price" name="Prepare pricing schedule">
<bpmn2:incoming>frfp7</bpmn2:incoming>
<bpmn2:outgoing>frfp9</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:parallelGateway id="g_rfp_join">
<bpmn2:incoming>frfp8</bpmn2:incoming>
<bpmn2:incoming>frfp9</bpmn2:incoming>
<bpmn2:outgoing>frfp10</bpmn2:outgoing>
</bpmn2:parallelGateway>
<bpmn2:userTask id="t_rfp_review" name="Review final response">
<bpmn2:incoming>frfp10</bpmn2:incoming>
<bpmn2:incoming>frfp14</bpmn2:incoming>
<bpmn2:outgoing>frfp11</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_rfp_ready" name="Ready to submit?" default="frfp13">
<bpmn2:incoming>frfp11</bpmn2:incoming>
<bpmn2:outgoing>frfp12</bpmn2:outgoing>
<bpmn2:outgoing>frfp13</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="t_rfp_fix" name="Address review comments">
<bpmn2:incoming>frfp13</bpmn2:incoming>
<bpmn2:outgoing>frfp14</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:sendTask id="t_rfp_submit" name="Submit response">
<bpmn2:incoming>frfp12</bpmn2:incoming>
<bpmn2:outgoing>frfp15</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_rfp_submitted" name="Response submitted">
<bpmn2:incoming>frfp15</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="frfp1" sourceRef="start_rfp" targetRef="t_rfp_assess" />
<bpmn2:sequenceFlow id="frfp2" sourceRef="t_rfp_assess" targetRef="g_rfp_bid" />
<bpmn2:sequenceFlow id="frfp3" name="Bid" sourceRef="g_rfp_bid" targetRef="g_rfp_split">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Bid</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="frfp4" name="No bid" sourceRef="g_rfp_bid" targetRef="t_rfp_decline" />
<bpmn2:sequenceFlow id="frfp5" sourceRef="t_rfp_decline" targetRef="end_rfp_declined" />
<bpmn2:sequenceFlow id="frfp6" sourceRef="g_rfp_split" targetRef="t_rfp_tech" />
<bpmn2:sequenceFlow id="frfp7" sourceRef="g_rfp_split" targetRef="t_rfp_price" />
<bpmn2:sequenceFlow id="frfp8" sourceRef="t_rfp_tech" targetRef="g_rfp_join" />
<bpmn2:sequenceFlow id="frfp9" sourceRef="t_rfp_price" targetRef="g_rfp_join" />
<bpmn2:sequenceFlow id="frfp10" sourceRef="g_rfp_join" targetRef="t_rfp_review" />
<bpmn2:sequenceFlow id="frfp11" sourceRef="t_rfp_review" targetRef="g_rfp_ready" />
<bpmn2:sequenceFlow id="frfp12" name="Yes" sourceRef="g_rfp_ready" targetRef="t_rfp_submit">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="frfp13" name="No" sourceRef="g_rfp_ready" targetRef="t_rfp_fix" />
<bpmn2:sequenceFlow id="frfp14" sourceRef="t_rfp_fix" targetRef="t_rfp_review" />
<bpmn2:sequenceFlow id="frfp15" sourceRef="t_rfp_submit" targetRef="end_rfp_submitted" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_rfp_di" bpmnElement="pool_rfp" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1570" height="610" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_rfp_sales_di" bpmnElement="lane_rfp_sales" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1540" height="240" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_rfp_bid_di" bpmnElement="lane_rfp_bid" isHorizontal="true">
<dc:Bounds x="50" y="260" width="1540" height="240" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_rfp_pre_di" bpmnElement="lane_rfp_pre" isHorizontal="true">
<dc:Bounds x="50" y="500" width="1540" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_rfp_di" bpmnElement="start_rfp">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="96" y="101" width="69" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_assess_di" bpmnElement="t_rfp_assess">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_rfp_bid_di" bpmnElement="g_rfp_bid">
<dc:Bounds x="405" y="52" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="388" y="32" width="85" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_decline_di" bpmnElement="t_rfp_decline">
<dc:Bounds x="530" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_rfp_declined_di" bpmnElement="end_rfp_declined">
<dc:Bounds x="712" y="169" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="696" y="211" width="69" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_rfp_split_di" bpmnElement="g_rfp_split">
<dc:Bounds x="555" y="292" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_tech_di" bpmnElement="t_rfp_tech">
<dc:Bounds x="680" y="517" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_price_di" bpmnElement="t_rfp_price">
<dc:Bounds x="680" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_rfp_join_di" bpmnElement="g_rfp_join">
<dc:Bounds x="855" y="292" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_review_di" bpmnElement="t_rfp_review">
<dc:Bounds x="980" y="277" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_rfp_ready_di" bpmnElement="g_rfp_ready">
<dc:Bounds x="1155" y="292" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="1136" y="272" width="88" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_fix_di" bpmnElement="t_rfp_fix">
<dc:Bounds x="1280" y="387" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_rfp_submit_di" bpmnElement="t_rfp_submit">
<dc:Bounds x="1280" y="277" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_rfp_submitted_di" bpmnElement="end_rfp_submitted">
<dc:Bounds x="1462" y="299" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1429" y="341" width="103" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="frfp1_di" bpmnElement="frfp1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp2_di" bpmnElement="frfp2">
<di:waypoint x="330" y="77" />
<di:waypoint x="405" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp3_di" bpmnElement="frfp3">
<di:waypoint x="455" y="77" />
<di:waypoint x="510" y="77" />
<di:waypoint x="510" y="317" />
<di:waypoint x="555" y="317" />
<bpmndi:BPMNLabel><dc:Bounds x="461" y="57" width="18" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp4_di" bpmnElement="frfp4">
<di:waypoint x="455" y="77" />
<di:waypoint x="530" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="461" y="83" width="34" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp5_di" bpmnElement="frfp5">
<di:waypoint x="630" y="77" />
<di:waypoint x="660" y="77" />
<di:waypoint x="660" y="187" />
<di:waypoint x="712" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp6_di" bpmnElement="frfp6">
<di:waypoint x="605" y="317" />
<di:waypoint x="660" y="317" />
<di:waypoint x="660" y="557" />
<di:waypoint x="680" y="557" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp7_di" bpmnElement="frfp7">
<di:waypoint x="605" y="317" />
<di:waypoint x="660" y="317" />
<di:waypoint x="660" y="77" />
<di:waypoint x="680" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp8_di" bpmnElement="frfp8">
<di:waypoint x="780" y="557" />
<di:waypoint x="810" y="557" />
<di:waypoint x="810" y="317" />
<di:waypoint x="855" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp9_di" bpmnElement="frfp9">
<di:waypoint x="780" y="77" />
<di:waypoint x="810" y="77" />
<di:waypoint x="810" y="317" />
<di:waypoint x="855" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp10_di" bpmnElement="frfp10">
<di:waypoint x="905" y="317" />
<di:waypoint x="980" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp11_di" bpmnElement="frfp11">
<di:waypoint x="1080" y="317" />
<di:waypoint x="1155" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp12_di" bpmnElement="frfp12">
<di:waypoint x="1205" y="317" />
<di:waypoint x="1280" y="317" />
<bpmndi:BPMNLabel><dc:Bounds x="1211" y="297" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp13_di" bpmnElement="frfp13">
<di:waypoint x="1205" y="317" />
<di:waypoint x="1260" y="317" />
<di:waypoint x="1260" y="427" />
<di:waypoint x="1280" y="427" />
<bpmndi:BPMNLabel><dc:Bounds x="1211" y="323" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp14_di" bpmnElement="frfp14">
<di:waypoint x="1380" y="427" />
<di:waypoint x="1410" y="427" />
<di:waypoint x="1410" y="482" />
<di:waypoint x="960" y="482" />
<di:waypoint x="960" y="317" />
<di:waypoint x="980" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="frfp15_di" bpmnElement="frfp15">
<di:waypoint x="1380" y="317" />
<di:waypoint x="1462" y="317" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why is "No bid" the default sequence flow out of the first gateway?
Every non-default flow leaving a diverging exclusive gateway must carry a condition, and the default catches anything the conditions miss. Making "No bid" the default is also a healthy bias: unless the opportunity positively qualifies, the process declines it, which protects the team from drifting into bids nobody chose.
Should each contributing department get its own lane?
Only if it owns activities in the model. Presales earns a lane because technical drafting sits with it; a department that merely gets consulted does not need one. Lanes multiply vertical space quickly, so a good rule is one lane per accountable role, with finer detail pushed into task names or a linked sub process.
How would I model the submission deadline itself?
Attach a timer to the review loop, most naturally as a boundary timer event on "Review final response" set to the tender deadline. When it fires you can route to a forced decision task, submit as is or withdraw, so the model acknowledges that RFP deadlines are external and unmovable rather than assuming reviews always converge in time.
Related BPMN examples
Lead qualification
A lead qualification process as a BPMN 2.0 diagram: scoring, discovery, and handover to sales. View the swimlane diagram and download the .bpmn file free.
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.
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