Gemini, Slack, Notion을 사용하여 뉴스 요약에서 AI 정보 요약을 생성
고급
이것은Miscellaneous, AI Summarization, Multimodal AI분야의자동화 워크플로우로, 19개의 노드를 포함합니다.주로 Set, Code, Gmail, Slack, Filter 등의 노드를 사용하며. Gemini, Slack, 및 Notion을 사용하여 뉴스 브리핑에서 AI 정보 요약을 생성
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •Slack Bot Token 또는 Webhook URL
- •Notion API Key
사용된 노드 (19)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "2b4a3d81eafa60e4b2dfa202fdf88e491b785e2a2a6ca005b137d831a6faa7c0",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "2755b9eb-352a-447f-9960-d34fb4905045",
"name": "라벨링된 뉴스레터 가져오기",
"type": "n8n-nodes-base.gmail",
"notes": "Fetches emails with your specified label from the last 24 hours",
"position": [
288,
384
],
"webhookId": "bf88d99c-1bea-4f19-9ef5-3c0a59eb862c",
"parameters": {
"limit": 20,
"simple": false,
"filters": {
"labelIds": [
"YOUR_GMAIL_LABEL_ID"
],
"receivedAfter": "={{ $today.minus(1, 'days') }}"
},
"options": {},
"operation": "getAll"
},
"credentials": {
"gmailOAuth2": {
"id": "yvJI2wRBiA9DGTL4",
"name": "Gmail account"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "b53fe8a3-8cc6-4343-ad86-6d64ca6b4e72",
"name": "모든 뉴스레터 결합",
"type": "n8n-nodes-base.aggregate",
"notes": "Combines all newsletter emails into a single item for AI processing",
"position": [
736,
384
],
"parameters": {
"include": "specifiedFields",
"options": {},
"aggregate": "aggregateAllItemData",
"fieldsToInclude": "headers.from, subject, textAsHtml",
"destinationFieldName": "newsletter"
},
"typeVersion": 1
},
{
"id": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
"name": "AI 뉴스레터 분석가",
"type": "@n8n/n8n-nodes-langchain.agent",
"notes": "AI agent that analyzes newsletters and generates insights based on your configuration",
"position": [
1024,
384
],
"parameters": {
"text": "=Analyze today's newsletters and create a comprehensive brief for {{ $('Configuration').item.json.recipient_name }}.\n\n## Context\n{{ $('Configuration').item.json.business_context }}\n\n## Task 1: Executive Summary\nFrom today's newsletters, identify 3-5 developments that matter for {{ $('Configuration').item.json.target_audience }}. For each:\n\n**[Development Title]**\n- TL;DR: [2-3 sentences explaining what this is about]\n- Why this matters: [1-2 sentences on real business impact for your audience]\n- Implementation reality: [What it would actually take to adopt this]\n- Source: [Newsletter sender name]\n\nOnly include developments that pass this test: {{ $('Configuration').item.json.relevance_filter }}\n\nAs part of the executive summary, include a short tl;dr that should be maximum of 1-2 sentences summarizing all the developments you extract.\n\n## Task 2: Content-Inspiring Questions\nGenerate 3-4 questions that could become {{ $('Configuration').item.json.content_platforms }} content. Each question should:\n- Connect to real operational challenges\n- Bridge technical capability and business reality\n- Feel non-obvious but highly relevant\n\nFormat:\n**Question:** [Concise, thought-provoking question]\n**Context:** [1 sentence on why this question matters now, referencing specific newsletter content]\n**Relevant Content Pillar:** [name of the content pillar this relates to]\n\n## Task 3: Hidden Patterns\nBrief note on any patterns across multiple newsletters that suggest an emerging theme your audience should track.\n\nRemember: Filter aggressively. If something is just \"interesting\" but not actionable for your specific audience, exclude it. Focus on signal, not noise.\n\n## Content to analyze\n\nHere are the newsletters and their content: {{ \n$json.newsletter.map(item => \n `Subject: \"${item.subject}\"\nFull content follows:\n${item.textAsHtml}`\n).join('\\\\n\\\\n==========\\\\n\\\\n')\n}}",
"options": {
"systemMessage": "=You are an AI intelligence analyst for {{ $('Configuration').item.json.company_name }}, helping to filter the daily flood of newsletters through a specific operational lens.\n\n## Core Context\n\n### Who You Serve\n{{ $('Configuration').item.json.target_audience_description }}\n\n### Your Unique Perspective\nYou view information through three interconnected lenses:\n1. **Operational Reality**: How does this actually work in a running business?\n2. **Technical Feasibility**: What's required to implement this at scale?\n3. **Human Dynamics**: How will teams actually adopt and use this?\n\n### Content Focus Areas\n{{ $('Configuration').item.json.content_pillars }}\n\n## Processing Framework\n\nWhen analyzing newsletters and updates:\n\n### Relevance Filter\nINCLUDE information about:\n- New capabilities that could change how operations work (not just make them faster)\n- Implementation patterns from companies in the {{ $('Configuration').item.json.company_size_range }} range\n- Tools or frameworks that bridge technical capability and business operations\n- Real implementation case studies (not just press releases)\n- {{ $('Configuration').item.json.additional_include_criteria }}\n\nEXCLUDE information about:\n- Pure research advances without clear operational application\n- Consumer products without business applications\n- Generic tool updates that are just feature additions\n- {{ $('Configuration').item.json.additional_exclude_criteria }}\n\n### Analysis Depth\nFor each relevant item, consider:\n- What operational problem does this actually solve?\n- What would implementing this require (people, process, technology)?\n- How does this connect to what {{ $('Configuration').item.json.target_audience }} are already doing?\n\nIf needed, and really only in cases where you feel it's required, you can use the Perplexity tool to find additional information. Be efficient in your use.\n\n## Output Requirements\n\n### Executive Summary Structure\n- Lead with operational impact, not technical innovation\n- Connect developments to specific challenges your audience faces\n- Use concrete examples over abstract possibilities\n- Maintain calm clarity - no breathless hype\n- Maximum 3-5 key developments per day (quality over quantity)\n- Keep language free of jargon and accessible\n- Go for conciseness while including essential information\n\n### Question Generation Philosophy\nCreate questions that:\n- Bridge the gap between potential and operational reality\n- Challenge conventional thinking\n- Explore practical implementation tensions\n- Address the \"how\" after others cover the \"what\"\n- Connect capabilities to business outcomes\n- Use clear, accessible language without corporate jargon\n\nQuestions should feel like they come from someone who has actually worked in this space, not someone theorizing about it.\n\nRemember: Your audience needs insights that are worth their precious mental space during commutes and reflection time."
},
"promptType": "define",
"hasOutputParser": true
},
"retryOnFail": true,
"typeVersion": 2.2
},
{
"id": "c1986c22-9219-4dd0-8c59-88d618f06065",
"name": "매일 아침 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"notes": "Runs daily at 8am UTC - adjust timezone as needed",
"position": [
-176,
384
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * *"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "111aea15-2a77-4326-b132-58d6ab8d054a",
"name": "빈 결과 필터링",
"type": "n8n-nodes-base.filter",
"notes": "Only proceeds if emails were found",
"position": [
512,
384
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9fda51d9-feb0-464d-9ab7-a8d32b4654a3",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "3da6d119-88a4-49ad-9af1-c82e6dc3deb2",
"name": "Slack 형식 지정",
"type": "n8n-nodes-base.code",
"notes": "Converts AI analysis to rich Slack Block Kit format",
"position": [
1424,
288
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// Format the structured AI analysis for Slack Block Kit\nconst data = $input.item.json;\nconst analysis = Array.isArray(data) ? data[0].output : (data.output || data);\nconst config = $('Configuration').item.json;\n\n// Helper function to format date nicely\nconst formatDate = (dateStr) => {\n const date = dateStr ? new Date(dateStr) : new Date();\n return date.toLocaleDateString('en-US', { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n });\n};\n\n// Helper to truncate text to avoid Slack's block limits\nconst truncateText = (text, maxLength = 3000) => {\n if (text && text.length > maxLength) {\n return text.substring(0, maxLength - 3) + '...';\n }\n return text || '';\n};\n\n// Use the TLDR from the AI agent or create a fallback\nlet tldrSummary = \"\";\nif (analysis.executive_summary?.tldr) {\n tldrSummary = analysis.executive_summary.tldr;\n} else if (analysis.executive_summary?.developments && analysis.executive_summary.developments.length > 0) {\n const devCount = analysis.executive_summary.developments.length;\n const topics = analysis.executive_summary.developments\n .slice(0, 2)\n .map(dev => dev.title.split(' ').slice(0, 4).join(' '))\n .join(\" and \");\n tldrSummary = `${devCount} key developments today: ${topics}. Focus on signal over noise.`;\n} else {\n tldrSummary = \"No developments met our strict relevance criteria today. This is valuable signal - not every day brings operationally relevant news.\";\n}\n\n// Build the blocks array\nlet blocks = [\n {\n \"type\": \"header\",\n \"text\": {\n \"type\": \"plain_text\",\n \"text\": `📰 | ${config.brief_title || 'Intelligence Brief'}`\n }\n },\n {\n \"type\": \"context\",\n \"elements\": [\n {\n \"text\": `📅 ${formatDate(analysis.metadata?.date_analyzed)} | 👤 ${config.recipient_name || 'Team'}`,\n \"type\": \"mrkdwn\"\n }\n ]\n },\n {\n \"type\": \"divider\"\n },\n {\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"📢 | *TL;DR*\"\n }\n },\n {\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": truncateText(tldrSummary, 3000)\n }\n },\n {\n \"type\": \"divider\"\n }\n];\n\n// Add news summary if we have developments\nif (analysis.executive_summary?.developments && analysis.executive_summary.developments.length > 0) {\n blocks.push({\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"📰 | *KEY DEVELOPMENTS*\"\n }\n });\n\n // Build rich text elements for each development\n let richTextElements = [];\n \n analysis.executive_summary.developments.forEach((dev, index) => {\n // Add title with source\n richTextElements.push({\n \"type\": \"rich_text_section\",\n \"elements\": [\n {\n \"type\": \"text\",\n \"text\": `${dev.title}`,\n \"style\": {\n \"code\": true\n }\n },\n {\n \"type\": \"text\",\n \"text\": ` - ${dev.source || 'Newsletter'}`,\n \"style\": {\n \"italic\": true\n }\n },\n {\n \"type\": \"text\",\n \"text\": \"\\n\"\n }\n ]\n });\n \n // Add content in quote block \n richTextElements.push({\n \"type\": \"rich_text_quote\",\n \"elements\": [\n {\n \"type\": \"text\",\n \"text\": \"TL;DR:\",\n \"style\": {\n \"bold\": true\n }\n },\n {\n \"type\": \"text\",\n \"text\": `\\n${truncateText(dev.tldr_development, 500)}\\n\\n`\n },\n {\n \"type\": \"text\",\n \"text\": \"Why it matters:\",\n \"style\": {\n \"bold\": true\n }\n },\n {\n \"type\": \"text\",\n \"text\": `\\n${truncateText(dev.operational_impact, 500)}\\n\\n`\n },\n {\n \"type\": \"text\",\n \"text\": \"Implementation Reality:\",\n \"style\": {\n \"bold\": true\n }\n },\n {\n \"type\": \"text\",\n \"text\": `\\n${truncateText(dev.implementation_reality, 500)}\\n\\n`\n }\n ]\n });\n \n // Add separator between items (except after last item)\n if (index < analysis.executive_summary.developments.length - 1) {\n richTextElements.push({\n \"type\": \"rich_text_section\",\n \"elements\": [\n {\n \"type\": \"text\",\n \"text\": \"\\n\"\n }\n ]\n });\n }\n });\n \n richTextElements.push({\n \"type\": \"rich_text_section\",\n \"elements\": []\n });\n \n blocks.push({\n \"type\": \"rich_text\",\n \"elements\": richTextElements\n });\n \n blocks.push({\n \"type\": \"divider\"\n });\n}\n\n// Add content questions if we have them\nif (analysis.content_questions && analysis.content_questions.length > 0) {\n blocks.push({\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"🤔 | *CONTENT INSPIRATION*\"\n }\n });\n \n let questionElements = [];\n \n analysis.content_questions.forEach((q, index) => {\n questionElements.push({\n \"type\": \"rich_text_quote\",\n \"elements\": [\n {\n \"type\": \"text\",\n \"text\": `\"${truncateText(q.question, 500)}\"\\n\\n`,\n \"style\": {\n \"bold\": true\n }\n },\n {\n \"type\": \"text\",\n \"text\": truncateText(q.context, 500),\n \"style\": {\n \"italic\": true\n }\n }\n ]\n });\n \n if (q.content_pillar) {\n questionElements.push({\n \"type\": \"rich_text_section\",\n \"elements\": [\n {\n \"type\": \"text\",\n \"text\": `📁 Content Pillar: ${q.content_pillar}`,\n \"style\": {\n \"italic\": true\n }\n }\n ]\n });\n }\n \n if (index < analysis.content_questions.length - 1) {\n questionElements.push({\n \"type\": \"rich_text_section\",\n \"elements\": [\n {\n \"type\": \"text\",\n \"text\": \"\\n\"\n }\n ]\n });\n }\n });\n \n questionElements.push({\n \"type\": \"rich_text_section\",\n \"elements\": []\n });\n \n blocks.push({\n \"type\": \"rich_text\",\n \"elements\": questionElements\n });\n \n blocks.push({\n \"type\": \"divider\"\n });\n}\n\n// Add hidden patterns if present\nif (analysis.hidden_patterns?.pattern) {\n blocks.push({\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"🔍 | *EMERGING PATTERN*\"\n }\n });\n \n blocks.push({\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": `_${truncateText(analysis.hidden_patterns.pattern, 3000)}_`\n }\n });\n \n if (analysis.hidden_patterns.relevance) {\n blocks.push({\n \"type\": \"context\",\n \"elements\": [\n {\n \"type\": \"mrkdwn\",\n \"text\": `*Relevance:* ${truncateText(analysis.hidden_patterns.relevance, 2900)}`\n }\n ]\n });\n }\n \n blocks.push({\n \"type\": \"divider\"\n });\n}\n\n// Add footer\nblocks.push({\n \"type\": \"context\",\n \"elements\": [\n {\n \"type\": \"mrkdwn\",\n \"text\": `_${config.footer_message || 'Focus on signal, not noise. Make informed decisions.'}_`\n }\n ]\n});\n\n// Add stats if available\nif (analysis.metadata) {\n let statsText = \"\";\n \n if (analysis.metadata.total_developments) {\n statsText += `📊 ${analysis.metadata.total_developments} developments analyzed`;\n \n if (analysis.executive_summary?.developments?.length) {\n statsText += `, ${analysis.executive_summary.developments.length} passed relevance threshold`;\n }\n }\n \n if (analysis.metadata.newsletter_count) {\n if (statsText) statsText += \" | \";\n statsText += `📧 ${analysis.metadata.newsletter_count} newsletters processed`;\n }\n \n if (statsText) {\n blocks.push({\n \"type\": \"context\",\n \"elements\": [\n {\n \"type\": \"mrkdwn\",\n \"text\": `_${statsText}_`\n }\n ]\n });\n }\n}\n\nconst blockKitJson = {\n \"blocks\": blocks\n};\n\nreturn {\n blocksUi: JSON.stringify(blockKitJson),\n rawBlocks: blocks,\n blockKitObject: blockKitJson,\n hasContent: (analysis.executive_summary?.developments?.length > 0) || \n (analysis.content_questions?.length > 0) || \n analysis.hidden_patterns?.pattern,\n developmentCount: analysis.executive_summary?.developments?.length || 0,\n questionCount: analysis.content_questions?.length || 0,\n metadata: analysis.metadata\n};"
},
"typeVersion": 2
},
{
"id": "76e03f5c-553a-4b15-9fc4-171d45300c60",
"name": "Slack로 전송",
"type": "n8n-nodes-base.slack",
"notes": "Sends formatted brief to your Slack channel",
"position": [
1648,
288
],
"webhookId": "0ff2b8f9-344a-4f43-9fd7-b8149a5d5ca9",
"parameters": {
"text": "Daily Newsletter Brief",
"select": "channel",
"blocksUi": "={{ $json.blocksUi }}",
"channelId": {
"__rl": true,
"mode": "id",
"value": "YOUR_SLACK_CHANNEL_ID"
},
"messageType": "block",
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "I1AdBji1W6jc0rm7",
"name": "Slack account"
}
},
"typeVersion": 2.3
},
{
"id": "314f38f4-0663-417a-a811-c3ab59df9186",
"name": "OpenRouter 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"notes": "Primary AI model for newsletter analysis",
"position": [
880,
624
],
"parameters": {
"model": "google/gemini-2.5-flash",
"options": {}
},
"credentials": {
"openRouterApi": {
"id": "bA9Ec45f0B7Bpa10",
"name": "OpenRouter"
}
},
"typeVersion": 1
},
{
"id": "bfbc76fb-5ca3-4801-8b1a-1534bf45e7c1",
"name": "출력 파서 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"notes": "Model for structured output parsing",
"position": [
1296,
816
],
"parameters": {
"model": "google/gemini-2.5-flash",
"options": {}
},
"credentials": {
"openRouterApi": {
"id": "bA9Ec45f0B7Bpa10",
"name": "OpenRouter"
}
},
"typeVersion": 1
},
{
"id": "0d990fe0-495c-4967-b53c-480f84f301b2",
"name": "질문 분리",
"type": "n8n-nodes-base.splitOut",
"notes": "Separates content questions for individual processing",
"position": [
1424,
480
],
"parameters": {
"options": {},
"fieldToSplitOut": "output.content_questions"
},
"typeVersion": 1
},
{
"id": "bd52e7e9-c35e-4e8e-bf50-d6945bb02891",
"name": "질문을 Notion에 저장",
"type": "n8n-nodes-base.notion",
"notes": "Creates Notion pages for each content question (optional)",
"position": [
1648,
480
],
"parameters": {
"title": "={{ $json.question }}",
"blockUi": {
"blockValues": [
{
"text": {
"text": [
{
"text": "={{ $json.context }}",
"annotationUi": {
"italic": true
}
}
]
},
"richText": true
},
{
"textContent": "=Content Pillar: {{ $json.content_pillar }}"
},
{
"textContent": "=Generated from newsletter analysis on {{ $today.format('MM-dd-yyyy') }}"
}
]
},
"options": {},
"resource": "databasePage",
"databaseId": {
"__rl": true,
"mode": "id",
"value": "YOUR_NOTION_DATABASE_ID"
}
},
"credentials": {
"notionApi": {
"id": "toqwsLC7U4Kur83F",
"name": "Notion"
}
},
"typeVersion": 2.2
},
{
"id": "c4553d6c-3b7a-4018-b91d-fce030c48590",
"name": "Perplexity 연구 도구",
"type": "n8n-nodes-base.perplexityTool",
"notes": "Optional tool for the AI agent to gather additional context",
"position": [
1168,
608
],
"parameters": {
"model": "sonar-pro",
"options": {},
"messages": {
"message": [
{
"content": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('message0_Text', ``, 'string') }}"
}
]
},
"requestOptions": {}
},
"credentials": {
"perplexityApi": {
"id": "Lp8s8pOa5dCRCcUm",
"name": "Perplexity account"
}
},
"typeVersion": 1
},
{
"id": "88953eaf-035a-4c44-8d17-98432b4a5a8f",
"name": "구조화된 출력 파서",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"notes": "Ensures AI output follows the expected JSON structure",
"position": [
1296,
656
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "{\n \"executive_summary\": {\n \"tldr\": \"Quick summary across all developments\",\n \"developments\": [\n {\n \"title\": \"Development Title Here\",\n \"operational_impact\": \"Why this matters operationally\",\n \"implementation_reality\": \"What it would actually take to adopt this\",\n \"tldr_development\": \"TL;DR of the development\",\n \"source\": \"Newsletter source name\"\n }\n ]\n },\n \"content_questions\": [\n {\n \"question\": \"The thought-provoking question itself\",\n \"context\": \"Why this question matters now, with newsletter reference\",\n \"content_pillar\": \"Relevant content pillar\"\n }\n ],\n \"hidden_patterns\": {\n \"pattern\": \"Description of emerging theme across newsletters\",\n \"relevance\": \"Why this pattern matters for the audience\"\n },\n \"metadata\": {\n \"date_analyzed\": \"2024-01-20\",\n \"newsletter_count\": 2,\n \"total_developments\": 5\n }\n}"
},
"typeVersion": 1.3
},
{
"id": "fb930565-a81e-40cd-96d6-340b6bf64138",
"name": "대화 메모리",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"notes": "Maintains context across multiple AI interactions",
"position": [
1024,
704
],
"parameters": {
"contextWindowLength": 7
},
"typeVersion": 1.3
},
{
"id": "68c99298-c391-4026-b589-8f09028c5966",
"name": "구성",
"type": "n8n-nodes-base.set",
"notes": "📝 CUSTOMIZE THESE VALUES for your business and use case",
"position": [
64,
384
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "2aa9dd22-9fe1-46a4-9927-7b8a997c30af",
"name": "recipient_name",
"type": "string",
"value": "Who the brief is for (e.g., \"Tech Team\")"
},
{
"id": "f2440cb8-6076-4dac-831b-c38c489fbff8",
"name": "company_name",
"type": "string",
"value": "Your company name"
},
{
"id": "550c6854-c3c2-4aec-8c89-3e4d11dc5f7e",
"name": "business_context",
"type": "string",
"value": "What your company does/goals"
},
{
"id": "30be18e1-0242-45f7-a1da-8b20b35e7c35",
"name": "target_audience",
"type": "string",
"value": "Who you're analyzing for (e.g., \"product managers and engineering leaders\")"
},
{
"id": "39659801-9da6-4259-b07c-9d19b4bdac62",
"name": "target_audience_description",
"type": "string",
"value": "Detailed description of your audience"
},
{
"id": "91841974-0e77-4068-8568-4e762269e43e",
"name": "company_size_range",
"type": "string",
"value": "Size of companies you focus on (e.g., \"50-200 employee\")"
},
{
"id": "a4a9ad55-1817-46da-a787-4892a94f3787",
"name": "relevance_filter",
"type": "string",
"value": "The key question to filter relevant news"
},
{
"id": "4f3237ae-a44f-4594-ac3d-27d2488c0e48",
"name": "content_platforms",
"type": "string",
"value": "Where you'll use insights (e.g., \"LinkedIn posts, internal updates\")"
},
{
"id": "def78ff4-6ef5-4eeb-9c86-7f10a6d2aa0a",
"name": "content_pillars",
"type": "string",
"value": "Your main content focus areas (3 pillars)"
},
{
"id": "14fd66df-9969-4228-a68f-20e34b372e3f",
"name": "additional_include_criteria",
"type": "string",
"value": "Extra things to include in analysis"
},
{
"id": "c7906cd3-9589-4b9f-b07b-724042d2f404",
"name": "additional_exclude_criteria",
"type": "string",
"value": "Things to exclude from analysis"
},
{
"id": "0435bcaa-85b7-4ae3-8ee4-7c933e9d44ae",
"name": "brief_title",
"type": "string",
"value": "Title for your Slack briefs (e.g., \"Tech Intelligence Brief\")"
},
{
"id": "f1f74e29-fe24-4620-8def-c0e8a02b17e7",
"name": "footer_message",
"type": "string",
"value": "Footer text for your briefs"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2da8b52f-779b-4289-aa2a-2072116feb20",
"name": "스티커 메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1664,
-272
],
"parameters": {
"color": 5,
"width": 767,
"height": 1133,
"content": "## 🤖 AI-powered Newsletter Intelligence Brief\n\nThis n8n template automatically analyzes newsletters you receive and creates an intelligent brief that filters signal from noise. Perfect for busy professionals who need to stay informed without information overload.\n\n## Who's it for\n- **Busy executives and founders** who subscribe to industry newsletters but lack time to read them all\n- **Content creators and strategists** who need to spot trends and generate content ideas\n- **Team leaders** who want to share curated insights with their teams\n- **Anyone** who wants AI to help them stay informed efficiently\n\n## How it works\n1. **Daily collection**: Automatically fetches emails with your specified label from the last 24 hours\n2. **AI analysis**: Uses advanced AI to analyze content through your specific business lens\n3. **Intelligent filtering**: Only surfaces developments that meet your relevance criteria\n4. **Multi-format output**: Sends formatted briefs to Slack and optionally saves questions to Notion\n5. **Content inspiration**: Generates thought-provoking questions for your content creation\n\n## Requirements\n- **Gmail account** with newsletters labeled appropriately\n- **OpenRouter API key** for AI analysis (costs ~$0.01-0.05 per run)\n- **Slack workspace** for receiving briefs\n- **Notion account** (optional, for saving content questions)\n- **Perplexity API key** (optional, for additional research)\n\n## How to set up\n1. **Configure the workflow**: Edit the \"Configuration\" node with your business details\n2. **Set up Gmail**: Create a label for newsletters you want analyzed (Forum instructions: <https://support.google.com/mail/thread/208327636/how-do-i-automatically-label-emails?hl=en|>)\n3. **Connect credentials**: Add your API keys and OAuth connections\n4. **Customize timing**: Adjust the schedule trigger for your timezone\n5. **Test the workflow**: Run manually first to verify everything works\n\n## How to customize\n- **Change analysis focus**: Modify the Configuration node values to match your industry/audience\n- **Adjust timing**: Edit the cron expression in the trigger node\n- **Modify output format**: Update the Slack formatting code node\n- **Add more destinations**: Connect additional nodes for email, Teams, etc.\n- **Skip Notion**: Remove the Notion nodes if you don't need content question tracking\n\n## Tips for success\n- **Be specific** in your relevance criteria to avoid information overload\n- **Start with 3-5 newsletters** to test, then add more gradually\n- **Review and refine** your configuration based on the quality of results\n- **Use consistent labeling** in Gmail for reliable processing"
},
"typeVersion": 1
},
{
"id": "71e94dba-2edf-4183-874c-cfa9c35ffa5d",
"name": "스티커 메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-272
],
"parameters": {
"width": 443,
"height": 507,
"content": "## ⚙️ Setup Steps\n\n### 1. Gmail Setup\n- Create a Gmail label (e.g., \"AI-Newsletter\")\n- Apply this label to newsletters you want analyzed\n- Select the label from the dropdown options in the node.\n\n### 2. Configure Your Business Context\n- Edit the \"Configuration\" node\n- Update all values to match your business, audience, and goals\n- Be specific about your relevance criteria\n\n### 3. Connect Credentials\n- **Gmail**: OAuth2 connection for email access\n- **OpenRouter**: API key for AI models\n- **Slack**: Bot token for posting messages\n- **Notion**: API key (optional, for questions)\n- **Perplexity**: API key (optional, for research)"
},
"typeVersion": 1
},
{
"id": "1c04e69c-16cb-43b3-a952-53a7ccc3cd24",
"name": "스티커 메모2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
272
],
"parameters": {
"width": 443,
"height": 520,
"content": "## 🔧 Required Configuration\n\n### Update These Node Settings:\n1. **Get Labeled Newsletters**: Replace \"YOUR_GMAIL_LABEL_ID\" with your actual Gmail label ID (can simply select it from the dropdown)\n2. **Send to Slack**: Replace \"YOUR_SLACK_CHANNEL_ID\" with your channel ID (can simply select it from the dropdown)\n3. **Save Questions to Notion**: Replace \"YOUR_NOTION_DATABASE_ID\" with your database ID (optional) (can simply select it from the dropdown)\n4. **Daily Morning Trigger**: Adjust cron expression for your timezone\n\n### Timezone Note:\nThe trigger is set to 8am UTC. Adjust as needed:\n- 8am Pacific: \"0 15 * * *\"\n- 8am Eastern: \"0 12 * * *\"\n- 8am GMT: \"0 8 * * *\""
},
"typeVersion": 1
},
{
"id": "04f9d0ca-0bd3-4367-af91-42491570b1c6",
"name": "스티커 메모3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
-272
],
"parameters": {
"color": 2,
"width": 423,
"height": 491,
"content": "## 🚨 Important Notes\n\n### Security\n- Never hardcode API keys in nodes\n- Use n8n's credential system\n\n### Costs\n- OpenRouter: ~$0.01-0.05 per analysis\n- Perplexity: ~$0.01 per research query\n- Other services: Free tiers available\n\n### Customization\n- Start with the Configuration node\n- Test with a few newsletters first\n- Adjust prompts based on your results\n- The AI will improve with clear instructions"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"68c99298-c391-4026-b589-8f09028c5966": {
"main": [
[
{
"node": "2755b9eb-352a-447f-9960-d34fb4905045",
"type": "main",
"index": 0
}
]
]
},
"3da6d119-88a4-49ad-9af1-c82e6dc3deb2": {
"main": [
[
{
"node": "76e03f5c-553a-4b15-9fc4-171d45300c60",
"type": "main",
"index": 0
}
]
]
},
"fb930565-a81e-40cd-96d6-340b6bf64138": {
"ai_memory": [
[
{
"node": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
"type": "ai_memory",
"index": 0
}
]
]
},
"bfbc76fb-5ca3-4801-8b1a-1534bf45e7c1": {
"ai_languageModel": [
[
{
"node": "88953eaf-035a-4c44-8d17-98432b4a5a8f",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"0d990fe0-495c-4967-b53c-480f84f301b2": {
"main": [
[
{
"node": "bd52e7e9-c35e-4e8e-bf50-d6945bb02891",
"type": "main",
"index": 0
}
]
]
},
"0e35800c-542d-49b5-80eb-2900fb2bb6b3": {
"main": [
[
{
"node": "3da6d119-88a4-49ad-9af1-c82e6dc3deb2",
"type": "main",
"index": 0
},
{
"node": "0d990fe0-495c-4967-b53c-480f84f301b2",
"type": "main",
"index": 0
}
]
]
},
"c1986c22-9219-4dd0-8c59-88d618f06065": {
"main": [
[
{
"node": "68c99298-c391-4026-b589-8f09028c5966",
"type": "main",
"index": 0
}
]
]
},
"314f38f4-0663-417a-a811-c3ab59df9186": {
"ai_languageModel": [
[
{
"node": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"b53fe8a3-8cc6-4343-ad86-6d64ca6b4e72": {
"main": [
[
{
"node": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
"type": "main",
"index": 0
}
]
]
},
"2755b9eb-352a-447f-9960-d34fb4905045": {
"main": [
[
{
"node": "111aea15-2a77-4326-b132-58d6ab8d054a",
"type": "main",
"index": 0
}
]
]
},
"111aea15-2a77-4326-b132-58d6ab8d054a": {
"main": [
[
{
"node": "b53fe8a3-8cc6-4343-ad86-6d64ca6b4e72",
"type": "main",
"index": 0
}
]
]
},
"c4553d6c-3b7a-4018-b91d-fce030c48590": {
"ai_tool": [
[
{
"node": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
"type": "ai_tool",
"index": 0
}
]
]
},
"88953eaf-035a-4c44-8d17-98432b4a5a8f": {
"ai_outputParser": [
[
{
"node": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 기타, AI 요약, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
자동화된 회의 준비
GPT-5 및 Gemini 리서치를 사용한 캘린더에서 Slack까지 Attio CRM 통해 회의 자동 준비
If
Set
Code
+
If
Set
Code
39 노드Harry Siggins
AI 요약
AI 기반 회의 연구 및 일일 아젠다 (Google 캘린더, Attio CRM 및 Slack)
AI 기반 회의 연구 및 일일 아젠다: Google 캘린더, Attio CRM 및 Slack 활용
If
Set
Code
+
If
Set
Code
30 노드Harry Siggins
AI 요약
매일 WhatsApp 그룹 지능형 분석: GPT-4.1 분석 및 음성 메시지 변환
매일 WhatsApp 그룹 지능 분석: GPT-4.1 분석 및 음성 메시지 트랜스크립션
If
Set
Code
+
If
Set
Code
52 노드Daniel Lianes
기타
Perplexity와 GPT를 사용하여 WordPress에 SEO 최적화 블로그 생성, 키워드와 미디어 포함
Perplexity와 GPT를 사용하여 WordPress에 SEO 최적화 블로그를 만들어 키워드와 미디어 포함
Set
Code
Limit
+
Set
Code
Limit
124 노드Paul
콘텐츠 제작
특정 도구를 사용하여 WordPress에 SEO 최적화 블로그 생성
특정 도구를 사용하여 WordPress에 SEO 최적화 블로그 생성
Set
Code
Limit
+
Set
Code
Limit
124 노드Paul
콘텐츠 제작
심층 연구 인공지능에이전트
심층 연구 인공지능 - 자동 연구 및 Notion 보고서 생성기
Set
Code
Filter
+
Set
Code
Filter
43 노드Aziz B
시장 조사
워크플로우 정보
난이도
고급
노드 수19
카테고리3
노드 유형15
저자
Harry Siggins
@harrysiggins-onetwogrowth외부 링크
n8n.io에서 보기 →
이 워크플로우 공유