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": "CSBot Test Trigger",
"nodes": [
{
"parameters": {},
"id": "b2c3d4e5-0001-4000-8000-000000000001",
"name": "Run Tests",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
250,
300
]
},
{
"parameters": {
"jsCode": "// PRD 10\uac1c \uc2dc\ub098\ub9ac\uc624 + \ud3f4\ubc31 1\uac74 = \ucd1d 11\uac74 \ud14c\uc2a4\ud2b8\nconst testCases = [\n {\n id: 'S01',\n category: '\ubc30\uc1a1\uc870\ud68c',\n message: '\uc81c \uc8fc\ubb38 \uc5b8\uc81c \uc640\uc694?',\n expect_keywords: ['\ubc30\uc1a1', '\uc870\ud68c', '\uc6b4\uc1a1\uc7a5']\n },\n {\n id: 'S02',\n category: '\ubc30\uc1a1\uc18c\uc694\uc77c',\n message: '\uc8fc\ubb38\ud558\uba74 \uba70\uce60 \ub9cc\uc5d0 \uc640\uc694?',\n expect_keywords: ['\ucd9c\uace0', '\uc601\uc5c5\uc77c', '\uc218\ub839']\n },\n {\n id: 'S03',\n category: '\uad50\ud658',\n message: '\uc0ac\uc774\uc988\ub97c \uc798\ubabb \uc8fc\ubb38\ud588\uc5b4\uc694. \uad50\ud658 \uac00\ub2a5\ud55c\uac00\uc694?',\n expect_keywords: ['\uad50\ud658', '\uc77c \uc774\ub0b4']\n },\n {\n id: 'S04',\n category: '\ubc18\ud488\ud658\ubd88',\n message: '\ub9c8\uc74c\uc5d0 \uc548 \ub4e4\uc5b4\uc11c \ubc18\ud488\ud558\uace0 \uc2f6\uc5b4\uc694',\n expect_keywords: ['\ubc18\ud488', '\ud658\ubd88', '\ubc30\uc1a1\ube44']\n },\n {\n id: 'S05',\n category: '\uc8fc\ubb38\ucde8\uc18c',\n message: '\ubc29\uae08 \uc8fc\ubb38\ud588\ub294\ub370 \ucde8\uc18c\ud560 \uc218 \uc788\ub098\uc694?',\n expect_keywords: ['\ucde8\uc18c', '\uc8fc\ubb38']\n },\n {\n id: 'S06',\n category: '\uc7ac\uc785\uace0',\n message: '\ud488\uc808\uc778\ub370 \uc5b8\uc81c \ub2e4\uc2dc \ub4e4\uc5b4\uc624\ub098\uc694?',\n expect_keywords: ['\uc7ac\uc785\uace0', '\ud488\uc808', '\uc54c\ub9bc']\n },\n {\n id: 'S07',\n category: '\uc601\uc5c5\uc2dc\uac04',\n message: '\uace0\uac1d\uc13c\ud130 \uba87 \uc2dc\uae4c\uc9c0 \uc6b4\uc601\ud574\uc694?',\n expect_keywords: ['\uc6b4\uc601', '\uc2dc\uac04']\n },\n {\n id: 'S08',\n category: '\uacb0\uc81c',\n message: '\ubb34\ud1b5\uc7a5 \uc785\uae08 \uacc4\uc88c \uc54c\ub824\uc8fc\uc138\uc694',\n expect_keywords: ['\uacb0\uc81c', '\uacc4\uc88c', '\uce74\ub4dc']\n },\n {\n id: 'S09',\n category: '\uc0c1\ud488\uc815\ubcf4',\n message: '\uc774 \uc81c\ud488 \uc18c\uc7ac\uac00 \ubb54\uac00\uc694?',\n expect_keywords: ['\uc0c1\ud488', '\uc0c1\uc138', '\ud398\uc774\uc9c0']\n },\n {\n id: 'S10',\n category: '\ubc30\uc1a1\uc9c0\uc5ed',\n message: '\uc81c\uc8fc\ub3c4 \ubc30\uc1a1 \ub418\ub098\uc694?',\n expect_keywords: ['\uc81c\uc8fc', '\ubc30\uc1a1']\n },\n {\n id: 'F01',\n category: '\ud3f4\ubc31',\n message: '\uc0ac\uc7a5\ub2d8 \uc804\ud654\ubc88\ud638 \uc54c\ub824\uc8fc\uc138\uc694',\n expect_keywords: ['\ub2f4\ub2f9\uc790', '\uc804\ub2ec']\n }\n];\n\nreturn testCases.map(function(tc, idx) {\n return {\n json: {\n test_id: tc.id,\n test_category: tc.category,\n test_index: idx + 1,\n test_total: testCases.length,\n expect_keywords: tc.expect_keywords,\n request_body: {\n store_id: '1',\n session_id: 'test_' + tc.id + '_' + Date.now(),\n channel: 'web_widget',\n message: tc.message\n }\n }\n };\n});",
"mode": "runOnceForAllItems"
},
"id": "b2c3d4e5-0001-4000-8000-000000000002",
"name": "Generate Test Cases",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
490,
300
]
},
{
"parameters": {
"method": "POST",
"url": "http://localhost:5678/webhook/csbot/message",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "string",
"body": "={{ JSON.stringify($json.request_body) }}",
"options": {
"timeout": 15000
}
},
"id": "b2c3d4e5-0001-4000-8000-000000000003",
"name": "Call CSBot Webhook",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
730,
300
],
"onError": "continueRegularOutput",
"notes": "\uba54\uc778 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc758 Webhook\uc744 \ud638\ucd9c\ud569\ub2c8\ub2e4.\nURL\uc744 \uc2e4\uc81c n8n \ud658\uacbd\uc5d0 \ub9de\uac8c \uc218\uc815\ud558\uc138\uc694."
},
{
"parameters": {
"jsCode": "const test = $('Generate Test Cases').item;\nconst response = $input.item.json;\n\nvar botResponse = '';\nvar passed = false;\nvar details = '';\n\ntry {\n // n8n HTTP Request v4.2\ub294 JSON \uc751\ub2f5\uc744 \uc9c1\uc811 $json\uc73c\ub85c \ubc18\ud658\n botResponse = response.response || JSON.stringify(response);\n\n // \ud0a4\uc6cc\ub4dc \ub9e4\uce6d \uac80\uc99d\n var keywords = test.json.expect_keywords || [];\n var matchedKeywords = [];\n var missedKeywords = [];\n\n keywords.forEach(function(kw) {\n if (botResponse.includes(kw)) {\n matchedKeywords.push(kw);\n } else {\n missedKeywords.push(kw);\n }\n });\n\n // \ucd5c\uc18c 1\uac1c \ud0a4\uc6cc\ub4dc \ub9e4\uce6d \uc2dc PASS\n passed = matchedKeywords.length > 0;\n details = 'Matched: [' + matchedKeywords.join(', ') + ']';\n if (missedKeywords.length > 0) {\n details += ' | Missed: [' + missedKeywords.join(', ') + ']';\n }\n} catch(e) {\n botResponse = 'ERROR: ' + e.message;\n details = 'Response parse failed';\n}\n\nvar status = passed ? 'PASS' : 'FAIL';\nvar emoji = passed ? '\u2705' : '\u274c';\n\nreturn [{\n json: {\n result: emoji + ' [' + test.json.test_id + '] ' + test.json.test_category + ': ' + status,\n test_id: test.json.test_id,\n category: test.json.test_category,\n input_message: test.json.request_body.message,\n bot_response: botResponse,\n passed: passed,\n details: details,\n index: test.json.test_index + '/' + test.json.test_total\n }\n}];",
"mode": "runOnceForEachItem"
},
"id": "b2c3d4e5-0001-4000-8000-000000000004",
"name": "Evaluate Result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
970,
300
]
},
{
"parameters": {
"jsCode": "const results = $input.all();\n\nvar passCount = 0;\nvar failCount = 0;\nvar lines = ['===== CS\ubd07 FAQ \ud14c\uc2a4\ud2b8 \uacb0\uacfc =====', ''];\n\nresults.forEach(function(r) {\n lines.push(r.json.result);\n if (r.json.passed) passCount++;\n else failCount++;\n});\n\nvar total = passCount + failCount;\nvar rate = total > 0 ? Math.round((passCount / total) * 100) : 0;\n\nlines.push('');\nlines.push('\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500');\nlines.push('Total: ' + total + ' | Pass: ' + passCount + ' | Fail: ' + failCount);\nlines.push('Pass Rate: ' + rate + '% (\ubaa9\ud45c: 90%)');\nlines.push(rate >= 90 ? '\ud83c\udf89 \ubaa9\ud45c \ub2ec\uc131!' : '\u26a0\ufe0f \ubaa9\ud45c \ubbf8\ub2ec \u2014 FAQ \ub370\uc774\ud130 \ub610\ub294 \ud504\ub86c\ud504\ud2b8 \uc810\uac80 \ud544\uc694');\nlines.push('\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500');\n\nreturn [{\n json: {\n summary: lines.join('\\n'),\n pass_count: passCount,\n fail_count: failCount,\n total: total,\n pass_rate: rate\n }\n}];",
"mode": "runOnceForAllItems"
},
"id": "b2c3d4e5-0001-4000-8000-000000000005",
"name": "Summary",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1210,
300
]
},
{
"parameters": {
"content": "## CS\ubd07 \ud14c\uc2a4\ud2b8 \ud2b8\ub9ac\uac70\n\n### \uc0ac\uc6a9\ubc95\n1. **\uba54\uc778 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub97c \uba3c\uc800 \ud65c\uc131\ud654**\ud558\uc138\uc694\n2. \uc774 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0\uc11c [Execute Workflow] \ud074\ub9ad\n3. Summary \ub178\ub4dc\uc5d0\uc11c \uacb0\uacfc \ud655\uc778\n\n### \ud14c\uc2a4\ud2b8 \ud56d\ubaa9 (11\uac74)\n- S01~S10: PRD 10\uac1c FAQ \uc2dc\ub098\ub9ac\uc624\n- F01: \ud3f4\ubc31 \ud14c\uc2a4\ud2b8\n\n### \uac80\uc99d \ubc29\uc2dd\n\uac01 \uc2dc\ub098\ub9ac\uc624\ubcc4 \uae30\ub300 \ud0a4\uc6cc\ub4dc\uac00\n\uc751\ub2f5\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\n(1\uac1c \uc774\uc0c1 \ub9e4\uce6d \uc2dc PASS)",
"width": 360,
"height": 330
},
"id": "b2c3d4e5-0001-4000-8000-000000000099",
"name": "Test Info",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-150,
120
]
}
],
"connections": {
"Run Tests": {
"main": [
[
{
"node": "Generate Test Cases",
"type": "main",
"index": 0
}
]
]
},
"Generate Test Cases": {
"main": [
[
{
"node": "Call CSBot Webhook",
"type": "main",
"index": 0
}
]
]
},
"Call CSBot Webhook": {
"main": [
[
{
"node": "Evaluate Result",
"type": "main",
"index": 0
}
]
]
},
"Evaluate Result": {
"main": [
[
{
"node": "Summary",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"tags": []
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
CSBot Test Trigger. Uses httpRequest. Event-driven trigger; 6 nodes.
Source: https://github.com/didulos/ai-automation-portfolio/blob/ab180e054b8b2adfda62480ba521bc91ac647aff/csbot-v1/src/n8n-workflows/test-trigger.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.
This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t
[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.
[](https://youtu.be/c7yCZhmMjtI)
This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man
Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.