{
  "name": "Main CSBot",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "csbot/message",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000001",
      "name": "Receive Message",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "operation": "search",
        "base": {
          "__rl": true,
          "value": "YOUR_AIRTABLE_BASE_ID",
          "mode": "id"
        },
        "table": {
          "__rl": true,
          "value": "Stores",
          "mode": "name"
        },
        "filterByFormula": "{StoreID}={{ $json.body.store_id }}",
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000002",
      "name": "Get Store Config",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        490,
        300
      ],
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput",
      "notes": "\u26a0\ufe0f Import \ud6c4 \uc124\uc815 \ud544\uc694:\n1. Airtable Credential \ub9e4\ud551\n2. Base ID\ub97c \uc2e4\uc81c \uac12\uc73c\ub85c \ubcc0\uacbd (appXXXXXX)\n3. \ud14c\uc774\ube14\uba85 \ud655\uc778",
      "notesInFlow": false
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "a1b2c3d4-cond-4000-8000-000000000001",
              "leftValue": "={{ $json.id }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000003",
      "name": "Store Exists?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        720,
        300
      ]
    },
    {
      "parameters": {
        "operation": "search",
        "base": {
          "__rl": true,
          "value": "YOUR_AIRTABLE_BASE_ID",
          "mode": "id"
        },
        "table": {
          "__rl": true,
          "value": "FAQs",
          "mode": "name"
        },
        "filterByFormula": "{IsActive}=TRUE()",
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000004",
      "name": "Get FAQs",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        960,
        300
      ],
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput",
      "notes": "MVP: \ub2e8\uc77c \uc2a4\ud1a0\uc5b4\uc774\ubbc0\ub85c IsActive\ub9cc \ud544\ud130\ub9c1.\n\uba40\ud2f0\uc2a4\ud1a0\uc5b4 \uc2dc StoreID \ud544\ud130 \ucd94\uac00 \ud544\uc694."
    },
    {
      "parameters": {
        "operation": "search",
        "base": {
          "__rl": true,
          "value": "YOUR_AIRTABLE_BASE_ID",
          "mode": "id"
        },
        "table": {
          "__rl": true,
          "value": "Conversations",
          "mode": "name"
        },
        "filterByFormula": "={{ \"{SessionID}='\" + $('Receive Message').first().json.body.session_id + \"'\" }}",
        "returnAll": false,
        "limit": 5,
        "options": {
          "sort": {
            "property": [
              {
                "field": "CreatedAt",
                "direction": "desc"
              }
            ]
          }
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000005",
      "name": "Get Recent Conversations",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        1200,
        300
      ],
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "// Webhook \ub370\uc774\ud130 \ucd94\ucd9c\nconst webhookData = $('Receive Message').first().json.body;\nconst store = $('Get Store Config').first().json;\nconst faqItems = $('Get FAQs').all();\nconst convItems = $('Get Recent Conversations').all();\n\n// store_info \uc9c1\ub82c\ud654\nconst storeInfo = [\n  '\uc2a4\ud1a0\uc5b4\uba85: ' + (store.StoreName || ''),\n  '\ubc30\uc1a1\uc0ac: ' + (store.ShippingCarrier || ''),\n  '\ucd9c\uace0 \uc18c\uc694\uc77c: ' + (store.ShipOutDays || '') + '\uc601\uc5c5\uc77c',\n  '\ubc30\uc1a1 \uc18c\uc694\uc77c: ' + (store.ShippingDays || '') + '\uc601\uc5c5\uc77c',\n  '\ub2f9\uc77c \ucd9c\uace0 \ub9c8\uac10: ' + (store.CutoffTime || ''),\n  '\uad50\ud658 \uac00\ub2a5 \uae30\uac04: \uc218\ub839 \ud6c4 ' + (store.ExchangePeriod || '') + '\uc77c',\n  '\ubc18\ud488 \uac00\ub2a5 \uae30\uac04: \uc218\ub839 \ud6c4 ' + (store.ReturnPeriod || '') + '\uc77c',\n  '\ub2e8\uc21c \ubcc0\uc2ec \ubc18\ud488 \ubc30\uc1a1\ube44: ' + (store.ReturnShippingCost || '') + '\uc6d0',\n  '\ud658\ubd88 \ucc98\ub9ac \uc18c\uc694\uc77c: ' + (store.RefundDays || '') + '\uc601\uc5c5\uc77c',\n  '\uc601\uc5c5\uc2dc\uac04: ' + (store.BusinessHours || '') + ' (' + (store.BusinessDays || '') + ')',\n  '\ud734\ubb34: ' + (store.HolidayInfo || ''),\n  '\ud3c9\uade0 \uc751\ub2f5 \uc2dc\uac04: ' + (store.ResponseTime || ''),\n  '\ud0dd\ubc30 \uc870\ud68c \ub9c1\ud06c: ' + (store.TrackingUrl || ''),\n  '\uc81c\uc8fc/\ub3c4\uc11c\uc0b0\uac04 \ubc30\uc1a1: ' + (store.JejuAvailable ? '\uac00\ub2a5 (\ucd94\uac00 \ubc30\uc1a1\ube44 ' + store.JejuExtraCost + '\uc6d0)' : '\ubd88\uac00'),\n  '\ud574\uc678 \ubc30\uc1a1: ' + (store.OverseasAvailable ? '\uac00\ub2a5 (' + (store.OverseasCountries || '') + ')' : '\ubd88\uac00'),\n  '\uc138\uae08\uacc4\uc0b0\uc11c \ubc1c\ud589: ' + (store.TaxInvoiceAvailable ? '\uac00\ub2a5 (' + (store.TaxInvoiceContact || '') + ')' : '\ubd88\uac00'),\n  '\uacb0\uc81c \uc218\ub2e8: ' + (store.PaymentMethods || ''),\n  '\ud560\ubd80 \uc548\ub0b4: ' + (store.InstallmentInfo || ''),\n  '\uc7ac\uc785\uace0 \uc815\ubcf4: ' + (store.RestockInfo || '\uc815\ubcf4 \uc5c6\uc74c'),\n  '\uc0c1\ud488 \uc0c1\uc138 \uc548\ub0b4: ' + (store.ProductDetailGuide || '')\n].join('\\n');\n\n// faq_data JSON \uc9c1\ub82c\ud654\nconst faqData = JSON.stringify(faqItems\n  .filter(function(f) { return f.json.Category; })\n  .map(function(f) {\n    var patterns = f.json.QuestionPatterns;\n    var vars = f.json.Variables;\n    if (typeof patterns === 'string') {\n      try { patterns = JSON.parse(patterns); } catch(e) { patterns = [patterns]; }\n    }\n    if (typeof vars === 'string') {\n      try { vars = JSON.parse(vars); } catch(e) { vars = []; }\n    }\n    return {\n      category: f.json.Category,\n      question_patterns: patterns || [],\n      answer_template: f.json.AnswerTemplate || '',\n      variables: vars || []\n    };\n  }), null, 2);\n\n// \ub300\ud654 \uc774\ub825 \uc870\ub9bd\nconst conversations = convItems\n  .filter(function(c) { return c.json.CustomerMessage; })\n  .reverse()\n  .map(function(c) {\n    return '[Customer]: ' + c.json.CustomerMessage + '\\n[Bot]: ' + c.json.BotResponse;\n  })\n  .join('\\n');\n\n// \uc2dc\uc2a4\ud15c \ud504\ub86c\ud504\ud2b8 \uc870\ub9bd\nconst storeName = store.StoreName || '\uc2a4\ud1a0\uc5b4';\nconst systemPrompt = [\n  '\ub2f9\uc2e0\uc740 ' + storeName + '\uc758 \uace0\uac1d \uc11c\ube44\uc2a4 \uc0c1\ub2f4\uc6d0\uc785\ub2c8\ub2e4.',\n  '',\n  '## \uc5ed\ud560',\n  '\uace0\uac1d\uc758 \ubb38\uc758\uc5d0 FAQ \ub370\uc774\ud130\ub97c \uae30\ubc18\uc73c\ub85c \uc815\ud655\ud558\uace0 \uce5c\uc808\ud558\uac8c \ub2f5\ubcc0\ud569\ub2c8\ub2e4.',\n  '\uc808\ub300 FAQ \ub370\uc774\ud130 \uc678\uc758 \ub0b4\uc6a9\uc744 \ucd94\uce21\ud558\uac70\ub098 \uc784\uc758\ub85c \ub2f5\ubcc0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.',\n  '',\n  '## \ub9d0\ud22c \uaddc\uce59',\n  '- \ud56d\uc0c1 \uc874\ub313\ub9d0\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.',\n  '- \ub530\ub73b\ud558\uace0 \uc804\ubb38\uc801\uc778 \uc5b4\uc870\ub97c \uc720\uc9c0\ud569\ub2c8\ub2e4.',\n  '- \uc774\ubaa8\uc9c0\ub294 \uc751\ub2f5\ub2f9 \ucd5c\ub300 1\uac1c\ub9cc \uc0ac\uc6a9\ud569\ub2c8\ub2e4.',\n  '- \uc751\ub2f5\uc740 3\ubb38\uc7a5 \uc774\ub0b4\ub85c \uac04\uacb0\ud558\uac8c \uc791\uc131\ud569\ub2c8\ub2e4.',\n  '',\n  '## \uc2a4\ud1a0\uc5b4 \uae30\ubcf8 \uc815\ubcf4',\n  storeInfo,\n  '',\n  '## FAQ \ub370\uc774\ud130',\n  '\uc544\ub798 FAQ \ubaa9\ub85d\ub9cc\uc744 \uadfc\uac70\ub85c \ub2f5\ubcc0\ud569\ub2c8\ub2e4. \uc774 \ubaa9\ub85d\uc5d0 \uc5c6\ub294 \ub0b4\uc6a9\uc740 \uc808\ub300 \ub2f5\ubcc0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.',\n  '',\n  faqData,\n  '',\n  '## \ub2f5\ubcc0 \uaddc\uce59',\n  '1. FAQ \ub9e4\uce6d \uc2dc: FAQ\uc758 AnswerTemplate\uc744 \uae30\ubc18\uc73c\ub85c \uc2a4\ud1a0\uc5b4 \uc815\ubcf4 \ubcc0\uc218\ub97c \ucc44\uc6cc \uc790\uc5f0\uc2a4\ub7fd\uac8c \ub2f5\ubcc0\ud569\ub2c8\ub2e4.',\n  '2. FAQ \ubbf8\ub9e4\uce6d \uc2dc: \uc544\ub798 \ud3f4\ubc31 \ubb38\uad6c\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.',\n  '   > \"\ubb38\uc758 \uc8fc\uc2e0 \ub0b4\uc6a9\uc744 \ub2f4\ub2f9\uc790\uc5d0\uac8c \uc804\ub2ec\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc601\uc5c5\uc2dc\uac04 \ub0b4 \uc21c\ucc28\uc801\uc73c\ub85c \ud655\uc778 \ud6c4 \uc5f0\ub77d\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4.\"',\n  '3. \ubcf5\ud569 \ubb38\uc758 \uc2dc: \uac00\uc7a5 \ud575\uc2ec\uc801\uc778 \uc9c8\ubb38 \ud558\ub098\uc5d0\ub9cc \ub2f5\ubcc0\ud558\uace0, \ub098\uba38\uc9c0\ub294 \ucd94\uac00 \ubb38\uc758\ub97c \uc720\ub3c4\ud569\ub2c8\ub2e4.',\n  '',\n  '## \uc808\ub300 \uae08\uc9c0 \uc0ac\ud56d',\n  '- \uac00\uaca9 \ud560\uc778\uc774\ub098 \ucd94\uac00 \ud61c\ud0dd \uc57d\uc18d',\n  '- \ud658\ubd88\u00b7\uad50\ud658\uc758 \uc989\uc2dc \ucc98\ub9ac \uc57d\uc18d',\n  '- \ubc30\uc1a1 \ub0a0\uc9dc\ub97c \uad6c\uccb4\uc801 \ub0a0\uc9dc\ub85c \ud655\uc815\ud558\uc5ec \uc57d\uc18d',\n  '- \uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638, \uacc4\uc88c\ubc88\ud638 \ub4f1 \ubbfc\uac10\ud55c \uac1c\uc778\uc815\ubcf4 \uc694\uccad',\n  '- FAQ\uc5d0 \uc5c6\ub294 \uc815\ucc45\u00b7\uc815\ubcf4\ub97c \ucd94\uce21\ud558\uc5ec \uc548\ub0b4',\n  '- \ud0c0 \uc1fc\ud551\ubab0\uc774\ub098 \uacbd\uc7c1\uc0ac \uc5b8\uae09'\n].join('\\n');\n\n// \uc720\uc800 \uba54\uc2dc\uc9c0 \uc870\ub9bd\nvar userMessage = '';\nif (conversations) {\n  userMessage = '## \ub300\ud654 \uc774\ub825 (\ucd5c\uadfc 5\ud134)\\n' + conversations + '\\n\\n## \uace0\uac1d \ubb38\uc758\\n' + webhookData.message;\n} else {\n  userMessage = '## \uace0\uac1d \ubb38\uc758\\n' + webhookData.message;\n}\n\n// Claude API \uc694\uccad \ubcf8\ubb38\nconst requestBody = JSON.stringify({\n  model: 'claude-sonnet-4-6',\n  max_tokens: 500,\n  system: systemPrompt,\n  messages: [{ role: 'user', content: userMessage }]\n});\n\nreturn [{\n  json: {\n    system_prompt: systemPrompt,\n    user_message: userMessage,\n    request_body: requestBody,\n    store_id: webhookData.store_id,\n    session_id: webhookData.session_id,\n    channel: webhookData.channel,\n    message: webhookData.message,\n    store_record_id: store.id || '',\n    store_name: storeName,\n    start_time: Date.now()\n  }\n}];",
        "mode": "runOnceForAllItems"
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000006",
      "name": "Build Prompt",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1440,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.anthropic.com/v1/messages",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "string",
        "body": "={{ $json.request_body }}",
        "options": {
          "timeout": 60000
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000007",
      "name": "Call Claude API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1680,
        300
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput",
      "notes": "\u26a0\ufe0f Import \ud6c4 \uc124\uc815 \ud544\uc694:\nHeader Auth Credential \ub9e4\ud551\n- Header Name: x-api-key\n- Header Value: sk-ant-..."
    },
    {
      "parameters": {
        "jsCode": "const input = $input.item.json;\nconst prevData = $('Build Prompt').first().json;\nconst startTime = prevData.start_time;\n\nvar botResponse;\nvar wasFallback = false;\nvar matchedCategory = '';\n\n// Claude API \uc5d0\ub7ec \uccb4\ud06c\nif (input.error || !input.content || !input.content[0]) {\n  botResponse = '\uc8c4\uc1a1\ud569\ub2c8\ub2e4. \uc77c\uc2dc\uc801\uc778 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694.';\n  wasFallback = true;\n} else {\n  botResponse = input.content[0].text;\n  wasFallback = botResponse.includes('\ub2f4\ub2f9\uc790\uc5d0\uac8c \uc804\ub2ec');\n\n  // \uce74\ud14c\uace0\ub9ac \ub9e4\uce6d (\ud0a4\uc6cc\ub4dc \uae30\ubc18 \ud734\ub9ac\uc2a4\ud2f1)\n  if (!wasFallback) {\n    var text = botResponse;\n    if (text.includes('\ucd9c\uace0') && text.includes('\uc601\uc5c5\uc77c')) matchedCategory = '\ubc30\uc1a1\uc18c\uc694\uc77c';\n    else if (text.includes('\uc6b4\uc1a1\uc7a5') || (text.includes('\ubc30\uc1a1') && text.includes('\uc870\ud68c'))) matchedCategory = '\ubc30\uc1a1\uc870\ud68c';\n    else if (text.includes('\uad50\ud658')) matchedCategory = '\uad50\ud658';\n    else if (text.includes('\ubc18\ud488') || text.includes('\ud658\ubd88')) matchedCategory = '\ubc18\ud488\ud658\ubd88';\n    else if (text.includes('\ucde8\uc18c')) matchedCategory = '\uc8fc\ubb38\ucde8\uc18c';\n    else if (text.includes('\uc7ac\uc785\uace0') || text.includes('\ud488\uc808')) matchedCategory = '\uc7ac\uc785\uace0';\n    else if (text.includes('\uc6b4\uc601\uc2dc\uac04') || text.includes('\uc601\uc5c5\uc2dc\uac04')) matchedCategory = '\uc601\uc5c5\uc2dc\uac04';\n    else if (text.includes('\uacb0\uc81c') || text.includes('\uc138\uae08\uacc4\uc0b0\uc11c')) matchedCategory = '\uacb0\uc81c';\n    else if (text.includes('\uc0c1\uc138') && text.includes('\ud398\uc774\uc9c0')) matchedCategory = '\uc0c1\ud488\uc815\ubcf4';\n    else if (text.includes('\uc81c\uc8fc') || text.includes('\ub3c4\uc11c\uc0b0\uac04') || text.includes('\ud574\uc678')) matchedCategory = '\ubc30\uc1a1\uc9c0\uc5ed';\n  }\n}\n\nvar responseTimeMs = Date.now() - startTime;\n\nreturn {\n  StoreID: prevData.store_record_id ? [prevData.store_record_id] : [],\n  SessionID: prevData.session_id,\n  Channel: prevData.channel,\n  CustomerMessage: prevData.message,\n  BotResponse: botResponse,\n  MatchedCategory: matchedCategory,\n  WasFallback: wasFallback,\n  ResponseTimeMs: responseTimeMs\n};",
        "mode": "runOnceForEachItem"
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000008",
      "name": "Parse Response",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1920,
        300
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "base": {
          "__rl": true,
          "value": "YOUR_AIRTABLE_BASE_ID",
          "mode": "id"
        },
        "table": {
          "__rl": true,
          "value": "Conversations",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "matchingColumns": []
        },
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000009",
      "name": "Save Conversation",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        2160,
        300
      ],
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput",
      "notes": "autoMapInputData: Parse Response\uc758 PascalCase \ud544\ub4dc\uac00\nAirtable \uceec\ub7fc\uba85\uacfc \uc790\ub3d9 \ub9e4\ud551\ub429\ub2c8\ub2e4.\n\uc18c\ubb38\uc790 \ud544\ub4dc(bot_response \ub4f1)\ub294 \ubb34\uc2dc\ub429\ub2c8\ub2e4."
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "={{ JSON.stringify({ response: $('Parse Response').first().json.BotResponse }) }}",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "content-type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000010",
      "name": "Send Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        2400,
        300
      ]
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "={{ JSON.stringify({ response: \"\uc11c\ube44\uc2a4 \uc124\uc815 \uc911\uc785\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \ubb38\uc758\ud574 \uc8fc\uc138\uc694.\", error: true }) }}",
        "options": {
          "responseCode": "200",
          "responseHeaders": {
            "entries": [
              {
                "name": "content-type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000011",
      "name": "Send Error Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        960,
        520
      ]
    },
    {
      "parameters": {
        "content": "## ArumDri CS\ubd07 \uc6cc\ud06c\ud50c\ub85c\uc6b0\n\n### Import \ud6c4 \ud544\uc218 \uc124\uc815\n\n1. **Airtable Credential** \ub9e4\ud551\n   - \ubaa8\ub4e0 Airtable \ub178\ub4dc\uc5d0\uc11c Credential \uc7ac\uc5f0\uacb0\n   - Base ID\ub97c \uc2e4\uc81c \uac12\uc73c\ub85c \ubcc0\uacbd (appXXXXXX)\n\n2. **Claude API Credential** \ub9e4\ud551\n   - Call Claude API \ub178\ub4dc\uc5d0\uc11c Header Auth \uc7ac\uc5f0\uacb0\n   - Header Name: `x-api-key`\n   - Header Value: `sk-ant-...`\n\n3. **\ud14c\uc2a4\ud2b8**\n   - Webhook URL: `POST /webhook/csbot/message`\n   - Body: `{\"store_id\": \"1\", \"session_id\": \"test_001\", \"channel\": \"web_widget\", \"message\": \"\ubc30\uc1a1 \uc5bc\ub9c8\ub098 \uac78\ub824\uc694?\"}`",
        "width": 420,
        "height": 380
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000099",
      "name": "Setup Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -200,
        120
      ]
    }
  ],
  "connections": {
    "Receive Message": {
      "main": [
        [
          {
            "node": "Get Store Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Store Config": {
      "main": [
        [
          {
            "node": "Store Exists?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Exists?": {
      "main": [
        [
          {
            "node": "Get FAQs",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Error Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get FAQs": {
      "main": [
        [
          {
            "node": "Get Recent Conversations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Recent Conversations": {
      "main": [
        [
          {
            "node": "Build Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Prompt": {
      "main": [
        [
          {
            "node": "Call Claude API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call Claude API": {
      "main": [
        [
          {
            "node": "Parse Response",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Parse Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Response": {
      "main": [
        [
          {
            "node": "Save Conversation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Conversation": {
      "main": [
        [
          {
            "node": "Send Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": false
  },
  "tags": []
}