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 →
{
"name": "Alrouf AI Integration (Production)",
"nodes": [
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"filtersUI": {
"values": [
{
"lookupColumn": "messageId",
"lookupValue": "={{$json[\"messageId\"]}}"
}
]
},
"options": {
"returnFirstMatch": true
}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
176,
-176
],
"id": "78f8af7a-1f65-449a-9d40-8d39e9ff608c",
"name": "Google Sheets \u2014 Lookup Row / Deduplication",
"alwaysOutputData": true,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "c16047ed-baa2-49c8-98b1-d5496f846341",
"leftValue": "={{ Object.keys($json).length }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
432,
-192
],
"id": "c8674ccb-8795-4586-bf71-45a3c7feaa21",
"name": "IF Node \u2014 Check if Lookup result empty"
},
{
"parameters": {},
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
688,
112
],
"id": "b5b8cec0-8184-43cc-b745-b29a41a82020",
"name": "Duplicate Email \u2192 Stop Workflow"
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"messageId": "={{ $json[\"messageId\"] }}",
"receivedAt": "={{ $json[\"receivedAt\"] }}",
"from": "={{ $json[\"from\"] }}",
"subject": "={{ $json[\"subject\"] }}",
"body": "={{ $json[\"body\"] }}",
"status": "New"
},
"matchingColumns": [],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "receivedAt",
"displayName": "receivedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "from",
"displayName": "from",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "subject",
"displayName": "subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "attachments",
"displayName": "attachments",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "crmId",
"displayName": "crmId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "crmStatus",
"displayName": "crmStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "crmSystem",
"displayName": "crmSystem",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "crmCreatedAt",
"displayName": "crmCreatedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "errorMsg",
"displayName": "errorMsg",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "parseConfidence",
"displayName": "parseConfidence",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1344,
-128
],
"id": "df6e01ba-0c90-407e-af9f-f098e1d80cbb",
"name": "Google Sheets \u2014 Append Row (RFQ_Master_Log)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}"
},
"sheetName": {
"__rl": true,
"value": 1359543110,
"mode": "list",
"cachedResultName": "RFQ_Parsed_Details",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=1359543110"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"messageId": "={{ $json[\"messageId\"] }}",
"sku": "={{ $json[\"sku\"] }}",
"quantity": "={{ $json[\"quantity\"] }}",
"deliveryTerms": "={{ $json[\"deliveryTerms\"] }}",
"deliveryCity": "={{ $json[\"deliveryCity\"] }}",
"currency": "={{ $json[\"currency\"] }}",
"estimatedValue": "={{ $json[\"estimatedValue\"] }}",
"neededBy": "={{ $json[\"neededBy\"] }}",
"clientName": "={{ $json[\"clientName\"] }}",
"clientPhone": "={{ $json[\"clientPhone\"] }}",
"clientEmail": "={{ $json[\"clientEmail\"] }}"
},
"matchingColumns": [],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "sku",
"displayName": "sku",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "quantity",
"displayName": "quantity",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "deliveryTerms",
"displayName": "deliveryTerms",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "deliveryCity",
"displayName": "deliveryCity",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "neededBy",
"displayName": "neededBy",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "currency",
"displayName": "currency",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "estimatedValue",
"displayName": "estimatedValue",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "clientName",
"displayName": "clientName",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "clientPhone",
"displayName": "clientPhone",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "clientEmail",
"displayName": "clientEmail",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1776,
-128
],
"id": "1d3380d5-f1ec-4abe-8fe7-119ec04b017d",
"name": "Google Sheets \u2014 Append Row (RFQ_Parsed_Details)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// ========= Final Function Node (single return) =========\n\n// Source item\nconst data = $json;\n\n// Basic sources\nconst body = (data.body || data.text || \"\").toString();\nconst fromValue = data.from?.value?.[0] || {};\nconst fromEmail = (fromValue.address || data.from || \"\").toString().trim();\nconst fromNameHeader = (fromValue.name || \"\").toString().trim();\n\n// ---------- Helper ----------\nfunction extract(regex) {\n const m = body.match(regex);\n return m ? m[1].trim() : \"\";\n}\n\n// ---------- Smart name extraction (priority order) ----------\nlet clientName = \"\";\n\n// 1) Signature / body pattern (preferred)\nconst signatureMatch = body.match(\n /(best regards|regards|thanks|thanks in advance|sincerely|cheers)[\\s\\:\\-\\,\\r\\n]*([\\w\\s\\.\\-&']{2,80})$/im\n);\nif (signatureMatch && signatureMatch[2]) {\n clientName = signatureMatch[2].trim();\n}\n\n// 2) From header name (if signature not found)\nif (!clientName && fromNameHeader) {\n // ignore generic auto senders\n if (!/^(no.?reply|noreply|info|sales|support|admin)/i.test(fromEmail)) {\n clientName = fromNameHeader.replace(/[\"<>]/g, \"\").trim();\n }\n}\n\n// 3) Derive from email username (last fallback)\nif (!clientName && fromEmail) {\n const username = fromEmail.split(\"@\")[0];\n const cleaned = username.replace(/[\\.\\_\\-\\d]+/g, \" \").trim();\n clientName = cleaned\n .split(\" \")\n .filter(Boolean)\n .map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(\" \");\n}\n\n// 4) Final fallback\nif (!clientName) clientName = \"Unknown\";\nclientName = clientName.replace(/\\s+/g, \" \").trim();\n\n// ---------- Parse RFQ fields from body ----------\nconst sku = extract(/Model\\s*No[:\\-]?\\s*([A-Z0-9\\-\\_]+)/i);\nconst quantity = extract(/Quantity[:\\-]?\\s*(\\d+)/i);\nconst deliveryCity = extract(/Delivery\\s*Location[:\\-]?\\s*(.*)/i);\nconst neededBy = extract(/Delivery\\s*Timeline[:\\-]?\\s*(.*)/i);\nconst deliveryTerms = extract(/Payment\\s*Terms[:\\-]?\\s*(.*)/i);\nconst clientPhone = extract(/Phone[:\\-]?\\s*([\\+\\d\\-\\s\\(\\)]+)/i);\nconst clientEmail = extract(/Email[:\\-]?\\s*([\\w.\\-+%]+@[\\w.\\-]+\\.[A-Za-z]{2,})/i);\nconst estimatedValue = extract(/Estimated\\s*Value[:\\-]?\\s*([\\w\\$\\.\\,\\s]+)/i);\n\n// Metadata\nconst messageId = data.messageId || \"\";\nconst receivedAt = data.receivedAt || data.date || \"\";\n\n// ---------- Single output object ----------\nreturn {\n messageId,\n receivedAt,\n sku,\n quantity,\n deliveryTerms,\n deliveryCity,\n neededBy,\n currency: \"USD\",\n estimatedValue: estimatedValue || \"\",\n clientName,\n clientPhone,\n clientEmail: clientEmail || fromEmail || \"\",\n parseConfidence: 1.0,\n status: \"Parsed\",\n errorMsg: \"\"\n};\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1568,
-128
],
"id": "0c66b0a9-58bf-4b65-9476-9c0d05b32bcf",
"name": "Function Node \u2014 Extract Parsed Fields"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"parseConfidence": "={{$node[\"Function Node \u2014 Extract Parsed Fields\"].json[\"parseConfidence\"]}}",
"status": "={{$node[\"Function Node \u2014 Extract Parsed Fields\"].json[\"status\"]}}",
"messageId": "={{ $json[\"messageId\"] }}"
},
"matchingColumns": [
"messageId"
],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "receivedAt",
"displayName": "receivedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "from",
"displayName": "from",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "subject",
"displayName": "subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "attachments",
"displayName": "attachments",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmId",
"displayName": "crmId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmStatus",
"displayName": "crmStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "crmSystem",
"displayName": "crmSystem",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "crmCreatedAt",
"displayName": "crmCreatedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "errorMsg",
"displayName": "errorMsg",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "parseConfidence",
"displayName": "parseConfidence",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1984,
-128
],
"id": "11465710-de2a-4968-83ce-45f49f8b331c",
"name": "Google Sheets \u2014 Update Row (RFQ_Master_Log)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=You are an intelligent language detection and translation assistant.\n\nYour goal:\n1. Detect the language of the following email.\n2. If the email subject and body are already in English, keep them unchanged.\n3. If they are in any other language, translate both into English.\n4. Return all required fields strictly in JSON matching the schema below.\n\nReturn JSON strictly in this format:\n{\n \"original_language\": \"<detected_language_code>\",\n \"translated_to_language\": \"en\",\n \"from\": \"{{$node['Email Trigger (IMAP)'].json['from']['value'][0]['address']}}\",\n\"to\": \"{{$node['Email Trigger (IMAP)'].json['to']['value'][0]['address']}}\",\n \"translated_subject\": \"<translated_or_original_subject>\",\n \"translated_text\": \"<translated_or_original_text>\",\n \"from\": \"{{$node['Email Trigger (IMAP)'].json['from']['value'][0]['address']}}\",\n \"to\": \"{{$node['Email Trigger (IMAP)'].json['to']['value'][0]['address']}}\",\n \"date\": \"{{$node['Email Trigger (IMAP)'].json['date']}}\",\n \"messageId\": \"{{$node['Email Trigger (IMAP)'].json['messageId']}}\",\n \"attributes\": \"{{$node['Email Trigger (IMAP)'].json['attributes']['uid']}}\"\n}\n\nEmail Subject: {{$node['Email Trigger (IMAP)'].json['subject']}}\nEmail Body: {{$node['Email Trigger (IMAP)'].json['text']}}\n",
"hasOutputParser": true,
"batching": {}
},
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.7,
"position": [
720,
-400
],
"id": "9e0c6f73-4b21-4bb2-85d4-e22671a7ee72",
"name": "Basic LLM Chain"
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
752,
-176
],
"id": "bed32054-3d89-4951-be52-aaf14ce25c57",
"name": "Google Gemini Chat Model",
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n \"original_language\": \"string\",\n \"translated_to_language\": \"string\",\n \"translated_subject\": \"string\",\n \"translated_text\": \"string\",\n \"original_subject\": \"string\",\n \"original_text\": \"string\",\n \"from\": \"string\",\n \"to\": \"string\",\n \"date\": \"string\",\n \"messageId\": \"string\",\n \"attributes\": \"string\"\n}\n"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
944,
-144
],
"id": "041ccbf8-014f-4065-b785-5c67885a7baa",
"name": "Structured Output Parser"
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// Get current item (each email/translation output)\nconst data = $json.output || $json;\n\n// Use translated fields if available, else fall back to original ones\nconst finalSubject = data.translated_subject || data.original_subject;\nconst finalBody = data.translated_text || data.original_text;\n\n// Return the unified structure for one item\nreturn {\n json: {\n messageId: data.messageId,\n receivedAt: data.date,\n from: data.from,\n to: data.to,\n subject: finalSubject,\n body: finalBody,\n attributes: data.attributes,\n original_language: data.original_language || \"en\",\n translated_to_language: data.translated_to_language || \"en\"\n }\n};\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1152,
-336
],
"id": "dc4586d9-99d2-4370-afab-89889a9de54b",
"name": "Function Node \u2014 Unify Output"
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// No array brackets \u2014 just return one object\nfunction generateId() {\n return Math.random().toString(36).substring(2, 8).toUpperCase();\n}\n\nconst input = $json;\n\nconst crmId = `MOCK-${generateId()}`;\nconst createdAt = new Date().toISOString();\n\nreturn {\n json: {\n crmId,\n createdAt,\n name: input.subject || \"Untitled RFQ\",\n description: input.body || \"No description provided\",\n accountEmail: input.from || \"unknown@client.com\",\n sourceMessageId: input.messageId || \"\",\n amount: null,\n status: \"Created (Mock)\",\n crmSystem: \"MockCRM\"\n }\n};\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2224,
-128
],
"id": "28844c1b-8fec-4bd9-95e6-bbd51f10a023",
"name": "Function Node \u2014 Create Opportunity in a robust mock"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "Alrouf - RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"messageId": "={{$node[\"Google Sheets \u2014 Update Row (RFQ_Master_Log)\"].json[\"messageId\"]}}",
"crmId": "={{$json[\"crmId\"]}}",
"crmStatus": "={{$json[\"status\"]}}",
"crmSystem": "={{$json[\"crmSystem\"]}}",
"crmCreatedAt": "={{$json[\"createdAt\"]}}",
"status": "Synced to CRM"
},
"matchingColumns": [
"messageId"
],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "receivedAt",
"displayName": "receivedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "from",
"displayName": "from",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "subject",
"displayName": "subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "attachments",
"displayName": "attachments",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmId",
"displayName": "crmId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmStatus",
"displayName": "crmStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmSystem",
"displayName": "crmSystem",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmCreatedAt",
"displayName": "crmCreatedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "errorMsg",
"displayName": "errorMsg",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "parseConfidence",
"displayName": "parseConfidence",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2464,
-128
],
"id": "795f90fb-5a0e-4e82-b5be-385cc377a042",
"name": "Google Sheets \u2014 Update Row (RFQ_Master_Log \u2013 CRM Update)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"inputDataFieldName": "rfq_0",
"name": "={{$json[\"subject\"].replace(/[^\\w\\s-]/g, \"_\")}}_RFQ_Attachment_{{Date.now()}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "{{GOOGLE_DRIVE_FOLDER_NAME}}",
"cachedResultUrl": "https://drive.google.com/drive/folders/{{GOOGLE_SHEET_ID}}"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
416,
400
],
"id": "f5e66e02-40dc-497d-9b02-b72a89b6b7b7",
"name": "Google Drive \u2014 Upload File (Archive Attachments)",
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"format": "resolved",
"dataPropertyAttachmentsPrefixName": "rfq_",
"options": {
"customEmailConfig": "[\"UNSEEN\", [\"OR\", [\"OR\", [\"SUBJECT\", \"RFQ\"], [\"SUBJECT\", \"Quotation\"] ], [\"OR\", [\"SUBJECT\", \"\u0639\u0631\u0636 \u0623\u0633\u0639\u0627\u0631\"], [\"SUBJECT\", \"\u0637\u0644\u0628 \u0639\u0631\u0636 \u0623\u0633\u0639\u0627\u0631\"] ] ] ]",
"forceReconnect": 5,
"trackLastMessageId": true
}
},
"type": "n8n-nodes-base.emailReadImap",
"typeVersion": 2.1,
"position": [
-48,
0
],
"id": "476f5f99-ab61-49aa-90f8-33054c38699c",
"name": "Email Trigger (IMAP)",
"credentials": {
"imap": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"mode": "combine",
"combineBy": "combineByPosition",
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
2864,
368
],
"id": "278669eb-d507-447a-9a4b-1d3bb29cd34f",
"name": "Merge"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "Alrouf - RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"messageId": "={{$json[\"messageId\"]}}",
"status": "Attachment Uploaded",
"attachments": "={{$json[\"webViewLink\"]}}"
},
"matchingColumns": [
"messageId"
],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "receivedAt",
"displayName": "receivedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "from",
"displayName": "from",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "subject",
"displayName": "subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "attachments",
"displayName": "attachments",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmId",
"displayName": "crmId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmStatus",
"displayName": "crmStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmSystem",
"displayName": "crmSystem",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmCreatedAt",
"displayName": "crmCreatedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "errorMsg",
"displayName": "errorMsg",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "parseConfidence",
"displayName": "parseConfidence",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
3104,
368
],
"id": "ba30a0e6-d5ab-41ff-936b-c265044ce515",
"name": "Google Sheets \u2014 Update Row (RFQ_Master_Log \u2013 Drive Link)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "={{$node[\"Google Sheets \u2014 Append Row (RFQ_Parsed_Details)\"].json[\"clientEmail\"]}}",
"subject": "Re: Thank you for your RFQ \u2013 We\u2019ve received your request",
"message": "=<p>Dear Customer,</p>\n\n<p>Thank you for reaching out to us with your Request for Quotation (RFQ).</p> \n\n<p>We\u2019ve successfully received your inquiry and logged it in our system for processing. Our sales team is currently reviewing your request and will get back to you shortly with the quotation details.</p>\n\n<p>If you have any additional documents or requirements, please feel free to reply to this email.</p>\n\n<p>Best regards,<br>\n<strong>Sales Team</strong><br>\nEmail: {{$node[\"Function Node \u2014 Unify Output\"].json[\"to\"]}}<br> ",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
3344,
368
],
"id": "72450586-4495-433d-8589-1c590260a66a",
"name": "Gmail \u2014 Send Automated Respond",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"select": "channel",
"channelId": {
"__rl": true,
"value": "{{SLACK_CHANNEL_ID}}",
"mode": "list",
"cachedResultName": "all-alrouf-project"
},
"text": "=\ud83d\udce2 *New RFQ Alert \u2014 Incoming Request for Quotation!*\n\n\ud83d\udcbc *From:* {{$node[\"Google Sheets \u2014 Append Row (RFQ_Master_Log)\"].json[\"from\"]}}\n\ud83e\uddfe *Subject:* {{$node[\"Google Sheets \u2014 Append Row (RFQ_Master_Log)\"].json[\"subject\"]}}\n\u23f0 *Received At:* {{$node[\"Google Sheets \u2014 Append Row (RFQ_Master_Log)\"].json[\"receivedAt\"]}}\n\n\ud83d\udcca *CRM Status:* {{$node[\"Merge\"].json[\"crmStatus\"]}}\n\ud83d\udcce *Attachment Link:* {{$node[\"Merge\"].json[\"webViewLink\"]}}\n\n\ud83e\udde0 _This RFQ has been logged and processed automatically. Please review the opportunity in the CRM for further action._",
"otherOptions": {}
},
"type": "n8n-nodes-base.slack",
"typeVersion": 2.3,
"position": [
3856,
368
],
"id": "fc0612c9-696c-4bd8-bb45-4855ed0ad16d",
"name": "Send a message",
"credentials": {
"slackApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "Alrouf - RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"messageId": "={{$node[\"Merge\"].json[\"messageId\"]}}",
"status": "Auto-Replied"
},
"matchingColumns": [
"messageId"
],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "receivedAt",
"displayName": "receivedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "from",
"displayName": "from",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "subject",
"displayName": "subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "attachments",
"displayName": "attachments",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmId",
"displayName": "crmId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmStatus",
"displayName": "crmStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmSystem",
"displayName": "crmSystem",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmCreatedAt",
"displayName": "crmCreatedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "errorMsg",
"displayName": "errorMsg",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "parseConfidence",
"displayName": "parseConfidence",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
3616,
368
],
"id": "6578b3a2-2432-4106-b53e-0576243868e9",
"name": "Google Sheets \u2014 Update Row (Send Message \u2013 Auto Acknowledgment)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "{{GOOGLE_SHEET_ID}}",
"mode": "list",
"cachedResultName": "Alrouf - RFQ \u2192 CRM Automation",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "RFQ_Master_Log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{GOOGLE_SHEET_ID}}/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"messageId": "={{$node[\"Merge\"].json[\"messageId\"]}}",
"status": "Alert Posted"
},
"matchingColumns": [
"messageId"
],
"schema": [
{
"id": "messageId",
"displayName": "messageId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "receivedAt",
"displayName": "receivedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "from",
"displayName": "from",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "subject",
"displayName": "subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "attachments",
"displayName": "attachments",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmId",
"displayName": "crmId",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmStatus",
"displayName": "crmStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmSystem",
"displayName": "crmSystem",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "crmCreatedAt",
"displayName": "crmCreatedAt",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "status",
"displayName": "status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "errorMsg",
"displayName": "errorMsg",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "parseConfidence",
"displayName": "parseConfidence",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
4096,
368
],
"id": "a378d345-13f2-4e74-94c1-a3abfc7eb840",
"name": "Google Sheets \u2014 Update Row (Status \u2013 Alert Posted)",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Google Sheets \u2014 Lookup Row / Deduplication": {
"main": [
[
{
"node": "IF Node \u2014 Check if Lookup result empty",
"type": "main",
"index": 0
}
]
]
},
"IF Node \u2014 Check if Lookup result empty": {
"main": [
[
{
"node": "Basic LLM Chain",
"type": "main",
"index": 0
}
],
[
{
"node": "Duplicate Email \u2192 Stop Workflow",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets \u2014 Append Row (RFQ_Master_Log)": {
"main": [
[
{
"node": "Function Node \u2014 Extract Parsed Fields",
"type": "main",
"index": 0
}
]
]
},
"Function Node \u2014 Extract Parsed Fields": {
"main": [
[
{
"node": "Google Sheets \u2014 Append Row (RFQ_Parsed_Details)",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets \u2014 Append Row (RFQ_Parsed_Details)": {
"main": [
[
{
"node": "Google Sheets \u2014 Update Row (RFQ_Master_Log)",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Basic LLM Chain",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Basic LLM Chain": {
"main": [
[
{
"node": "Function Node \u2014 Unify Output",
"type": "main",
"index": 0
}
]
]
},
"Function Node \u2014 Unify Output": {
"main": [
[
{
"node": "Google Sheets \u2014 Append Row (RFQ_Master_Log)",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets \u2014 Update Row (RFQ_Master_Log)": {
"main": [
[
{
"node": "Function Node \u2014 Create Opportunity in a robust mock",
"type": "main",
"index": 0
}
]
]
},
"Function Node \u2014 Create Opportunity in a robust mock": {
"main": [
[
{
"node": "Google Sheets \u2014 Update Row (RFQ_Master_Log \u2013 CRM Update)",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets \u2014 Update Row (RFQ_Master_Log \u2013 CRM Update)": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Email Trigger (IMAP)": {
"main": [
[
{
"node": "Google Sheets \u2014 Lookup Row / Deduplication",
"type": "main",
"index": 0
},
{
"node": "Google Drive \u2014 Upload File (Archive Attachments)",
"type": "main",
"index": 0
}
]
]
},
"Google Drive \u2014 Upload File (Archive Attachments)": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Google Sheets \u2014 Update Row (RFQ_Master_Log \u2013 Drive Link)",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets \u2014 Update Row (RFQ_Master_Log \u2013 Drive Link)": {
"main": [
[
{
"node": "Gmail \u2014 Send Automated Respond",
"type": "main",
"index": 0
}
]
]
},
"Gmail \u2014 Send Automated Respond": {
"main": [
[
{
"node": "Google Sheets \u2014 Update Row (Send Message \u2013 Auto Acknowledgment)",
"type": "main",
"index": 0
}
]
]
},
"Send a message": {
"main": [
[
{
"node": "Google Sheets \u2014 Update Row (Status \u2013 Alert Posted)",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets \u2014 Update Row (Send Message \u2013 Auto Acknowledgment)": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "{{WORKFLOW_VERSION_ID}}",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "AXJrmSN9Oijnjolq",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googleDriveOAuth2ApigooglePalmApigoogleSheetsOAuth2ApiimapslackApi
About this workflow
Alrouf AI Integration (Production). Uses googleSheets, chainLlm, lmChatGoogleGemini, outputParserStructured. Manual trigger; 21 nodes.
Source: https://github.com/AYMANDG523/ai-rfq-crm-orchestration-platform/blob/main/Workflow_JSON/RFQ_to_CRM_Workflow.json — original creator credit. Request a take-down →