SwimdraftPricingSign inStart free

Contract renewal BPMN example

Contract renewal is the decision point at the end of a supplier agreement: renew on better terms, renew as is, or let it lapse. Teams map it because renewals are where value quietly leaks; contracts auto-renew unexamined, notice periods pass unnoticed, and the organisation loses its one moment of negotiating leverage each cycle.

The model is a single pool with Contract manager, Legal, and Budget holder lanes. Two exclusive gateways shape it: the renew or terminate decision up front, and a legal review of negotiated terms that loops back to negotiation until the terms are acceptable. That negotiation loop is the modelling choice to notice, because term sheets rarely pass legal review first time.

Contract renewal: BPMN 2.0 diagram
Contract renewal 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
Renewal window open
Ends with
Contract terminated · Contract renewed
Lanes
Contract manager · Legal · Budget holder
Decisions
Renew contract? · Terms acceptable?

How to read this diagram

When the renewal window opens, the Contract manager reviews the contract performance and the flow reaches "Renew contract?". The default No branch crosses to Legal, which issues the termination notice, and the process ends at "Contract terminated". On the Yes branch the contract manager negotiates the renewal terms with the supplier.

Legal then reviews the revised terms at the gateway "Terms acceptable?". Its default No branch loops straight back to "Negotiate renewal terms", so drafting and review cycle until Legal is satisfied. Once the Yes branch releases the flow, the Budget holder approves the renewal budget, Legal signs the renewed contract, the Contract manager updates the contract register, and the process closes at "Contract renewed".

BPMN elements used

ElementCountIn this diagram
Start event1Renewal window open
End event2Contract terminated, Contract renewed
Task1Sign renewed contract
User task4Review contract performance, Negotiate renewal terms, Review revised terms, Approve renewal budget
Service task1Update contract register
Send task1Issue termination notice
Exclusive gateway2Renew contract?, Terms acceptable?
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_cr" name="Contract renewal" processRef="Process_pool_cr" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_cr" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_cr">
      <bpmn2:lane id="lane_cr_cm" name="Contract manager">
        <bpmn2:flowNodeRef>start_cr</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cr_review</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_cr_renew</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cr_negotiate</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cr_register</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_cr_renewed</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_cr_legal" name="Legal">
        <bpmn2:flowNodeRef>t_cr_terminate</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_cr_term</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cr_legal</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_cr_terms</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_cr_sign</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_cr_bh" name="Budget holder">
        <bpmn2:flowNodeRef>t_cr_budget</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_cr" name="Renewal window open">
      <bpmn2:outgoing>fcr1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="t_cr_review" name="Review contract performance">
      <bpmn2:incoming>fcr1</bpmn2:incoming>
      <bpmn2:outgoing>fcr2</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_cr_renew" name="Renew contract?" default="fcr4">
      <bpmn2:incoming>fcr2</bpmn2:incoming>
      <bpmn2:outgoing>fcr3</bpmn2:outgoing>
      <bpmn2:outgoing>fcr4</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:sendTask id="t_cr_terminate" name="Issue termination notice">
      <bpmn2:incoming>fcr4</bpmn2:incoming>
      <bpmn2:outgoing>fcr5</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:endEvent id="end_cr_term" name="Contract terminated">
      <bpmn2:incoming>fcr5</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:userTask id="t_cr_negotiate" name="Negotiate renewal terms">
      <bpmn2:incoming>fcr3</bpmn2:incoming>
      <bpmn2:incoming>fcr9</bpmn2:incoming>
      <bpmn2:outgoing>fcr6</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:userTask id="t_cr_legal" name="Review revised terms">
      <bpmn2:incoming>fcr6</bpmn2:incoming>
      <bpmn2:outgoing>fcr7</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_cr_terms" name="Terms acceptable?" default="fcr9">
      <bpmn2:incoming>fcr7</bpmn2:incoming>
      <bpmn2:outgoing>fcr8</bpmn2:outgoing>
      <bpmn2:outgoing>fcr9</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:userTask id="t_cr_budget" name="Approve renewal budget">
      <bpmn2:incoming>fcr8</bpmn2:incoming>
      <bpmn2:outgoing>fcr10</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:task id="t_cr_sign" name="Sign renewed contract">
      <bpmn2:incoming>fcr10</bpmn2:incoming>
      <bpmn2:outgoing>fcr11</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:serviceTask id="t_cr_register" name="Update contract register">
      <bpmn2:incoming>fcr11</bpmn2:incoming>
      <bpmn2:outgoing>fcr12</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:endEvent id="end_cr_renewed" name="Contract renewed">
      <bpmn2:incoming>fcr12</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="fcr1" sourceRef="start_cr" targetRef="t_cr_review" />
    <bpmn2:sequenceFlow id="fcr2" sourceRef="t_cr_review" targetRef="g_cr_renew" />
    <bpmn2:sequenceFlow id="fcr3" name="Yes" sourceRef="g_cr_renew" targetRef="t_cr_negotiate">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fcr4" name="No" sourceRef="g_cr_renew" targetRef="t_cr_terminate" />
    <bpmn2:sequenceFlow id="fcr5" sourceRef="t_cr_terminate" targetRef="end_cr_term" />
    <bpmn2:sequenceFlow id="fcr6" sourceRef="t_cr_negotiate" targetRef="t_cr_legal" />
    <bpmn2:sequenceFlow id="fcr7" sourceRef="t_cr_legal" targetRef="g_cr_terms" />
    <bpmn2:sequenceFlow id="fcr8" name="Yes" sourceRef="g_cr_terms" targetRef="t_cr_budget">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fcr9" name="No" sourceRef="g_cr_terms" targetRef="t_cr_negotiate" />
    <bpmn2:sequenceFlow id="fcr10" sourceRef="t_cr_budget" targetRef="t_cr_sign" />
    <bpmn2:sequenceFlow id="fcr11" sourceRef="t_cr_sign" targetRef="t_cr_register" />
    <bpmn2:sequenceFlow id="fcr12" sourceRef="t_cr_register" targetRef="end_cr_renewed" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_cr_di" bpmnElement="pool_cr" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1570" height="500" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cr_cm_di" bpmnElement="lane_cr_cm" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1540" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cr_legal_di" bpmnElement="lane_cr_legal" isHorizontal="true">
        <dc:Bounds x="50" y="150" width="1540" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_cr_bh_di" bpmnElement="lane_cr_bh" isHorizontal="true">
        <dc:Bounds x="50" y="390" width="1540" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_cr_di" bpmnElement="start_cr">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="74" y="101" width="113" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cr_review_di" bpmnElement="t_cr_review">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_cr_renew_di" bpmnElement="g_cr_renew">
        <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_cr_terminate_di" bpmnElement="t_cr_terminate">
        <dc:Bounds x="530" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_cr_term_di" bpmnElement="end_cr_term">
        <dc:Bounds x="712" y="299" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="681" y="341" width="99" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cr_negotiate_di" bpmnElement="t_cr_negotiate">
        <dc:Bounds x="530" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cr_legal_di" bpmnElement="t_cr_legal">
        <dc:Bounds x="680" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_cr_terms_di" bpmnElement="g_cr_terms">
        <dc:Bounds x="855" y="182" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="832" y="162" width="96" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cr_budget_di" bpmnElement="t_cr_budget">
        <dc:Bounds x="980" y="407" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cr_sign_di" bpmnElement="t_cr_sign">
        <dc:Bounds x="1130" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_cr_register_di" bpmnElement="t_cr_register">
        <dc:Bounds x="1280" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_cr_renewed_di" bpmnElement="end_cr_renewed">
        <dc:Bounds x="1462" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1436" y="101" width="89" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="fcr1_di" bpmnElement="fcr1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr2_di" bpmnElement="fcr2">
        <di:waypoint x="330" y="77" />
        <di:waypoint x="405" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr3_di" bpmnElement="fcr3">
        <di:waypoint x="455" y="77" />
        <di:waypoint x="530" y="77" />
        <bpmndi:BPMNLabel><dc:Bounds x="461" y="57" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr4_di" bpmnElement="fcr4">
        <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="83" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr5_di" bpmnElement="fcr5">
        <di:waypoint x="630" y="207" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="660" y="317" />
        <di:waypoint x="712" y="317" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr6_di" bpmnElement="fcr6">
        <di:waypoint x="630" y="77" />
        <di:waypoint x="660" y="77" />
        <di:waypoint x="660" y="207" />
        <di:waypoint x="680" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr7_di" bpmnElement="fcr7">
        <di:waypoint x="780" y="207" />
        <di:waypoint x="855" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr8_di" bpmnElement="fcr8">
        <di:waypoint x="905" y="207" />
        <di:waypoint x="960" y="207" />
        <di:waypoint x="960" y="447" />
        <di:waypoint x="980" y="447" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="187" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr9_di" bpmnElement="fcr9">
        <di:waypoint x="905" y="207" />
        <di:waypoint x="960" y="207" />
        <di:waypoint x="960" y="262" />
        <di:waypoint x="510" y="262" />
        <di:waypoint x="510" y="77" />
        <di:waypoint x="530" y="77" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="213" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr10_di" bpmnElement="fcr10">
        <di:waypoint x="1080" y="447" />
        <di:waypoint x="1110" y="447" />
        <di:waypoint x="1110" y="207" />
        <di:waypoint x="1130" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr11_di" bpmnElement="fcr11">
        <di:waypoint x="1230" y="207" />
        <di:waypoint x="1260" y="207" />
        <di:waypoint x="1260" y="77" />
        <di:waypoint x="1280" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fcr12_di" bpmnElement="fcr12">
        <di:waypoint x="1380" y="77" />
        <di:waypoint x="1462" y="77" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Where would a reminder timer attach in this model?

Before the start event conceptually: the process should be triggered by a timer watching the contract end date, for example ninety days before expiry so the notice period is never missed. You could model that explicitly with a timer start event; this example keeps a plain start named "Renewal window open" for readability.

Why does the negotiation loop go back to the task and not through a gateway?

A sequence flow may target any earlier activity directly, and "Negotiate renewal terms" simply has two incoming flows: one from the renew decision and one from the failed review. An extra merge gateway in front of it would be legal BPMN but adds a symbol without adding clarity for a straightforward rework loop.

Should the supplier appear as a pool during negotiation?

Only if you want to model the exchange of offers explicitly. Negotiation is compressed into a single user task here, which suits an internal audience mapping roles and approvals. For a view of correspondence with the supplier, add a collapsed pool and message flows carrying the offer and counter offer, as the tender example does.

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