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
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下の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 による分析と音声メッセージの transcrição
毎日の WhatsApp グループ インタラクティブ分析:GPT-4.1 分析と音声メッセージ文字起こし
If
Set
Code
+
If
Set
Code
52 ノードDaniel Lianes
その他
PerplexityとGPTを使用して、キーワードとメディアを含むWordPressのSEO最適化ブログを作成
WordPress向けSEO最適化されたブログの作成(Perplexity、GPTベース、キーワードとメディア付き)
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
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34