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.
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
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
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Application submitted |
| End event | 2 | Funds released, Application declined |
| Intermediate catch event | 1 | Reflection period ends |
| User task | 2 | Check application pack, Value property |
| Service task | 1 | Release funds |
| Send task | 2 | Issue mortgage offer, Notify applicant of decline |
| Business rule task | 1 | Assess affordability |
| Exclusive gateway | 1 | Mortgage approved? |
| 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_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
Loan approval
A bank loan approval process as a BPMN 2.0 diagram: completeness check, credit scoring, offer, and payout, with a document rework loop. Download the .bpmn file free.
Insurance claim processing
An end to end insurance claim process in BPMN 2.0: registration, cover check, loss assessment, and settlement or decline. Free .bpmn download included.
Patient admission
A hospital patient admission flow as a BPMN 2.0 swimlane diagram: registration, triage, bed request, and ward transfer. Download the .bpmn file free.
Student enrolment
University student enrolment modelled in BPMN 2.0: condition checks, an evidence loop, parallel fees and records, and IT setup. Free .bpmn download.
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