SwimdraftPricingSign inStart free

Mortgage application BPMN example

A mortgage application is a long running process with several specialist teams working on the same case: the adviser assembles the pack, a surveyor values the property, underwriting assesses affordability, and completions releases the funds. Lenders map it because cases routinely stall between teams, and because a missed step (an outdated valuation, an unchecked income document) can surface months later at completion.

The model here uses one pool with four lanes and a parallel gateway pair, because valuation and affordability assessment genuinely happen at the same time on different desks. A timer catch event models the reflection period after the offer. The choice worth noticing is the parallel split: modelling these checks in sequence would be spec valid but wrong, since it would suggest the surveyor waits for underwriting when in practice neither depends on the other.

Mortgage application: BPMN 2.0 diagram
Mortgage application 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
Application submitted
Ends with
Funds released · Application declined
Lanes
Mortgage adviser · Valuation · Underwriting · Completions
Decisions
Mortgage approved?

How to read this diagram

Everything begins in the Mortgage adviser lane at the "Application submitted" start event. The adviser checks the application pack, then a parallel gateway splits the token in two: the Valuation lane values the property while Underwriting assesses affordability. Neither branch carries a label, because both always run. A second parallel gateway merges the branches, so the lending decision cannot happen until both results are in.

With both checks complete, the gateway "Mortgage approved?" decides the case. The Yes branch has the adviser issue the mortgage offer, after which the process pauses at the "Reflection period ends" timer event before Completions releases the funds and the token stops at "Funds released". On the default No branch, the adviser notifies the applicant and the case closes at "Application declined". The two end events separate a completed loan from a refused one.

BPMN elements used

ElementCountIn this diagram
Start event1Application submitted
End event2Funds released, Application declined
Intermediate catch event1Reflection period ends
User task2Check application pack, Value property
Service task1Release funds
Send task2Issue mortgage offer, Notify applicant of decline
Business rule task1Assess affordability
Exclusive gateway1Mortgage approved?
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_mtg" name="Mortgage application" processRef="Process_pool_mtg" />
  </bpmn2:collaboration>
  <bpmn2:process id="Process_pool_mtg" isExecutable="false">
    <bpmn2:laneSet id="LaneSet_pool_mtg">
      <bpmn2:lane id="lane_mtg_adviser" name="Mortgage adviser">
        <bpmn2:flowNodeRef>start_mtg</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_mtg_pack</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_mtg_split</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_mtg_offer</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_mtg_decline</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_mtg_declined</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_mtg_val" name="Valuation">
        <bpmn2:flowNodeRef>t_mtg_value</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_mtg_uw" name="Underwriting">
        <bpmn2:flowNodeRef>t_mtg_afford</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_mtg_join</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>g_mtg_decide</bpmn2:flowNodeRef>
      </bpmn2:lane>
      <bpmn2:lane id="lane_mtg_comp" name="Completions">
        <bpmn2:flowNodeRef>ev_mtg_wait</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>t_mtg_release</bpmn2:flowNodeRef>
        <bpmn2:flowNodeRef>end_mtg_done</bpmn2:flowNodeRef>
      </bpmn2:lane>
    </bpmn2:laneSet>
    <bpmn2:startEvent id="start_mtg" name="Application submitted">
      <bpmn2:outgoing>fmtg1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="t_mtg_pack" name="Check application pack">
      <bpmn2:incoming>fmtg1</bpmn2:incoming>
      <bpmn2:outgoing>fmtg2</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:parallelGateway id="g_mtg_split">
      <bpmn2:incoming>fmtg2</bpmn2:incoming>
      <bpmn2:outgoing>fmtg3</bpmn2:outgoing>
      <bpmn2:outgoing>fmtg4</bpmn2:outgoing>
    </bpmn2:parallelGateway>
    <bpmn2:userTask id="t_mtg_value" name="Value property">
      <bpmn2:incoming>fmtg3</bpmn2:incoming>
      <bpmn2:outgoing>fmtg5</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:businessRuleTask id="t_mtg_afford" name="Assess affordability">
      <bpmn2:incoming>fmtg4</bpmn2:incoming>
      <bpmn2:outgoing>fmtg6</bpmn2:outgoing>
    </bpmn2:businessRuleTask>
    <bpmn2:parallelGateway id="g_mtg_join">
      <bpmn2:incoming>fmtg5</bpmn2:incoming>
      <bpmn2:incoming>fmtg6</bpmn2:incoming>
      <bpmn2:outgoing>fmtg7</bpmn2:outgoing>
    </bpmn2:parallelGateway>
    <bpmn2:exclusiveGateway id="g_mtg_decide" name="Mortgage approved?" default="fmtg9">
      <bpmn2:incoming>fmtg7</bpmn2:incoming>
      <bpmn2:outgoing>fmtg8</bpmn2:outgoing>
      <bpmn2:outgoing>fmtg9</bpmn2:outgoing>
    </bpmn2:exclusiveGateway>
    <bpmn2:sendTask id="t_mtg_offer" name="Issue mortgage offer">
      <bpmn2:incoming>fmtg8</bpmn2:incoming>
      <bpmn2:outgoing>fmtg10</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:intermediateCatchEvent id="ev_mtg_wait" name="Reflection period ends">
      <bpmn2:incoming>fmtg10</bpmn2:incoming>
      <bpmn2:outgoing>fmtg11</bpmn2:outgoing>
      <bpmn2:timerEventDefinition id="ev_mtg_wait_def" />
    </bpmn2:intermediateCatchEvent>
    <bpmn2:serviceTask id="t_mtg_release" name="Release funds">
      <bpmn2:incoming>fmtg11</bpmn2:incoming>
      <bpmn2:outgoing>fmtg12</bpmn2:outgoing>
    </bpmn2:serviceTask>
    <bpmn2:endEvent id="end_mtg_done" name="Funds released">
      <bpmn2:incoming>fmtg12</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sendTask id="t_mtg_decline" name="Notify applicant of decline">
      <bpmn2:incoming>fmtg9</bpmn2:incoming>
      <bpmn2:outgoing>fmtg13</bpmn2:outgoing>
    </bpmn2:sendTask>
    <bpmn2:endEvent id="end_mtg_declined" name="Application declined">
      <bpmn2:incoming>fmtg13</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="fmtg1" sourceRef="start_mtg" targetRef="t_mtg_pack" />
    <bpmn2:sequenceFlow id="fmtg2" sourceRef="t_mtg_pack" targetRef="g_mtg_split" />
    <bpmn2:sequenceFlow id="fmtg3" sourceRef="g_mtg_split" targetRef="t_mtg_value" />
    <bpmn2:sequenceFlow id="fmtg4" sourceRef="g_mtg_split" targetRef="t_mtg_afford" />
    <bpmn2:sequenceFlow id="fmtg5" sourceRef="t_mtg_value" targetRef="g_mtg_join" />
    <bpmn2:sequenceFlow id="fmtg6" sourceRef="t_mtg_afford" targetRef="g_mtg_join" />
    <bpmn2:sequenceFlow id="fmtg7" sourceRef="g_mtg_join" targetRef="g_mtg_decide" />
    <bpmn2:sequenceFlow id="fmtg8" name="Yes" sourceRef="g_mtg_decide" targetRef="t_mtg_offer">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="fmtg9" name="No" sourceRef="g_mtg_decide" targetRef="t_mtg_decline" />
    <bpmn2:sequenceFlow id="fmtg10" sourceRef="t_mtg_offer" targetRef="ev_mtg_wait" />
    <bpmn2:sequenceFlow id="fmtg11" sourceRef="ev_mtg_wait" targetRef="t_mtg_release" />
    <bpmn2:sequenceFlow id="fmtg12" sourceRef="t_mtg_release" targetRef="end_mtg_done" />
    <bpmn2:sequenceFlow id="fmtg13" sourceRef="t_mtg_decline" targetRef="end_mtg_declined" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
      <bpmndi:BPMNShape id="pool_mtg_di" bpmnElement="pool_mtg" isHorizontal="true">
        <dc:Bounds x="20" y="20" width="1570" height="630" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_mtg_adviser_di" bpmnElement="lane_mtg_adviser" isHorizontal="true">
        <dc:Bounds x="50" y="20" width="1540" height="240" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_mtg_val_di" bpmnElement="lane_mtg_val" isHorizontal="true">
        <dc:Bounds x="50" y="260" width="1540" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_mtg_uw_di" bpmnElement="lane_mtg_uw" isHorizontal="true">
        <dc:Bounds x="50" y="390" width="1540" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="lane_mtg_comp_di" bpmnElement="lane_mtg_comp" isHorizontal="true">
        <dc:Bounds x="50" y="520" width="1540" height="130" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="start_mtg_di" bpmnElement="start_mtg">
        <dc:Bounds x="112" y="59" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="77" y="101" width="107" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_mtg_pack_di" bpmnElement="t_mtg_pack">
        <dc:Bounds x="230" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_mtg_split_di" bpmnElement="g_mtg_split">
        <dc:Bounds x="405" y="52" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_mtg_value_di" bpmnElement="t_mtg_value">
        <dc:Bounds x="530" y="277" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_mtg_afford_di" bpmnElement="t_mtg_afford">
        <dc:Bounds x="530" y="407" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_mtg_join_di" bpmnElement="g_mtg_join">
        <dc:Bounds x="705" y="422" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="g_mtg_decide_di" bpmnElement="g_mtg_decide">
        <dc:Bounds x="855" y="422" width="50" height="50" />
        <bpmndi:BPMNLabel><dc:Bounds x="828" y="402" width="104" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_mtg_offer_di" bpmnElement="t_mtg_offer">
        <dc:Bounds x="980" y="37" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ev_mtg_wait_di" bpmnElement="ev_mtg_wait">
        <dc:Bounds x="1162" y="559" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1124" y="601" width="112" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_mtg_release_di" bpmnElement="t_mtg_release">
        <dc:Bounds x="1280" y="537" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_mtg_done_di" bpmnElement="end_mtg_done">
        <dc:Bounds x="1462" y="559" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1441" y="601" width="78" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="t_mtg_decline_di" bpmnElement="t_mtg_decline">
        <dc:Bounds x="980" y="147" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="end_mtg_declined_di" bpmnElement="end_mtg_declined">
        <dc:Bounds x="1162" y="169" width="36" height="36" />
        <bpmndi:BPMNLabel><dc:Bounds x="1130" y="211" width="100" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="fmtg1_di" bpmnElement="fmtg1">
        <di:waypoint x="148" y="77" />
        <di:waypoint x="230" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg2_di" bpmnElement="fmtg2">
        <di:waypoint x="330" y="77" />
        <di:waypoint x="405" y="77" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg3_di" bpmnElement="fmtg3">
        <di:waypoint x="455" y="77" />
        <di:waypoint x="510" y="77" />
        <di:waypoint x="510" y="317" />
        <di:waypoint x="530" y="317" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg4_di" bpmnElement="fmtg4">
        <di:waypoint x="455" y="77" />
        <di:waypoint x="510" y="77" />
        <di:waypoint x="510" y="447" />
        <di:waypoint x="530" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg5_di" bpmnElement="fmtg5">
        <di:waypoint x="630" y="317" />
        <di:waypoint x="660" y="317" />
        <di:waypoint x="660" y="447" />
        <di:waypoint x="705" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg6_di" bpmnElement="fmtg6">
        <di:waypoint x="630" y="447" />
        <di:waypoint x="705" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg7_di" bpmnElement="fmtg7">
        <di:waypoint x="755" y="447" />
        <di:waypoint x="855" y="447" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg8_di" bpmnElement="fmtg8">
        <di:waypoint x="905" y="447" />
        <di:waypoint x="960" y="447" />
        <di:waypoint x="960" y="77" />
        <di:waypoint x="980" y="77" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="427" width="21" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg9_di" bpmnElement="fmtg9">
        <di:waypoint x="905" y="447" />
        <di:waypoint x="960" y="447" />
        <di:waypoint x="960" y="187" />
        <di:waypoint x="980" y="187" />
        <bpmndi:BPMNLabel><dc:Bounds x="911" y="453" width="17" height="14" /></bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg10_di" bpmnElement="fmtg10">
        <di:waypoint x="1080" y="77" />
        <di:waypoint x="1110" y="77" />
        <di:waypoint x="1110" y="577" />
        <di:waypoint x="1162" y="577" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg11_di" bpmnElement="fmtg11">
        <di:waypoint x="1198" y="577" />
        <di:waypoint x="1280" y="577" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg12_di" bpmnElement="fmtg12">
        <di:waypoint x="1380" y="577" />
        <di:waypoint x="1462" y="577" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="fmtg13_di" bpmnElement="fmtg13">
        <di:waypoint x="1080" y="187" />
        <di:waypoint x="1162" y="187" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

Frequently asked questions

Why a parallel gateway rather than two separate sequence flows from the check task?

Two unlabelled flows leaving an ordinary task would be ambiguous, and out of an exclusive gateway they would need conditions. A parallel gateway states the intent precisely: both branches always execute, and the matching join waits for both tokens. That guarantee is exactly what you want before a lending decision that depends on two independent results.

What does the clock symbol before fund release represent?

It is an intermediate timer catch event modelling the regulatory reflection period between offer and completion. The process token waits there until the period elapses. Modelling the delay as an event rather than a "wait" task is deliberate: nobody performs any work during that time, and BPMN distinguishes waiting from working.

How would I extend this model to cover conveyancing?

Add the solicitor as a separate black box pool, since conveyancers are an independent organisation, and connect it with message flows: one carrying the mortgage offer out and one bringing the certificate of title back before fund release. Keeping them out of your pool avoids implying you control their internal process.

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