SwimdraftPricingSign inStart free

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.

RFP response: BPMN 2.0 diagram
RFP response 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
RFP received
Ends with
RFP declined · Response submitted
Lanes
Sales · Bid team · Presales
Decisions
Bid on this RFP? · Ready to submit?

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

ElementCountIn this diagram
Start event1RFP received
End event2RFP declined, Response submitted
Task2Prepare pricing schedule, Address review comments
User task3Assess bid fit, Draft technical sections, Review final response
Send task2Send decline note, Submit response
Exclusive gateway2Bid on this RFP?, Ready to submit?
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_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

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