Créer des résumés de renseignements IA à partir de newsletters en utilisant Gemini, Slack et Notion
Ceci est unMiscellaneous, AI Summarization, Multimodal AIworkflow d'automatisation du domainecontenant 19 nœuds.Utilise principalement des nœuds comme Set, Code, Gmail, Slack, Filter. Créer des résumés de renseignements générés par l'IA à partir de newsletters avec Gemini, Slack et Notion
- •Compte Google et informations d'identification Gmail API
- •Token Bot Slack ou URL Webhook
- •Clé API Notion
Nœuds utilisés (19)
Catégorie
{
"meta": {
"instanceId": "2b4a3d81eafa60e4b2dfa202fdf88e491b785e2a2a6ca005b137d831a6faa7c0",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "2755b9eb-352a-447f-9960-d34fb4905045",
"name": "Obtenir les newsletters étiquetées",
"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": "Combiner toutes les newsletters",
"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": "Analyste de newsletter IA",
"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": "Déclencheur quotidien matinal",
"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": "Filtrer les résultats vides",
"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": "Formater pour 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": "Envoyer vers 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": "Modèle de chat 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": "Modèle d'analyseur de sortie",
"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": "Extraire les questions",
"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": "Enregistrer les questions dans 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": "Outil de recherche 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": "Analyseur de sortie structurée",
"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": "Mémoire de conversation",
"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": "Configuration",
"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": "Note autocollante",
"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": "Note autocollante 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": "Note autocollante 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": "Note autocollante 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
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Divers, Résumé IA, IA Multimodale
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Harry Siggins
@harrysiggins-onetwogrowthPartager ce workflow