SwimdraftPricingSign inStart free

Subscription renewal BPMN example

Subscription renewal is recurring revenue's moment of truth. Handled early, it is a routine confirmation; left late, it becomes a scramble of surprise invoices and lapsed accounts. The process is worth mapping precisely because it should not depend on anyone remembering: the trigger is a date, not a person, and the diagram makes that explicit.

This model runs in a pool with Customer success and Finance lanes and starts from a timer event that fires when the renewal window opens. A message catch event models the wait for the customer's decision, and the gateway that follows sends non-renewers through a retention call before anything is cancelled. The modelling choice to notice is the merge: a saved customer rejoins the renewal path at the same task as one who said yes straight away.

Subscription renewal: BPMN 2.0 diagram
Subscription 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 opens
Ends with
Subscription lapsed · Subscription renewed
Lanes
Customer success · Finance
Decisions
Customer renewing? · Customer retained?

How to read this diagram

A timer start event labelled "Renewal window opens" fires the process, typically 90 days before term end. In the Customer success lane, a service task reviews account health, the renewal proposal is prepared, and a renewal notice goes out to the customer. The flow then pauses at the "Decision received" message catch event until the customer replies, making the waiting period a visible part of the process rather than a gap.

With a decision in hand, the gateway "Customer renewing?" routes the token. Yes goes directly to the Finance lane, where the subscription term is updated and the renewal invoice issued, closing at "Subscription renewed". The default No branch first holds a retention call in Customer success; a second gateway, "Customer retained?", sends saved accounts to the same term update task, while its default No branch processes the cancellation and ends at "Subscription lapsed".

BPMN elements used

ElementCountIn this diagram
Start event1Renewal window opens
End event2Subscription lapsed, Subscription renewed
Intermediate catch event1Decision received
Task1Process cancellation
User task2Prepare renewal proposal, Hold retention call
Service task3Review account health, Update subscription term, Issue renewal invoice
Send task1Send renewal notice
Exclusive gateway2Customer renewing?, Customer retained?
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_sr" name="Subscription renewal" processRef="Process_pool_sr" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_sr" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_sr">
      <bpmn2:lane id="lane_sr_cs" name="Customer success">
        <bpmn2:flowNodeRef>start_sr</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sr_health</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sr_proposal</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sr_notice</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>ev_sr_decision</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_sr_renew</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sr_save</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_sr_saved</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_sr_fin" name="Finance">
        <bpmn2:flowNodeRef>t_sr_cancel</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_sr_lapsed</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sr_update</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_sr_invoice</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_sr_renewed</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_sr" name="Renewal window opens">
      <bpmn2:outgoing>fsr1</bpmn2:outgoing>
      <bpmn2:timerEventDefinition id="start_sr_def" />
    </bpmn2:startEvent>
    <bpmn2:serviceTask id="t_sr_health" name="Review account health">
      <bpmn2:incoming>fsr1</bpmn2:incoming>
      <bpmn2:outgoing>fsr2</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:userTask id="t_sr_proposal" name="Prepare renewal proposal">
      <bpmn2:incoming>fsr2</bpmn2:incoming>
      <bpmn2:outgoing>fsr3</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sendTask id="t_sr_notice" name="Send renewal notice">
      <bpmn2:incoming>fsr3</bpmn2:incoming>
      <bpmn2:outgoing>fsr4</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:intermediateCatchEvent id="ev_sr_decision" name="Decision received">
      <bpmn2:incoming>fsr4</bpmn2:incoming>
      <bpmn2:outgoing>fsr5</bpmn2:outgoing>
      <bpmn2:messageEventDefinition id="ev_sr_decision_def" />
    </bpmn2:intermediateCatchEvent>
    <bpmn2:exclusiveGateway id="g_sr_renew" name="Customer renewing?" default="fsr7">
      <bpmn2:incoming>fsr5</bpmn2:incoming>
      <bpmn2:outgoing>fsr6</bpmn2:outgoing>
      <bpmn2:outgoing>fsr7</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:userTask id="t_sr_save" name="Hold retention call">
      <bpmn2:incoming>fsr7</bpmn2:incoming>
      <bpmn2:outgoing>fsr8</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:exclusiveGateway id="g_sr_saved" name="Customer retained?" default="fsr10">
      <bpmn2:incoming>fsr8</bpmn2:incoming>
      <bpmn2:outgoing>fsr9</bpmn2:outgoing>
      <bpmn2:outgoing>fsr10</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:task id="t_sr_cancel" name="Process cancellation">
      <bpmn2:incoming>fsr10</bpmn2:incoming>
      <bpmn2:outgoing>fsr11</bpmn2:outgoing>
    </bpmn2:task>
    <bpmn2:endEvent id="end_sr_lapsed" name="Subscription lapsed">
      <bpmn2:incoming>fsr11</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:serviceTask id="t_sr_update" name="Update subscription term">
      <bpmn2:incoming>fsr6</bpmn2:incoming>
      <bpmn2:incoming>fsr9</bpmn2:incoming>
      <bpmn2:outgoing>fsr12</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:serviceTask id="t_sr_invoice" name="Issue renewal invoice">
      <bpmn2:incoming>fsr12</bpmn2:incoming>
      <bpmn2:outgoing>fsr13</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:endEvent id="end_sr_renewed" name="Subscription renewed">
      <bpmn2:incoming>fsr13</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="fsr1" sourceRef="start_sr" targetRef="t_sr_health" />
    <bpmn2:sequenceFlow id="fsr2" sourceRef="t_sr_health" targetRef="t_sr_proposal" />
    <bpmn2:sequenceFlow id="fsr3" sourceRef="t_sr_proposal" targetRef="t_sr_notice" />
    <bpmn2:sequenceFlow id="fsr4" sourceRef="t_sr_notice" targetRef="ev_sr_decision" />
    <bpmn2:sequenceFlow id="fsr5" sourceRef="ev_sr_decision" targetRef="g_sr_renew" />
    <bpmn2:sequenceFlow id="fsr6" name="Yes" sourceRef="g_sr_renew" targetRef="t_sr_update">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fsr7" name="No" sourceRef="g_sr_renew" targetRef="t_sr_save" />
    <bpmn2:sequenceFlow id="fsr8" sourceRef="t_sr_save" targetRef="g_sr_saved" />
    <bpmn2:sequenceFlow id="fsr9" name="Yes" sourceRef="g_sr_saved" targetRef="t_sr_update">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fsr10" name="No" sourceRef="g_sr_saved" targetRef="t_sr_cancel" />
    <bpmn2:sequenceFlow id="fsr11" sourceRef="t_sr_cancel" targetRef="end_sr_lapsed" />
    <bpmn2:sequenceFlow id="fsr12" sourceRef="t_sr_update" targetRef="t_sr_invoice" />
    <bpmn2:sequenceFlow id="fsr13" sourceRef="t_sr_invoice" targetRef="end_sr_renewed" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_sr_di" bpmnElement="pool_sr" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1720" height="370" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_sr_cs_di" bpmnElement="lane_sr_cs" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1690" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_sr_fin_di" bpmnElement="lane_sr_fin" isHorizontal="true">
        <dc:Bounds x="50" y="150" width="1690" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_sr_di" bpmnElement="start_sr">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="71" y="101" width="118" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_health_di" bpmnElement="t_sr_health">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_proposal_di" bpmnElement="t_sr_proposal">
        <dc:Bounds x="380" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_notice_di" bpmnElement="t_sr_notice">
        <dc:Bounds x="530" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ev_sr_decision_di" bpmnElement="ev_sr_decision">
        <dc:Bounds x="712" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="686" y="101" width="89" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_sr_renew_di" bpmnElement="g_sr_renew">
        <dc:Bounds x="855" y="52" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="828" y="32" width="104" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_save_di" bpmnElement="t_sr_save">
        <dc:Bounds x="980" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_sr_saved_di" bpmnElement="g_sr_saved">
        <dc:Bounds x="1155" y="52" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="1131" y="32" width="99" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_cancel_di" bpmnElement="t_sr_cancel">
        <dc:Bounds x="1280" y="277" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_sr_lapsed_di" bpmnElement="end_sr_lapsed">
        <dc:Bounds x="1462" y="299" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1431" y="341" width="98" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_update_di" bpmnElement="t_sr_update">
        <dc:Bounds x="1280" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_sr_invoice_di" bpmnElement="t_sr_invoice">
        <dc:Bounds x="1430" y="167" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_sr_renewed_di" bpmnElement="end_sr_renewed">
        <dc:Bounds x="1612" y="189" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1576" y="231" width="108" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="fsr1_di" bpmnElement="fsr1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr2_di" bpmnElement="fsr2">
        <di:waypoint x="330" y="77" />
        <di:waypoint x="380" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr3_di" bpmnElement="fsr3">
        <di:waypoint x="480" y="77" />
        <di:waypoint x="530" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr4_di" bpmnElement="fsr4">
        <di:waypoint x="630" y="77" />
        <di:waypoint x="712" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr5_di" bpmnElement="fsr5">
        <di:waypoint x="748" y="77" />
        <di:waypoint x="855" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr6_di" bpmnElement="fsr6">
        <di:waypoint x="905" y="77" />
        <di:waypoint x="960" y="77" />
        <di:waypoint x="960" y="132" />
        <di:waypoint x="1260" y="132" />
        <di:waypoint x="1260" y="207" />
        <di:waypoint x="1280" y="207" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="57" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr7_di" bpmnElement="fsr7">
        <di:waypoint x="905" y="77" />
        <di:waypoint x="980" y="77" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="83" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr8_di" bpmnElement="fsr8">
        <di:waypoint x="1080" y="77" />
        <di:waypoint x="1155" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr9_di" bpmnElement="fsr9">
        <di:waypoint x="1205" y="77" />
        <di:waypoint x="1260" y="77" />
        <di:waypoint x="1260" y="207" />
        <di:waypoint x="1280" y="207" />
        <bpmndi:BPMNLabel><dc:Bounds x="1211" y="57" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr10_di" bpmnElement="fsr10">
        <di:waypoint x="1205" y="77" />
        <di:waypoint x="1260" y="77" />
        <di:waypoint x="1260" y="317" />
        <di:waypoint x="1280" y="317" />
        <bpmndi:BPMNLabel><dc:Bounds x="1211" y="83" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr11_di" bpmnElement="fsr11">
        <di:waypoint x="1380" y="317" />
        <di:waypoint x="1462" y="317" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr12_di" bpmnElement="fsr12">
        <di:waypoint x="1380" y="207" />
        <di:waypoint x="1430" y="207" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fsr13_di" bpmnElement="fsr13">
        <di:waypoint x="1530" y="207" />
        <di:waypoint x="1612" y="207" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why start this process with a timer event rather than a plain start event?

The trigger genuinely is the calendar: nothing and nobody sends a request, the renewal window simply arrives. A timer start event states that in the notation, and in an execution engine it would carry a cycle definition so the process launches itself for each account. A plain start event would hide the most important fact about the process.

What happens if the customer never responds to the renewal notice?

As drawn, the token would wait at the message catch event indefinitely, which is exactly why the model makes the wait visible. The standard fix is a boundary timer on the wait or a parallel timer path that routes to a chase task after, say, 14 days, then loops back to waiting or escalates to cancellation.

Why does the saved customer path merge into the update task instead of its own branch?

After the retention call succeeds, the remaining work is identical to a straightforward renewal: update the term, issue the invoice. Pointing both flows at the same task is a legal implicit merge in BPMN and avoids duplicating activities. Duplicate branches drift apart over time, so merging where the work truly converges keeps the model maintainable.

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