The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"parameters": {
"httpMethod": "=POST",
"path": "5c7a866f-a811-442d-9cfb-dc5c1d348afe",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-976,
288
],
"name": "Loan application trigger",
"id": "c7958fdf-4dff-4f2f-8731-928f4416b871"
},
{
"parameters": {
"mode": "raw",
"jsonOutput": "={\n \"borrower_name\": \"{{ $json.body.full_name }}\",\n \"borrower_email\": \"{{ $json.body.email }}\",\n \"borrower_phone\": \"{{ $json.body.phone_number }}\",\n \"loan_amount\": \"{{ $json.body.amount }}\",\n \"loan_purpose\": \"{{ $json.body.reason }}\",\n \"org_name\": \"{{ $json.body.org_name }}\",\n \"org_id\": \"{{ $json.body.org_id }}\", \n \"country\": \"{{ $json.body.country }}\",\n \"country_code\": \"{{ $json.body.country_code }}\",\n \"city\": \"{{ $json.body.city }}\",\n \"page_url\": \"{{ $json.body.page_url }}\",\n \"street\": \"{{ $json.body.street }}\",\n \"tenor\": \"{{ $json.body.tenor }}\",\n \"tenor_period\": \"{{ $json.body.tenor_period }}\"\n}\n",
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-752,
288
],
"name": "Pulls borrower's data",
"id": "4be84025-2960-4345-9d13-5d7214688794"
},
{
"parameters": {
"mode": "combineBySql",
"query": "SELECT\n input1.primary_email,\n input2.borrower_name,\n input2.borrower_email,\n input2.borrower_phone,\n input2.loan_amount,\n input2.loan_purpose,\n input2.org_name,\n input2.org_id,\n input2.country,\n input2.country_code,\n input2.city,\n input2.page_url,\n input2.street,\n input2.tenor,\n input2.tenor_period\nFROM input1\nJOIN input2\nON input1.org_id = input2.org_id;\n"
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.1,
"position": [
-304,
288
],
"name": "Merge",
"id": "31346478-a365-4e39-84e6-8fabc82b2d1e"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "1ab26bab-27c9-47bb-85b7-dd9834e660c3",
"name": "Borrower name",
"value": "={{ $json.borrower_name }}",
"type": "string"
},
{
"id": "c73719e5-eb98-4aad-b004-2d65dd474678",
"name": "Loan amount",
"value": "={{ $json.currency }} {{ $json.loan_amount }}",
"type": "string"
},
{
"id": "7668049a-cc3c-4013-bc18-533be7bd2527",
"name": "Purpose",
"value": "={{ $json.loan_purpose }}",
"type": "string"
},
{
"id": "d209825c-83a5-4710-b863-b700fcbc17d5",
"name": "Tenor",
"value": "={{ $json.tenor }} {{ $json.tenor_period }}",
"type": "string"
},
{
"id": "b616f652-41e1-4deb-b5a1-9510bf8ef9a7",
"name": "=Email type",
"value": "lender_notification",
"type": "string"
},
{
"id": "f12865e3-f191-430f-acb4-324d8dfbd636",
"name": "=Email type",
"value": "borrower_confirmation",
"type": "string"
},
{
"id": "ed00ce19-0ae9-4a7d-9dec-667e13e084f2",
"name": "Email type",
"value": "borrower_follow-up",
"type": "string"
}
]
},
"includeOtherFields": true,
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
144,
288
],
"name": "Edit Fields",
"id": "804b66dd-bb97-49ad-bd83-5f01cdb6f9a6"
},
{
"parameters": {
"jsCode": "const countryCurrencyMap = {\n \"Rwanda\": \"FRw\",\n \"South Africa\": \"R\",\n \"Ethiopia\": \"Br\",\n \"Tanzania\": \"TSh\",\n \"Ghana\": \"GH\u20b5\",\n \"Uganda\": \"UGX\",\n \"Zambia\": \"ZK\",\n \"Zimbabwe\": \"Z$\",\n \"Malawi\": \"MK\",\n \"Sierra Leone\": \"Le\",\n \"Namibia\": \"N$\",\n \"Botswana\": \"P\",\n \"Liberia\": \"L$\",\n \"Benin\": \"FCFA\",\n \"Gambia\": \"D\",\n \"Lesotho\": \"L\",\n \"Canada\": \"$\",\n \"Caribbean\": \"$\",\n \"United States\": \"$\",\n \"United Kingdom\": \"\u00a3\",\n \"Nigeria\": \"\u20a6\",\n \"Kenya\": \"KSh\",\n \"France\": \"\u20ac\",\n \"Morocco\": \"MAD\",\n \"Default\": \"\u20a6\"\n};\n\n// If your input uses country codes (like NGA for Nigeria), map them first\nconst countryCodeMap = {\n \"RWA\": \"Rwanda\",\n \"ZAF\": \"South Africa\",\n \"ETH\": \"Ethiopia\",\n \"TZA\": \"Tanzania\",\n \"GHA\": \"Ghana\",\n \"UGA\": \"Uganda\",\n \"ZMB\": \"Zambia\",\n \"ZWE\": \"Zimbabwe\",\n \"MWI\": \"Malawi\",\n \"SLE\": \"Sierra Leone\",\n \"NAM\": \"Namibia\",\n \"BWA\": \"Botswana\",\n \"LBR\": \"Liberia\",\n \"BEN\": \"Benin\",\n \"GMB\": \"Gambia\",\n \"LSO\": \"Lesotho\",\n \"CAN\": \"Canada\",\n \"CAR\": \"Caribbean\",\n \"USA\": \"United States\",\n \"GBR\": \"United Kingdom\",\n \"NGA\": \"Nigeria\",\n \"KEN\": \"Kenya\",\n \"FRA\": \"France\",\n \"MAR\": \"Morocco\",\n \"DEF\": \"Default\"\n};\n\nreturn items.map(item => {\n const countryCode = item.json.country_code || item.json.country;\n const countryName = countryCodeMap[countryCode] || item.json.country;\n const currency = countryCurrencyMap[countryName] || countryCurrencyMap[\"Default\"];\n\n return {\n json: {\n ...item.json,\n currency: currency\n }\n };\n});\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-80,
288
],
"name": "Code",
"id": "324e46b0-24ff-44a5-9ff4-7a44f54e6232"
},
{
"parameters": {
"resource": "mail",
"fromEmail": "noreply@yourdomain.com",
"fromName": "company",
"toEmail": "={{ $json.primary_email }}",
"subject": "You've received a loan request from user who saw you on our website!",
"contentType": "text/html",
"contentValue": "=",
"additionalFields": {}
},
"type": "n8n-nodes-base.sendGrid",
"typeVersion": 1,
"position": [
368,
384
],
"name": "Lender notification",
"id": "971d2679-4772-4153-a46f-dd13fa8ffab5"
},
{
"parameters": {
"resource": "mail",
"fromEmail": "noreply@yourdomain.com",
"fromName": "=company",
"toEmail": "={{ $json.borrower_email }}",
"subject": "We got your loan request!",
"contentType": "text/html",
"contentValue": "=",
"additionalFields": {}
},
"type": "n8n-nodes-base.sendGrid",
"typeVersion": 1,
"position": [
368,
192
],
"name": "Borrower confirmation",
"id": "daa15450-8e03-4173-8647-97782a78d728"
},
{
"parameters": {},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
592,
192
],
"name": "Wait",
"id": "7bdff076-9ac0-450a-8efc-994bf210905b"
},
{
"parameters": {
"resource": "mail",
"fromEmail": "noreply@yourdomain.com",
"fromName": "=company",
"toEmail": "={{ $('Edit Fields').item.json.borrower_email }}",
"subject": "Checking in on your loan application",
"contentType": "text/html",
"contentValue": "=",
"additionalFields": {}
},
"type": "n8n-nodes-base.sendGrid",
"typeVersion": 1,
"position": [
816,
192
],
"name": "Borrower follow-up",
"id": "7a2de661-b06c-4579-8e72-f4b2a948b694"
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT id AS org_id, primary_email\nFROM pecunia.organizations\nWHERE id = '{{ $json.org_id }}';\n",
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.4,
"position": [
-528,
208
],
"name": " Get lenders emailfrom DB",
"id": "40160541-5133-41dc-8a0e-a4cc0f5485d8",
"disabled": true
}
],
"connections": {
"Loan application trigger": {
"main": [
[
{
"node": "Pulls borrower's data",
"type": "main",
"index": 0
}
]
]
},
"Pulls borrower's data": {
"main": [
[
{
"node": " Get lenders emailfrom DB",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Borrower confirmation",
"type": "main",
"index": 0
},
{
"node": "Lender notification",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Borrower confirmation": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Borrower follow-up",
"type": "main",
"index": 0
}
]
]
},
" Get lenders emailfrom DB": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow streamlines loan application processing by automating notifications to both lenders and borrowers, saving time and reducing manual errors for financial teams handling high volumes of requests. It begins with a webhook trigger capturing incoming loan applications, then pulls and merges borrower details before sending tailored confirmations via SendGrid. Ideal for small to medium lenders seeking efficient, reliable automation without complex setups, it ensures swift communication while logging data in MySQL for compliance and tracking.
Use this workflow when your team receives loan applications through web forms or APIs and needs instant email alerts to keep processes moving. Avoid it for non-financial applications or if you require advanced AI-driven decisions, as it focuses on basic data handling and notifications. Common variations include adding approval steps after the wait node or integrating with CRM tools for fuller applicant profiles.
About this workflow
Ai Automation Portfolio. Uses sendGrid, mySql. Webhook trigger; 10 nodes.
Source: https://github.com/ChibugoOhanyiri/AI-automation-portfolio/blob/main/loan-application/workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Module Dependency Analysis. Uses scheduleTrigger, mySql, respondToWebhook, httpRequest. Webhook trigger; 12 nodes.
Module Dependency Analysis. Uses scheduleTrigger, httpRequest, splitInBatches, mySql. Webhook trigger; 11 nodes.
Resolve Discussion. Uses mySql, respondToWebhook. Webhook trigger; 6 nodes.
Adhoc Query. Uses executeWorkflowTrigger, mySql, respondToWebhook. Webhook trigger; 6 nodes.
Send Dingtalk Message On New Azure Devops Pull Request. Uses mySql, httpRequest, stickyNote. Webhook trigger; 5 nodes.