Loan approval BPMN example
Loan approval sits at the heart of retail banking: an applicant asks for money, the lender decides whether to say yes, and funds either move or they do not. Teams map it because regulators expect a documented credit decision trail, and because the process crosses front office, underwriting, and operations. It commonly goes wrong at the intake stage, where incomplete applications bounce between teams with no agreed route back.
This example models the flow as a single pool with three lanes: Loan officer, Underwriting, and Operations. Two exclusive gateways carry the decisions, and a message catch event makes the wait for missing documents explicit. The modelling choice worth noticing is the rework loop: an incomplete application is not a dead end, it returns to the review task once documents arrive, so the diagram shows exactly how applications re-enter the queue.
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
A new application enters at the "Application received" start event in the Loan officer lane. The officer reviews the application pack, and the gateway "Application complete?" splits the flow: the Yes branch hands over to Underwriting, while the No branch (the default path) triggers a request for the missing documents. The process then waits at the "Documents received" message event before looping back to the review task, so nothing progresses on an incomplete file.
Underwriting scores the application with a business rule task, and the gateway "Loan approved?" makes the credit decision. On Yes, the officer sends the loan offer and Operations disburses the funds, closing at the "Loan disbursed" end event. On the default No branch, the applicant is notified and the token ends at "Application declined". Two end events keep the outcomes distinct: money out, or a clean refusal with an audit trail.
BPMN elements used
| Element | Count | In this diagram |
|---|---|---|
| Start event | 1 | Application received |
| End event | 2 | Loan disbursed, Application declined |
| Intermediate catch event | 1 | Documents received |
| User task | 1 | Review application pack |
| Service task | 1 | Disburse funds |
| Send task | 3 | Request missing documents, Send loan offer, Notify applicant of decline |
| Business rule task | 1 | Score application |
| Exclusive gateway | 2 | Application complete?, Loan approved? |
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_loan" name="Loan approval" processRef="Process_pool_loan" />
</bpmn2:collaboration>
<bpmn2:process id="Process_pool_loan" isExecutable="false">
<bpmn2:laneSet id="LaneSet_pool_loan">
<bpmn2:lane id="lane_loan_officer" name="Loan officer">
<bpmn2:flowNodeRef>start_loan</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_loan_review</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_loan_complete</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_loan_request</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>ev_loan_docs</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_loan_offer</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>t_loan_decline</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_loan_declined</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_loan_uw" name="Underwriting">
<bpmn2:flowNodeRef>t_loan_score</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>g_loan_approve</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_loan_ops" name="Operations">
<bpmn2:flowNodeRef>t_loan_disburse</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>end_loan_paid</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="start_loan" name="Application received">
<bpmn2:outgoing>floan1</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="t_loan_review" name="Review application pack">
<bpmn2:incoming>floan1</bpmn2:incoming>
<bpmn2:incoming>floan6</bpmn2:incoming>
<bpmn2:outgoing>floan2</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:exclusiveGateway id="g_loan_complete" name="Application complete?" default="floan4">
<bpmn2:incoming>floan2</bpmn2:incoming>
<bpmn2:outgoing>floan3</bpmn2:outgoing>
<bpmn2:outgoing>floan4</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sendTask id="t_loan_request" name="Request missing documents">
<bpmn2:incoming>floan4</bpmn2:incoming>
<bpmn2:outgoing>floan5</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:intermediateCatchEvent id="ev_loan_docs" name="Documents received">
<bpmn2:incoming>floan5</bpmn2:incoming>
<bpmn2:outgoing>floan6</bpmn2:outgoing>
<bpmn2:messageEventDefinition id="ev_loan_docs_def" />
</bpmn2:intermediateCatchEvent>
<bpmn2:businessRuleTask id="t_loan_score" name="Score application">
<bpmn2:incoming>floan3</bpmn2:incoming>
<bpmn2:outgoing>floan7</bpmn2:outgoing>
</bpmn2:businessRuleTask>
<bpmn2:exclusiveGateway id="g_loan_approve" name="Loan approved?" default="floan9">
<bpmn2:incoming>floan7</bpmn2:incoming>
<bpmn2:outgoing>floan8</bpmn2:outgoing>
<bpmn2:outgoing>floan9</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sendTask id="t_loan_offer" name="Send loan offer">
<bpmn2:incoming>floan8</bpmn2:incoming>
<bpmn2:outgoing>floan10</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:serviceTask id="t_loan_disburse" name="Disburse funds">
<bpmn2:incoming>floan10</bpmn2:incoming>
<bpmn2:outgoing>floan11</bpmn2:outgoing>
</bpmn2:serviceTask>
<bpmn2:endEvent id="end_loan_paid" name="Loan disbursed">
<bpmn2:incoming>floan11</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sendTask id="t_loan_decline" name="Notify applicant of decline">
<bpmn2:incoming>floan9</bpmn2:incoming>
<bpmn2:outgoing>floan12</bpmn2:outgoing>
</bpmn2:sendTask>
<bpmn2:endEvent id="end_loan_declined" name="Application declined">
<bpmn2:incoming>floan12</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="floan1" sourceRef="start_loan" targetRef="t_loan_review" />
<bpmn2:sequenceFlow id="floan2" sourceRef="t_loan_review" targetRef="g_loan_complete" />
<bpmn2:sequenceFlow id="floan3" name="Yes" sourceRef="g_loan_complete" targetRef="t_loan_score">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="floan4" name="No" sourceRef="g_loan_complete" targetRef="t_loan_request" />
<bpmn2:sequenceFlow id="floan5" sourceRef="t_loan_request" targetRef="ev_loan_docs" />
<bpmn2:sequenceFlow id="floan6" sourceRef="ev_loan_docs" targetRef="t_loan_review" />
<bpmn2:sequenceFlow id="floan7" sourceRef="t_loan_score" targetRef="g_loan_approve" />
<bpmn2:sequenceFlow id="floan8" name="Yes" sourceRef="g_loan_approve" targetRef="t_loan_offer">
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">Yes</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="floan9" name="No" sourceRef="g_loan_approve" targetRef="t_loan_decline" />
<bpmn2:sequenceFlow id="floan10" sourceRef="t_loan_offer" targetRef="t_loan_disburse" />
<bpmn2:sequenceFlow id="floan11" sourceRef="t_loan_disburse" targetRef="end_loan_paid" />
<bpmn2:sequenceFlow id="floan12" sourceRef="t_loan_decline" targetRef="end_loan_declined" />
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1">
<bpmndi:BPMNShape id="pool_loan_di" bpmnElement="pool_loan" isHorizontal="true">
<dc:Bounds x="20" y="20" width="1270" height="500" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_loan_officer_di" bpmnElement="lane_loan_officer" isHorizontal="true">
<dc:Bounds x="50" y="20" width="1240" height="240" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_loan_uw_di" bpmnElement="lane_loan_uw" isHorizontal="true">
<dc:Bounds x="50" y="260" width="1240" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="lane_loan_ops_di" bpmnElement="lane_loan_ops" isHorizontal="true">
<dc:Bounds x="50" y="390" width="1240" height="130" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="start_loan_di" bpmnElement="start_loan">
<dc:Bounds x="112" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="80" y="101" width="101" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_loan_review_di" bpmnElement="t_loan_review">
<dc:Bounds x="230" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_loan_complete_di" bpmnElement="g_loan_complete">
<dc:Bounds x="405" y="52" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="375" y="32" width="110" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_loan_request_di" bpmnElement="t_loan_request">
<dc:Bounds x="530" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ev_loan_docs_di" bpmnElement="ev_loan_docs">
<dc:Bounds x="712" y="59" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="679" y="101" width="103" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_loan_score_di" bpmnElement="t_loan_score">
<dc:Bounds x="530" y="277" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="g_loan_approve_di" bpmnElement="g_loan_approve">
<dc:Bounds x="705" y="292" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="689" y="272" width="82" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_loan_offer_di" bpmnElement="t_loan_offer">
<dc:Bounds x="830" y="37" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_loan_disburse_di" bpmnElement="t_loan_disburse">
<dc:Bounds x="980" y="407" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_loan_paid_di" bpmnElement="end_loan_paid">
<dc:Bounds x="1162" y="429" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1141" y="471" width="78" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="t_loan_decline_di" bpmnElement="t_loan_decline">
<dc:Bounds x="830" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="end_loan_declined_di" bpmnElement="end_loan_declined">
<dc:Bounds x="1012" y="169" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="980" y="211" width="100" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="floan1_di" bpmnElement="floan1">
<di:waypoint x="148" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan2_di" bpmnElement="floan2">
<di:waypoint x="330" y="77" />
<di:waypoint x="405" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan3_di" bpmnElement="floan3">
<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:BPMNLabel><dc:Bounds x="461" y="57" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan4_di" bpmnElement="floan4">
<di:waypoint x="455" y="77" />
<di:waypoint x="530" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="461" y="83" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan5_di" bpmnElement="floan5">
<di:waypoint x="630" y="77" />
<di:waypoint x="712" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan6_di" bpmnElement="floan6">
<di:waypoint x="748" y="77" />
<di:waypoint x="810" y="77" />
<di:waypoint x="810" y="132" />
<di:waypoint x="210" y="132" />
<di:waypoint x="210" y="77" />
<di:waypoint x="230" y="77" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan7_di" bpmnElement="floan7">
<di:waypoint x="630" y="317" />
<di:waypoint x="705" y="317" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan8_di" bpmnElement="floan8">
<di:waypoint x="755" y="317" />
<di:waypoint x="810" y="317" />
<di:waypoint x="810" y="77" />
<di:waypoint x="830" y="77" />
<bpmndi:BPMNLabel><dc:Bounds x="761" y="297" width="21" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan9_di" bpmnElement="floan9">
<di:waypoint x="755" y="317" />
<di:waypoint x="810" y="317" />
<di:waypoint x="810" y="187" />
<di:waypoint x="830" y="187" />
<bpmndi:BPMNLabel><dc:Bounds x="761" y="323" width="17" height="14" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan10_di" bpmnElement="floan10">
<di:waypoint x="930" y="77" />
<di:waypoint x="960" y="77" />
<di:waypoint x="960" y="447" />
<di:waypoint x="980" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan11_di" bpmnElement="floan11">
<di:waypoint x="1080" y="447" />
<di:waypoint x="1162" y="447" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="floan12_di" bpmnElement="floan12">
<di:waypoint x="930" y="187" />
<di:waypoint x="1012" y="187" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>Frequently asked questions
Why use a business rule task for credit scoring instead of a service task?
A business rule task signals that the step evaluates a decision table or scoring model rather than calling an arbitrary system. That matters for readers: auditors and analysts can see at a glance where the credit policy is applied. If your scorecard runs inside a rules engine, this is the type the BPMN spec intends for it.
How does the document rework loop stay spec compliant?
The loop flows from the message catch event back into the earlier review task, so every node still sits on a path from the start event to an end event. BPMN allows cycles as long as no token can be stranded. The completeness gateway guarantees an exit: once documents arrive and the pack passes review, the Yes branch leaves the loop.
Where would a timer belong if applicants never send the documents?
Attach a timer boundary event to the wait, or replace the plain message catch with an event pair, so that after a fixed period (say 30 days) the application is closed as lapsed. That gives the loop a second, time-based exit and stops stale applications sitting in the process forever, which is a common real world failure.
Related BPMN examples
Mortgage application
A mortgage application mapped in BPMN 2.0: parallel valuation and underwriting, lending decision, offer, and completion. View the swimlanes and download the .bpmn 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