10 - 비즈니스 버전 추적기
이것은Market Research, Multimodal AI분야의자동화 워크플로우로, 15개의 노드를 포함합니다.주로 If, Code, Airtable, HttpRequest, GoogleSheets 등의 노드를 사용하며. SerpAPI, Google 스프레드시트 및 Airtable을 사용한 일일 경쟁자 연구 자동화
- •Airtable API Key
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
{
"name": "10 - Business Landscape Tracker",
"tags": [],
"nodes": [
{
"id": "1be5e364-b985-4ce4-bb52-5f4d4afc8481",
"name": "🕒 자동 실행 (예약됨)",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-2040,
0
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "7e5d5597-0e13-477d-af55-2847cdd4b89c",
"name": "📄 기업 목록 시트 읽기",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1820,
0
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_HERE/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEET_ID_HERE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_HERE/edit?usp=drivesdk",
"cachedResultName": "Companies List"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_GOOGLE_SHEETS_CREDENTIAL_ID",
"name": "Google Sheets account"
}
},
"typeVersion": 4
},
{
"id": "0942f8f7-220c-48fc-bda0-43b250981475",
"name": "🧹 기업 목록 정리 및 형식화",
"type": "n8n-nodes-base.code",
"position": [
-1600,
0
],
"parameters": {
"jsCode": "const companies = [];\n\nfor (const item of $input.all()) {\n // Get company name from the correct field key: \"List\"\n const companyName = item.json.List;\n\n if (companyName && companyName.trim() !== '') {\n companies.push({\n company: companyName.trim(),\n row: item.json.row_number || companies.length + 2\n });\n }\n}\n\n// Return each company as a separate item\nreturn companies.map(company => ({ json: company }));"
},
"typeVersion": 2
},
{
"id": "dd0127ef-28ef-4928-8cdc-6cf0627ac365",
"name": "🔁 기업 목록 순환 처리",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-1380,
0
],
"parameters": {
"options": {},
"batchSize": 100
},
"typeVersion": 3
},
{
"id": "ee903349-6643-4c97-862c-bd50d2abcd8d",
"name": "🌍 기업 경쟁사 검색 (SerpAPI)",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1160,
0
],
"parameters": {
"url": "https://serpapi.com/search.json",
"options": {
"response": {
"response": {
"responseFormat": "json"
}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $json.company }} competitors"
},
{
"name": "hl",
"value": "en"
},
{
"name": "gl",
"value": "us"
},
{
"name": "api_key",
"value": "YOUR_SERPAPI_KEY_HERE"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "a5f9d7d7-a7b2-4325-bbe9-c2feb053f98a",
"name": "🧠 검색 결과에서 경쟁사 데이터 추출",
"type": "n8n-nodes-base.code",
"position": [
-940,
0
],
"parameters": {
"jsCode": "const inputData = $input.all();\nconst results = [];\n\nfor (const item of inputData) {\n const searchResults = item.json;\n\n // === Helper Functions (same as before) ===\n\n function extractCompanyName(searchData) {\n if (searchData.search_parameters?.q) {\n const query = searchData.search_parameters.q.toLowerCase();\n const cleanQuery = query\n .replace(/competitors?/gi, '')\n .replace(/competition/gi, '')\n .replace(/vs/gi, '')\n .replace(/alternatives?/gi, '')\n .trim();\n const companyName = cleanQuery.split(' ')[0];\n return companyName.charAt(0).toUpperCase() + companyName.slice(1);\n }\n\n if (searchData.organic_results?.[0]?.title) {\n const title = searchData.organic_results[0].title;\n const match = title.match(/(\\w+)\\s+competitors?/i);\n if (match) return match[1];\n }\n\n return \"Unknown Company\";\n }\n\n function extractCompetitors(searchData) {\n const competitors = new Set();\n\n if (searchData.related_questions) {\n searchData.related_questions.forEach(q => {\n q.list?.forEach(item => {\n const clean = item.replace(/\\.$/, '').trim();\n if (clean.length > 1) competitors.add(clean);\n });\n });\n }\n\n if (searchData.ai_overview?.text_blocks) {\n searchData.ai_overview.text_blocks.forEach(block => {\n block.list?.forEach(item => {\n const clean = item.title?.replace(/:$/, '').trim();\n if (clean?.length > 1) competitors.add(clean);\n });\n });\n }\n\n if (searchData.organic_results) {\n searchData.organic_results.forEach(result => {\n const snippet = result.snippet;\n if (snippet) {\n const patterns = [\n /competitors?[^.]*?include[^.]*?([A-Z][a-zA-Z\\s,&.]+)/gi,\n /rivals?[^.]*?include[^.]*?([A-Z][a-zA-Z\\s,&.]+)/gi,\n /competition[^.]*?from[^.]*?([A-Z][a-zA-Z\\s,&.]+)/gi\n ];\n patterns.forEach(pattern => {\n const matches = snippet.match(pattern);\n if (matches) {\n matches.forEach(match => {\n match\n .split(/,|\\sand\\s|&/)\n .map(name => name.replace(/[^a-zA-Z\\s]/g, '').trim())\n .forEach(name => {\n if (name.length > 2 && !name.toLowerCase().includes('competitor'))\n competitors.add(name);\n });\n });\n }\n });\n }\n });\n }\n\n if (searchData.answer_box?.expanded_list) {\n searchData.answer_box.expanded_list.forEach(item => {\n if (item.title) competitors.add(item.title);\n });\n }\n\n return Array.from(competitors).slice(0, 10);\n }\n\n function getTopSource(searchData) {\n return searchData.organic_results?.[0]?.link || null;\n }\n\n // === Main Logic ===\n try {\n const company = extractCompanyName(searchResults);\n const competitorsList = extractCompetitors(searchResults);\n const topSource = getTopSource(searchResults);\n\n results.push({\n json: {\n company,\n competitors: competitorsList.join(', ') || 'No competitors found',\n competitor_count: competitorsList.length,\n top_source: topSource,\n search_query: searchResults.search_parameters?.q || 'N/A',\n total_results: searchResults.search_information?.total_results || 0,\n extraction_timestamp: new Date().toISOString()\n }\n });\n } catch (err) {\n results.push({\n json: {\n error: `Extraction failed: ${err.message}`,\n company: \"Unknown\",\n competitors: \"\",\n competitor_count: 0,\n top_source: null\n }\n });\n }\n}\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "20193daa-c689-4311-ad39-9f696794712d",
"name": "🧐 경쟁사 존재 여부 확인",
"type": "n8n-nodes-base.if",
"position": [
-720,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8a7b6c5d-4321-0987-6543-210fedcba987",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.competitors }}",
"rightValue": "No competitors found"
}
]
}
},
"typeVersion": 2
},
{
"id": "1f513736-3963-4045-9eaa-4df3cebfc0e3",
"name": "📊 결과 시트에 기록",
"type": "n8n-nodes-base.googleSheets",
"position": [
-500,
-100
],
"parameters": {
"columns": {
"value": {
"Source": "={{ $json.top_source }}",
"Company": "={{ $json.company }}",
"Competitors": "={{ $json.competitors }}",
"Total Results": "={{ $json.total_results }}"
},
"schema": [
{
"id": "Company",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Competitors",
"type": "string",
"display": true,
"required": false,
"displayName": "Competitors",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Results",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Total Results",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Source",
"type": "string",
"display": true,
"required": false,
"displayName": "Source",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Company"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"useAppend": true,
"cellFormat": "USER_ENTERED"
},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_RESULTS_GOOGLE_SHEET_ID_HERE/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_RESULTS_GOOGLE_SHEET_ID_HERE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_RESULTS_GOOGLE_SHEET_ID_HERE/edit?usp=drivesdk",
"cachedResultName": "Companies Result"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_GOOGLE_SHEETS_CREDENTIAL_ID",
"name": "Google Sheets account"
}
},
"typeVersion": 4
},
{
"id": "d39b91c7-a3c0-45eb-b926-2d668262a899",
"name": "❌ 결과 없는 기업 기록",
"type": "n8n-nodes-base.googleSheets",
"position": [
-500,
100
],
"parameters": {
"columns": {
"value": {
"Source": "Null",
"Company": "={{ $json.company }}",
"Competitors": "No Competetitors Found",
"Total Results": "0"
},
"schema": [
{
"id": "Company",
"type": "string",
"display": true,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Competitors",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Competitors",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Results",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Total Results",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Source",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Source",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"useAppend": true,
"cellFormat": "USER_ENTERED"
},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_RESULTS_GOOGLE_SHEET_ID_HERE/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_RESULTS_GOOGLE_SHEET_ID_HERE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_RESULTS_GOOGLE_SHEET_ID_HERE/edit?usp=drivesdk",
"cachedResultName": "Companies Result"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_GOOGLE_SHEETS_CREDENTIAL_ID",
"name": "Google Sheets account"
}
},
"typeVersion": 4
},
{
"id": "7910cb3e-88e7-4716-82ad-89bec10409a8",
"name": "🗃️ Airtable에 동기화",
"type": "n8n-nodes-base.airtable",
"position": [
-280,
0
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "YOUR_AIRTABLE_BASE_ID_HERE",
"cachedResultUrl": "https://airtable.com/YOUR_AIRTABLE_BASE_ID_HERE",
"cachedResultName": "Test"
},
"table": {
"__rl": true,
"mode": "list",
"value": "YOUR_AIRTABLE_TABLE_ID_HERE",
"cachedResultUrl": "https://airtable.com/YOUR_AIRTABLE_BASE_ID_HERE/YOUR_AIRTABLE_TABLE_ID_HERE",
"cachedResultName": "Table 1"
},
"columns": {
"value": {
"Source": "={{ $json.Source }}",
"Company": "={{ $json.Company }}",
"Competitors": "={{ $json.Competitors }}",
"Total Results": "={{ $json[\"Total Results\"] }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Competitors",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Competitors",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Results",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Total Results",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Source",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Source",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Company"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "upsert"
},
"credentials": {
"airtableTokenApi": {
"id": "YOUR_AIRTABLE_CREDENTIAL_ID",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "b299cf8f-6b5e-48f2-adb4-2794ad4220aa",
"name": "스티커 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2140,
-340
],
"parameters": {
"color": 5,
"width": 280,
"height": 640,
"content": "## Auto Run (Scheduled)\n\n**Description:**\n\n⏰ This is the starting point of the workflow. It runs automatically based on your configured schedule—no manual trigger needed."
},
"typeVersion": 1
},
{
"id": "e21ba623-5589-4781-a131-31afbee80431",
"name": "스티커 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1840,
-340
],
"parameters": {
"color": 3,
"width": 600,
"height": 640,
"content": "## Loop Over Companies\n\n**Description:**\n\n📋 Fetch companies from a Google Sheet (List column).\n\n🧹 Clean and format data, removing empty entries and attaching row numbers.\n\n🔁 Send companies into the flow using a Lopp Over node for processing.\n"
},
"typeVersion": 1
},
{
"id": "38ce6a00-5b57-47a2-9cce-e2deaa67e285",
"name": "스티커 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1220,
-340
],
"parameters": {
"color": 4,
"width": 220,
"height": 640,
"content": "## Search Company Competitors (SerpAPI)\n\n**Description:**\n\n🔍 For each company, this node sends a GET request to SerpAPI with the query {company} competitors, returning structured search result JSON for further parsing."
},
"typeVersion": 1
},
{
"id": "78b206db-221d-426c-aa15-1115c2266cc8",
"name": "스티커 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-980,
-340
],
"parameters": {
"width": 420,
"height": 640,
"content": "## Extract & Check Competitors\n\n**Description:**\n\nExtracts the company name, up to 10 competitors, and top source from SerpAPI results.\nThen checks if any competitors were found:\n\n✅ Yes → Send to Google Sheet + Airtable\n\n❌ No → Log as failed search"
},
"typeVersion": 1
},
{
"id": "6ef49329-b2a7-44ad-9226-d2c61dc996e7",
"name": "스티커 노트4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-540,
-340
],
"parameters": {
"color": 6,
"width": 460,
"height": 640,
"content": "## Log Results to Sheets & Airtable\n\n**Description:**\n\nLogs successful competitor data to Google Sheets ✅\n\nLogs failed searches separately ❌\n\nBoth flows sync to Airtable for unified storage 📥"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"connections": {
"20193daa-c689-4311-ad39-9f696794712d": {
"main": [
[
{
"node": "1f513736-3963-4045-9eaa-4df3cebfc0e3",
"type": "main",
"index": 0
}
],
[
{
"node": "d39b91c7-a3c0-45eb-b926-2d668262a899",
"type": "main",
"index": 0
}
]
]
},
"1f513736-3963-4045-9eaa-4df3cebfc0e3": {
"main": [
[
{
"node": "7910cb3e-88e7-4716-82ad-89bec10409a8",
"type": "main",
"index": 0
}
]
]
},
"dd0127ef-28ef-4928-8cdc-6cf0627ac365": {
"main": [
[],
[
{
"node": "ee903349-6643-4c97-862c-bd50d2abcd8d",
"type": "main",
"index": 0
}
]
]
},
"7e5d5597-0e13-477d-af55-2847cdd4b89c": {
"main": [
[
{
"node": "0942f8f7-220c-48fc-bda0-43b250981475",
"type": "main",
"index": 0
}
]
]
},
"1be5e364-b985-4ce4-bb52-5f4d4afc8481": {
"main": [
[
{
"node": "7e5d5597-0e13-477d-af55-2847cdd4b89c",
"type": "main",
"index": 0
}
]
]
},
"0942f8f7-220c-48fc-bda0-43b250981475": {
"main": [
[
{
"node": "dd0127ef-28ef-4928-8cdc-6cf0627ac365",
"type": "main",
"index": 0
}
]
]
},
"d39b91c7-a3c0-45eb-b926-2d668262a899": {
"main": [
[
{
"node": "7910cb3e-88e7-4716-82ad-89bec10409a8",
"type": "main",
"index": 0
}
]
]
},
"a5f9d7d7-a7b2-4325-bbe9-c2feb053f98a": {
"main": [
[
{
"node": "20193daa-c689-4311-ad39-9f696794712d",
"type": "main",
"index": 0
}
]
]
},
"ee903349-6643-4c97-862c-bd50d2abcd8d": {
"main": [
[
{
"node": "a5f9d7d7-a7b2-4325-bbe9-c2feb053f98a",
"type": "main",
"index": 0
}
]
]
}
}
}이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 시장 조사, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Avkash Kakdiya
@itechnotion🚀 Founder of iTechNotion — we build custom AI-powered automation workflows for startups, agencies, and founders. 💡 Specializing in agentic AI systems, content automation, sales funnels, and digital workers. 🔧 14+ years in tech | Building scalable no-code/low-code solutions using n8n, OpenAI, and other API-first tools. 📬 Let’s automate what slows you down.
이 워크플로우 공유