내 고객 인공지능 엔진
고급
이것은Market Research, AI Summarization분야의자동화 워크플로우로, 25개의 노드를 포함합니다.주로 Code, Gmail, Merge, Reddit, SerpApi 등의 노드를 사용하며. Anthropic, Reddit, X 및 SerpAPI를 사용한 고객 문제점 분석 및 AI 요약
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "PgYCSNco4ZUxp1Qf",
"meta": {
"instanceId": "766c8c237f056d009bb1bd53e73633458b146427b1ae9c6ec10561694aa89152",
"templateCredsSetupCompleted": true
},
"name": "My Customer Intelligence Engine",
"tags": [],
"nodes": [
{
"id": "b8dd0104-33f0-427b-907e-c71cd7366c39",
"name": "병합",
"type": "n8n-nodes-base.merge",
"position": [
560,
-112
],
"parameters": {
"numberInputs": 3
},
"typeVersion": 3.2
},
{
"id": "e4b66790-4ffb-4605-a831-fe0a34c6745d",
"name": "Reddit 필터링 및 라벨링",
"type": "n8n-nodes-base.code",
"position": [
176,
256
],
"parameters": {
"jsCode": "\nreturn $input.all()\n .filter(item => $input.first().json.score > 5) \n .map(item => ({\n json: {\n title: $input.first().json.title,\n text: $input.first().json.selftext,\n source_url: $input.first().json.url,\n source: 'Reddit',\n full_text: `${item.json.title} ${item.json.selftext}`\n }\n }));"
},
"typeVersion": 2
},
{
"id": "116053e4-cf92-4e90-a817-e54744a511c8",
"name": "범주화 및 감성 분석",
"type": "n8n-nodes-base.code",
"position": [
880,
-96
],
"parameters": {
"jsCode": "return $input.all().map(item => {\n const text = item.json.full_text.toLowerCase();\n let pain_point = 'Uncategorized';\n let sentiment = 0; \n\n if (text.includes('wait') || text.includes('hold') || text.includes('busy signal')) {\n pain_point = 'Call Hold/Availability';\n sentiment -= 2;\n } else if (text.includes('schedule') || text.includes('cancel') || text.includes('missed appointment')) {\n pain_point = 'Scheduling Inefficiency';\n sentiment -= 3;\n } else if (text.includes('rude') || text.includes('snippy') || text.includes('unhelpful')) {\n pain_point = 'Receptionist Tone/Quality';\n sentiment -= 3;\n } else if (text.includes('code') || text.includes('system') || text.includes('ai') || text.includes('automated')) {\n pain_point = 'Automated System Frustration';\n sentiment -= 1;\n }\n\n item.json.pain_point = pain_point;\n item.json.sentiment_score = sentiment;\n item.json.unique_key = pain_point + item.json.text.substring(0, 50).replace(/[^a-zA-Z0-9]/g, '');\n\n return item;\n});"
},
"typeVersion": 2
},
{
"id": "5ac35644-fdd6-42f8-9e6f-86ada4386e80",
"name": "중복 제거, 카운트 및 형식화",
"type": "n8n-nodes-base.code",
"position": [
1232,
-96
],
"parameters": {
"jsCode": "const inputItems = $input.all();\n\nif (!Array.isArray(inputItems) || inputItems.length === 0) {\n return []; \n}\n\n\nconst uniqueItems = new Map();\nconst painPointCounts = {};\nconst sourceCounts = {}; \nlet totalSentiment = 0; \n\nfor (const item of inputItems) {\n if (!item.json || !item.json.unique_key) continue; \n \n if (!uniqueItems.has(item.json.unique_key)) {\n uniqueItems.set(item.json.unique_key, item);\n totalSentiment += item.json.sentiment_score;\n }\n \n painPointCounts[item.json.pain_point] = (painPointCounts[item.json.pain_point] || 0) + 1;\n sourceCounts[item.json.source] = (sourceCounts[item.json.source] || 0) + 1; \n}\n\nconst totalUniqueItems = uniqueItems.size;\nconst averageSentiment = totalUniqueItems > 0 ? totalSentiment / totalUniqueItems : 0;\nconst roundedAvgSentiment = Math.round(averageSentiment * 100) / 100;\n\n\nconst summaryString = `\nCurrent Market Intelligence Brief (Total Unique Complaints: ${totalUniqueItems}):\nAverage Sentiment Intensity (Lower is Worse): ${roundedAvgSentiment}\nPain Point Frequencies: ${JSON.stringify(painPointCounts, null, 2)}\nSource Distribution: ${JSON.stringify(sourceCounts, null, 2)}\nTop 5 Unique Complaint Examples: \n${Array.from(uniqueItems.values()).slice(0, 5).map(item => \n `- [${item.json.pain_point}] \"${item.json.title?.substring(0, 60)}...\" (Source: ${item.json.source})`\n).join('\\n')}\n`;\n\n\nconst outputForSheets = [];\nconst painPointKeys = Object.keys(painPointCounts);\n\nif (painPointKeys.length > 0) {\n for (const key of painPointKeys) {\n const latestSourceItem = Array.from(uniqueItems.values()).find(item => item.json.pain_point === key);\n \n const sheetObject = {\n 'Pain_Point': key,\n 'Count': painPointCounts[key],\n 'Average_Sentiment': roundedAvgSentiment, \n 'Latest_Source': latestSourceItem?.json.source || 'N/A', \n 'LLM_SUMMARY_HOLDER': summaryString \n };\n \n outputForSheets.push({ json: sheetObject });\n }\n}\n\n\nreturn outputForSheets;"
},
"typeVersion": 2
},
{
"id": "86de386e-02a5-401c-862b-f034ac530a7e",
"name": "X 필터링 및 라벨링",
"type": "n8n-nodes-base.code",
"position": [
176,
800
],
"parameters": {
"jsCode": "const rawTweets = $input.item.json.data || $input.item.json.tweets; \n\nif (!rawTweets || !Array.isArray(rawTweets)) {\n return [];\n}\n\nreturn rawTweets\n .map(tweet => ({\n json: {\n title: tweet.user ? 'Tweet from @' + tweet.user.screen_name : 'Tweet',\n text: tweet.text || '', \n source_url: tweet.url || `https://twitter.com/i/web/status/${tweet.id_str}`,\n source: 'Twitter (External API)',\n full_text: tweet.text || '',\n favorite_count: tweet.favorite_count || 0,\n }\n }));"
},
"typeVersion": 2
},
{
"id": "89ee7c6d-9af1-4406-9e55-1d555be8c69b",
"name": "요약 가져오기",
"type": "n8n-nodes-base.code",
"position": [
1760,
32
],
"parameters": {
"jsCode": "const previousNodeName = 'Deduplicate, Count, and Format'; \nconst previousNodeOutput = $items(previousNodeName, 0);\n\nif (!previousNodeOutput || previousNodeOutput.length === 0 || !previousNodeOutput[0].json) {\n return [{ json: { summary: \"Error: Could not retrieve summary string from upstream node.\" } }];\n}\n\nconst summary = previousNodeOutput[0].json.LLM_SUMMARY_HOLDER || \"No market intelligence data found for this run.\"; \n\nif (summary.includes(\"No market intelligence data found\")) {\n const cleanSummary = \"The system ran, but no relevant market complaints were found in the data sources. No brief is required.\";\n return [{ json: { summary: cleanSummary } }];\n}\n\nreturn [{ json: { summary: summary } }];"
},
"typeVersion": 2
},
{
"id": "871834d2-510f-4b1c-82bb-3159e123ea68",
"name": "Reddit 검색",
"type": "n8n-nodes-base.reddit",
"position": [
-48,
256
],
"parameters": {
"limit": 50,
"filters": {},
"operation": "getAll",
"subreddit": "={{ $json.subreddit }}"
},
"credentials": {
"redditOAuth2Api": {
"id": "LQf5gOlHg5jrdJ68",
"name": "Reddit account"
}
},
"typeVersion": 1
},
{
"id": "06e6eebe-a394-4135-99f3-d1d4da03d62a",
"name": "Google 검색",
"type": "n8n-nodes-serpapi.serpApi",
"position": [
-272,
-368
],
"parameters": {
"q": "HVAC company customer service problems",
"location": "={{ $json[\"Location (where you want the search to originate):\"] }}",
"requestOptions": {},
"additionalFields": {
"hl": "en",
"num": "20"
}
},
"credentials": {
"serpApi": {
"id": "DIWlQVDEFO4o8beb",
"name": "SerpAPI account"
}
},
"typeVersion": 1
},
{
"id": "957b3e0e-4163-4bc4-a72b-538cc03c4158",
"name": "X 검색",
"type": "n8n-nodes-base.httpRequest",
"position": [
-272,
800
],
"parameters": {
"url": "https://api.twitterapi.io/twitter/tweet/advanced_search",
"options": {},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "query",
"value": "={{ $json[\"Mention X (Twitter) Search Query:\"] }}"
},
{
"name": "queryType",
"value": "Latest"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"id": "Q7mjBI2AxTsUO2Xj",
"name": "X/Twitter Demo"
}
},
"typeVersion": 4.2
},
{
"id": "03925ec9-70a1-4a8e-94f9-1cd358d119a4",
"name": "Google 필터링 및 라벨링",
"type": "n8n-nodes-base.code",
"position": [
176,
-368
],
"parameters": {
"jsCode": "return $input.all()\n .flatMap(item => item.json.organic_results || []) \n .map(result => ({\n json: {\n title: result.title,\n text: result.snippet,\n source_url: result.link,\n source: 'SERP API (Web)',\n full_text: `${result.title} ${result.snippet}`\n }\n }));"
},
"typeVersion": 2
},
{
"id": "06b06b67-849a-4881-ba06-0ea2428789dd",
"name": "경영진 이메일",
"type": "@n8n/n8n-nodes-langchain.anthropic",
"position": [
1984,
32
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "claude-haiku-4-5-20251001",
"cachedResultName": "claude-haiku-4-5-20251001"
},
"options": {
"system": "You are a strategic AI product consultant tasked with generating a professional executive summary for a sales team. \n\n***CRITICAL CONSTRAINT: Do NOT use markdown code blocks (e.g., ```html or ```) or any external delimiters. Output ONLY the raw HTML content. Do NOT include <html>, <head>, or <body> tags.***\n\nYour response must strictly adhere to the following structure and formatting rules:\n\n<h1>AI Voice Agent Executive Summary – HVAC Customer Service Market</h1>\n\n<h2>OPPORTUNITY STATEMENT</h2>\n(Provide a two-sentence summary of the biggest market opportunity for the AI Voice Agent based on the data. Use <p> tags for paragraphs.)\n\n<hr>\n\n<h2>TOP 3 PAIN/SELLING POINTS</h2>\n(List the three highest-count pain points. For each point, the pain point must be formatted using a large **<h3> tag** and bold text: <b>1. [Pain Point Name]</b>. Provide a <b>corresponding AI Voice Agent Feature Suggestion</b> that solves that specific pain. Use HTML unordered lists <ul> for clean formatting of feature suggestions.)\n\n<hr>\n\n<h2>SOURCE TRUST ASSESSMENT</h2>\n(Provide a complete analysis of the data's reliability, ensuring the table is fully rendered and includes ALL THREE SOURCES (Reddit, Twitter, SERP API). \n\n***CRITICAL STYLING FIX: The table MUST be wrapped in a <div align=\"center\"> container. The table MUST have width=\"80%\" set as an attribute and the border=\"1\" attribute.***\n\nUse a single HTML table for the analysis. For a clean, single-line border, the table MUST include the following inline style: **style=\"border-collapse: collapse; border: 1px solid black;\"**\n\nThe table header cells (<th>) MUST have the following combined inline style: **style=\"background-color: #f2f2f2; padding: 10px; text-align: center;\"** (This sets the background to light gray, adds padding, and center-aligns the text).\n\nThe table data cells (<td>) MUST have the following inline style: **style=\"padding: 10px;\"** (This adds padding to the regular data cells).\n\nThe table MUST include the following columns:\n1. <b>Data Source</b>\n2. <b>Volume</b> (Must include both **number of mentions** AND **percentage of total**—e.g., 200 mentions (87%))\n3. <b>Reliability Rating</b> (Use text and star emojis)\n4. <b>Context & Limitations</b>\n\nFollow the table with a final key insight summary paragraph.)"
},
"messages": {
"values": [
{
"content": "=DATA TO ANALYZE:\n{{ $json.summary }}"
}
]
}
},
"credentials": {
"anthropicApi": {
"id": "CFRCoeDLcmUNPQT7",
"name": "Anthropic account"
}
},
"typeVersion": 1
},
{
"id": "d2e6ff58-1af5-486c-aa84-52ab8e4f9824",
"name": "이메일 보내기",
"type": "n8n-nodes-base.gmail",
"position": [
2320,
32
],
"webhookId": "3ac6cf9d-8d4d-4055-86e8-9c82a7d13d41",
"parameters": {
"sendTo": "={{ $('Form').item.json[\"What is your Email?\"] }}",
"message": "={{ $json.content[0].text }}",
"options": {
"appendAttribution": false
},
"subject": "=re: Market briefing for {{ $('Form').item.json[\"What is your Name?\"] }}"
},
"credentials": {
"gmailOAuth2": {
"id": "PJrUDp0UTEVBDOMT",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "6d8947d0-ca54-4036-bb15-77152ed4bf8b",
"name": "검색 상세 로깅",
"type": "n8n-nodes-base.googleSheets",
"position": [
1760,
-256
],
"parameters": {
"columns": {
"value": {
"Count": "={{ $json.Count }}",
"Pain_Point": "={{ $json.Pain_Point }}",
"Latest_Source": "={{ $json.Latest_Source }}",
"Execution_Date": "={{ $now.format('dd/LL/yyyy') }}",
"Average_Sentiment": "={{ $json.Average_Sentiment }}",
"Summary_Sample_Example": "={{ $json.LLM_SUMMARY_HOLDER }}"
},
"schema": [
{
"id": "Execution_Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Execution_Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Latest_Source",
"type": "string",
"display": true,
"required": false,
"displayName": "Latest_Source",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Pain_Point",
"type": "string",
"display": true,
"required": false,
"displayName": "Pain_Point",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Average_Sentiment",
"type": "string",
"display": true,
"required": false,
"displayName": "Average_Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary_Sample_Example",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary_Sample_Example",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1q1Qw8LqRjn-RsDNkbrUJVw7UWfuqR-VInWYSikvYYnY/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1q1Qw8LqRjn-RsDNkbrUJVw7UWfuqR-VInWYSikvYYnY",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1q1Qw8LqRjn-RsDNkbrUJVw7UWfuqR-VInWYSikvYYnY/edit?usp=drivesdk",
"cachedResultName": "Customer Intent"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "jBABhxE6xPp1vBwL",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "13cbdc50-d991-467c-bcb8-da40f150af79",
"name": "폼",
"type": "n8n-nodes-base.formTrigger",
"position": [
-720,
-80
],
"webhookId": "997fbb25-7733-4286-a5db-14fbce3ea11f",
"parameters": {
"options": {},
"formTitle": "Customer intelligence Briefing",
"formFields": {
"values": [
{
"fieldLabel": "What is your Name?",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "What is your Email?",
"requiredField": true
},
{
"fieldLabel": "Location (where you want the search to originate):",
"placeholder": "United States",
"requiredField": true
},
{
"fieldLabel": "Mention SerpAPI (Google) Search Query:",
"placeholder": "Refer to STICKY NOTE",
"requiredField": true
},
{
"fieldLabel": "Mention X (Twitter) Search Query:",
"placeholder": "Refer to STICKY NOTE",
"requiredField": true
},
{
"fieldLabel": "Mention the #1 subreddit to search:",
"placeholder": "Refer to STICKY NOTE",
"requiredField": true
},
{
"fieldLabel": "Mention the #2 subreddit to search:",
"placeholder": "Refer to STICKY NOTE",
"requiredField": true
}
]
},
"formDescription": "The system will analyze the web, categorize complaints, and deliver a strategic executive summary to the sales team within minutes."
},
"typeVersion": 2.3
},
{
"id": "4b2111ee-09bd-45f7-b8b7-81b37403f4c1",
"name": "스티커 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1168,
-128
],
"parameters": {
"width": 624,
"height": 736,
"content": "## Trigger: Form\n\n\n\n\n\n## 🔗 Search Query Guide - Form\n\n\nUse this guide to construct highly targeted queries for each source, ensuring maximum signal clarity.\n\n### 1\\. SERP API (Google) Query\n \n* **Example Query:** \"HVAC company customer service problems\"\n \n* **Pro Tip:** Use quotes to search for exact phrases and add modifiers like \"solution\" or \"inefficiency\".\n \n* **Referenced Link:** [https://serpapi.com/search-api](https://serpapi.com/search-api)\n \n\n### 2\\. X (Twitter) Search Query\n \n* **Example Query:** HVAC (\"customer service\" OR call OR scheduling) (bad OR terrible OR wait OR \"on hold\")\n \n* **Pro Tip:** Use parentheses for Boolean logic and avoid overly broad terms to prevent noise. This focuses on high-impact customer interactions.\n \n* **Referenced Link:** [https://github.com/igorbrigadir/twitter-advanced-search](https://github.com/igorbrigadir/twitter-advanced-search)\n \n\n### 3\\. Subreddit Names (Reddit)\n* **Example Input:** hvac, homeowners, mildlyinfuriating\n \n* **Important Note:** Make sure each subreddit exists and is spelled correctly."
},
"typeVersion": 1
},
{
"id": "19ea5f7a-a156-4350-b243-a0b308d3e7e1",
"name": "스티커 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
-672
],
"parameters": {
"color": 2,
"width": 704,
"height": 480,
"content": "Data Stream Ingestion: SERP API\n----------------------------------------------------------\n\n1. **SERP API Node:** \nThis node uses the form's **Target Keywords** to query Google for industry reports, articles, and authoritative commentary. This establishes the **Strategic Context Stream** to validate the systemic nature of the customer pain points.\n\n \n2. **Function Node (Filter & Label SERP):** \nThis code performs essential data cleanup. It extracts only the title, snippet (text), and link from the API output. **Crucially,** it applies the mandatory **source: 'SERP API (Web)'** label to normalize the data, preparing it for the Merge Node (Step 4)."
},
"typeVersion": 1
},
{
"id": "97c6df85-6b40-4b14-afaa-9bc1a31daff9",
"name": "스티커 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
-128
],
"parameters": {
"color": 2,
"width": 704,
"height": 560,
"content": "Data Stream Ingestion: Reddit\n------------------------------------------------------------\n\n1. **Function Node (Create Subreddit List):** \nThis node takes the user's comma-separated list of subreddits from the form input and transforms the list into individual items. This action initiates the necessary looping structure, allowing the subsequent Reddit node to run once per subreddit name.\n\n \n2. **Reddit Node (Get Posts):** \nThis node executes iteratively, running once for every individual subreddit item received from the previous node. It dynamically fetches a batch of posts using the expression {{ $json.subreddit }}.\n\n \n3. **Function Node (Filter & Label Reddit):** \nThis code performs two essential tasks: **filtering** (discarding low-engagement posts, score <= 5) and **labeling** (applying the **source: 'Reddit'** label) before standardizing the post structure for the Merge Node."
},
"typeVersion": 1
},
{
"id": "cbe7c270-a0eb-4107-ac7d-1b0c5a1423c8",
"name": "리스트 생성기",
"type": "n8n-nodes-base.code",
"position": [
-272,
256
],
"parameters": {
"jsCode": "return [\n { json: { subreddit: $input.first().json[\"Mention the #1 subreddit to search:\"] } },\n { json: { subreddit: $input.first().json[\"Mention the #2 subreddit to search:\"] } },\n];"
},
"typeVersion": 2
},
{
"id": "3fc140dd-d940-46ba-a93c-07f619c5b517",
"name": "스티커 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
496
],
"parameters": {
"color": 2,
"width": 704,
"height": 480,
"content": "Data Stream Ingestion: X\n------------------------------------------------------------\n\n1. **HTTP Request Node (Fetch Tweets):** \nThis node uses an external API (twitterapi.io) via an HTTP call to query X/Twitter with the **Target Keywords**. This configuration is essential to **bypass the restrictive rate limits (429)** and advanced query errors (400) of the standard API, ensuring reliable ingestion.\n\n \n2. **Function Node (Filter & Label X):** \nThis code acts as the final quality control. It **filters out low-engagement or noisy items** (like tweets with <= 5 likes) that the external API didn't handle. It then extracts, standardizes, and applies the **source: 'Twitter'** label, ensuring a clean, high-signal social stream for the Merge Node.\n \n\n\n\n \n\n\n"
},
"typeVersion": 1
},
{
"id": "fb6c3b6d-5c68-4760-8741-ad604f1bbaea",
"name": "스티커 노트4",
"type": "n8n-nodes-base.stickyNote",
"position": [
800,
-560
],
"parameters": {
"color": 2,
"width": 624,
"height": 656,
"content": "Core Analytical Engines\n----------------------------------------------------------\n \n\n1. **Categorization & Sentiment:** \nThis node applies the **Hybrid Categorization Logic** to the entire, merged dataset. It uses sophisticated, custom keyword scoring (instead of expensive LLM calls) to assess the intent of each complaint and assign a precise **pain\\_point category** (e.g., 'Automated System Frustration') and a **sentiment\\_score**. This creates the clean labels necessary for final aggregation.\n\n \n1. **Deduplicate, Count, and Format:** \nThis node acts as the final statistical processor and dispatcher. It performs:\n \n * **Deduplication:** It discards redundant complaints using the unique keys generated in the previous step.\n \n * **Aggregation:** It calculates the total **Count** and **Average\\_Sentiment** for each unique Pain\\_Point.\n \n * **Dispatch Preparation:** It formats the statistical data into a structure suitable for Google Sheets and simultaneously calculates and stores the comprehensive **summaryString** required for the downstream LLM/Email delivery via the serial route."
},
"typeVersion": 1
},
{
"id": "1f4ea8d1-93de-42be-ad0b-eb3b84e91622",
"name": "스티커 노트5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1680,
-16
],
"parameters": {
"width": 848,
"height": 688,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nFinal Delivery System: LLM Briefing & Dispatch\n----------------------------------------------------------\n\n1. **Function (Get LLM Summary):** \nThis node is the **data retrieval bridge** for the serial route. It uses the helper function **$items()** to reach back into the workflow's memory and retrieve the complete **summaryString** (containing all metrics and examples) from the preceding node. It includes essential **safeguards** to pass a clean \"No Data Found\" message if necessary.\n\n \n2. **Message a model (Anthropic):** \nThis is the **Intelligence Generator**. It takes the summary string from the previous node and, using a strict **System Prompt**, transforms the raw data into a professional, formatted **HTML executive brief**. It applies strategic analysis, generates the Opportunity Statement, Top 3 Selling Points, and Source Trust Assessment.\n\n3. **Gmail (Send a message):** \nThis node is the **Final Dispatcher**. It retrieves the pure HTML content generated by the LLM and sends it to the target sales team recipients. The email is formatted as **HTML** to ensure the specialized tables, headers, and bullet points generated by the LLM render correctly and professionally."
},
"typeVersion": 1
},
{
"id": "c9f47226-c11e-499c-9246-64960bb93a2a",
"name": "스티커 노트6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1680,
-560
],
"parameters": {
"width": 848,
"height": 480,
"content": "\nLog Search Detail Node\n----------------------------------------------------------\nThis node captures the **raw input parameters** submitted by the user in the form trigger (e.g., Target Keywords, Target Subreddits) and stores them in the workflow's memory or a dedicated log.\n\n\n### **Function:** \nIt creates an **audit trail**, allowing you to:\n\n* **Reproduce the Search:** Easily check the exact conditions used for any given intelligence brief.\n \n* **Debugging:** Quickly identify if a flawed search query caused a downstream ingestion error.\n\n\n"
},
"typeVersion": 1
},
{
"id": "80550bfb-1b83-4c0f-8b40-ae1dd688b303",
"name": "스티커 노트12",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2016,
-560
],
"parameters": {
"color": 5,
"width": 624,
"height": 368,
"content": "# Hello there!\n\n\n\n# Need support or have a workflow question? \n\n## 🔗 [Connect on LinkedIn](https://www.linkedin.com/in/bhuvaneshhhh/)"
},
"typeVersion": 1
},
{
"id": "6b8bd8d3-b3b4-47d9-bb3b-60c7beee3321",
"name": "스티커 노트7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1280,
-768
],
"parameters": {
"color": 7,
"width": 3920,
"height": 1856,
"content": ""
},
"typeVersion": 1
},
{
"id": "ba1380c4-3024-4e7d-97ad-2326a07814d0",
"name": "스티커 노트8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2016,
-128
],
"parameters": {
"width": 624,
"height": 736,
"content": "# Customer Intelligence Engine\n\n## How it Works?\n\n## 1. Data Ingestion and Fusion\nThe workflow initiates upon a form submission and immediately splits into three parallel branches to fetch data simultaneously, ensuring speed: the SERP API pulls authoritative web commentary, Reddit runs a structured loop to gather community complaints, and an HTTP Request accesses the X/Twitter API for real-time sentiment. This data is then cleaned, labeled with its source, and combined into a single unified stream by the Merge Node (Mode: Append).\n\n## 2. Core Analysis and Aggregation\nThe unified data stream is passed to the Hybrid Categorization Function Node, which applies custom JavaScript logic (Layer 1: High-Confidence Matching; Layer 2: Semantic Similarity Scoring) to classify each complaint accurately into specific Pain Points (e.g., 'Automated System Frustration') without costly per-item LLM calls. The next Deduplicate, Count, and Format Node performs the final aggregation, counting the frequency of each pain point and storing the entire analysis string within the data payload for later retrieval.\n\n## 3. Final Dispatch (Serial Route)\nThe final delivery uses an alternate serial route to ensure stability: the aggregated statistical data is first logged directly to Google Sheets. Simultaneously, a subsequent Function Node (Get LLM Summary) retrieves the stored analysis string from memory. This string is then fed to the Message a model (Anthropic) Node, which acts as the Intelligence Generator, transforming the raw metrics into a professional, formatted HTML Executive Brief that is finally dispatched via the Gmail Node."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "bc1a0b84-4826-47a8-a194-343832b3dfb5",
"connections": {
"13cbdc50-d991-467c-bcb8-da40f150af79": {
"main": [
[
{
"node": "06e6eebe-a394-4135-99f3-d1d4da03d62a",
"type": "main",
"index": 0
},
{
"node": "cbe7c270-a0eb-4107-ac7d-1b0c5a1423c8",
"type": "main",
"index": 0
},
{
"node": "957b3e0e-4163-4bc4-a72b-538cc03c4158",
"type": "main",
"index": 0
}
]
]
},
"b8dd0104-33f0-427b-907e-c71cd7366c39": {
"main": [
[
{
"node": "116053e4-cf92-4e90-a817-e54744a511c8",
"type": "main",
"index": 0
}
]
]
},
"957b3e0e-4163-4bc4-a72b-538cc03c4158": {
"main": [
[
{
"node": "86de386e-02a5-401c-862b-f034ac530a7e",
"type": "main",
"index": 0
}
]
]
},
"89ee7c6d-9af1-4406-9e55-1d555be8c69b": {
"main": [
[
{
"node": "06b06b67-849a-4881-ba06-0ea2428789dd",
"type": "main",
"index": 0
}
]
]
},
"cbe7c270-a0eb-4107-ac7d-1b0c5a1423c8": {
"main": [
[
{
"node": "871834d2-510f-4b1c-82bb-3159e123ea68",
"type": "main",
"index": 0
}
]
]
},
"06e6eebe-a394-4135-99f3-d1d4da03d62a": {
"main": [
[
{
"node": "03925ec9-70a1-4a8e-94f9-1cd358d119a4",
"type": "main",
"index": 0
}
]
]
},
"871834d2-510f-4b1c-82bb-3159e123ea68": {
"main": [
[
{
"node": "e4b66790-4ffb-4605-a831-fe0a34c6745d",
"type": "main",
"index": 0
}
]
]
},
"06b06b67-849a-4881-ba06-0ea2428789dd": {
"main": [
[
{
"node": "d2e6ff58-1af5-486c-aa84-52ab8e4f9824",
"type": "main",
"index": 0
}
]
]
},
"86de386e-02a5-401c-862b-f034ac530a7e": {
"main": [
[
{
"node": "b8dd0104-33f0-427b-907e-c71cd7366c39",
"type": "main",
"index": 2
}
]
]
},
"6d8947d0-ca54-4036-bb15-77152ed4bf8b": {
"main": [
[]
]
},
"03925ec9-70a1-4a8e-94f9-1cd358d119a4": {
"main": [
[
{
"node": "b8dd0104-33f0-427b-907e-c71cd7366c39",
"type": "main",
"index": 0
}
]
]
},
"e4b66790-4ffb-4605-a831-fe0a34c6745d": {
"main": [
[
{
"node": "b8dd0104-33f0-427b-907e-c71cd7366c39",
"type": "main",
"index": 1
}
]
]
},
"116053e4-cf92-4e90-a817-e54744a511c8": {
"main": [
[
{
"node": "5ac35644-fdd6-42f8-9e6f-86ada4386e80",
"type": "main",
"index": 0
}
]
]
},
"5ac35644-fdd6-42f8-9e6f-86ada4386e80": {
"main": [
[
{
"node": "89ee7c6d-9af1-4406-9e55-1d555be8c69b",
"type": "main",
"index": 0
},
{
"node": "6d8947d0-ca54-4036-bb15-77152ed4bf8b",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 시장 조사, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
주제 사냥꾼 템플릿
사용자 Gemini를 통해 Reddit, YouTube, X에서 내용 전략 보고서 생성
If
Set
Code
+
If
Set
Code
34 노드Sheryl
시장 조사
다 사이트 제품 가격 모니터링: Claude-Sonnet, Google Sheets, Telegram 알림
Firecrawl, Claude-Sonnet AI와 Telegram 알림을 사용한 전자상거래 가격 모니터링 시스템
Code
Wait
Merge
+
Code
Wait
Merge
19 노드Cheng Siong Chin
시장 조사
리드 생성 및 이메일 워크플로
Google 지도, SendGrid 및 AI를 사용한 B2B 잠재 고객 개발 및 이메일 마케팅 자동화
If
Set
Code
+
If
Set
Code
141 노드Ezema Kingsley Chibuzo
리드 생성
저의 콜드 이메일 생성기
Anthropic, GPT-4, 구글 스프레드시트를 사용하여 개인화된 콜드 이메일을 생성
If
Set
Code
+
If
Set
Code
24 노드Bhuvanesh R
리드 육성
01 AI 미디어 바이어를 사용한 Facebook 광고 성과 분석 및 Google Sheets로 인사이트 전송
Gemini AI를 사용한 Facebook 광고 분석 및 Google Sheets로 인사이트 전송
If
Set
Code
+
If
Set
Code
34 노드JJ Tham
시장 조사
전체 시작 개요
Extruct.ai에서 Google Sheets로의 스타트업 연구 및 프로파일링 자동화
If
Set
Code
+
If
Set
Code
13 노드Extruct AI
시장 조사
워크플로우 정보
난이도
고급
노드 수25
카테고리2
노드 유형10
저자
Bhuvanesh R
@bhuvaneshI partner with businesses to design AI voice agents and automation systems. Let's connect on LinkedIn to discuss your AI integration and automation needs.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유