AutomationFlowsAI & RAG › Create Ai-curated Tech News Digests with Gpt-4.1 Mini and Notion Database

Create Ai-curated Tech News Digests with Gpt-4.1 Mini and Notion Database

Bymoosa @moosa on n8n.io

This n8n workflow automates the curation of a daily tech and startup news digest from articles stored in a Notion database. It filters articles from the past 24 hours, refines them using keyword matching and LLM classification, aggregates them into a single Markdown digest with…

Event trigger★★★★☆ complexityAI-powered20 nodesHTTP RequestNotionText ClassifierOpenAI ChatAgent
AI & RAG Trigger: Event Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #8665 — we link there as the canonical source.

This workflow follows the Agent → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "c6bfc0f0-ba09-47f7-9224-56581124b177",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        432,
        64
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b53c4d1d-ea67-4ef8-a637-3ed694d78845",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3136,
        368
      ],
      "parameters": {
        "url": "https://api.notion.com/v1/pages",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $item(\"0\").$node[\"Code in JavaScript2\"].json.pagePayload }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "Notion-Version",
              "value": "2022-06-28"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "046cff62-c51c-4568-91e3-b387641a6800",
      "name": "Get many database pages",
      "type": "n8n-nodes-base.notion",
      "position": [
        720,
        240
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "key": "Date|date",
              "date": "={{$now.minus({days: 1}).toISO()}}",
              "condition": "after"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "matchType": "allFilters",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "26f79f2b-1851-8054-a6af-e7106fc0ce40",
          "cachedResultUrl": "https://www.notion.so/26f79f2b18518054a6afe7106fc0ce40",
          "cachedResultName": "Tech & Startups rss feed"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "6a1e2866-d724-4ddf-92e6-124540e376b6",
      "name": "Code in JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        272
      ],
      "parameters": {
        "jsCode": "const techKeywords = [\n  \"tech\", \"startup\", \"ai\", \"openai\", \"google\", \"microsoft\", \"apple\",\n  \"iphone\", \"app\", \"software\", \"vc\", \"funding\", \"ipo\", \"venture\",\n  \"silicon valley\", \"cloud\", \"semiconductor\", \"data\", \"innovation\",\n  \"tiktok\", \"meta\", \"facebook\", \"amazon\", \"netflix\", \"snap\"\n];\n\nreturn items.filter(item => {\n  const text = (\n    (item.json.property_title || \"\") + \" \" +\n    (item.json.property_summary || \"\") + \" \" +\n    (item.json.property_full_article || \"\")\n  ).toLowerCase();\n\n  return techKeywords.some(k => text.includes(k));\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c61e26d7-22bc-4135-9d9f-49219dbdd36f",
      "name": "Text Classifier",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        1312,
        240
      ],
      "parameters": {
        "options": {},
        "inputText": "=Classify the article into one of these categories: \"Tech/Startup\" or \"Other\".\nReturn only one word: Tech/Startup or Other.\n\nTitle: {{$json.property_title}}\nSummary: {{$json.property_summary}}\nFull article: {{$json.property_full_article}}\n",
        "categories": {
          "categories": [
            {
              "category": "Other",
              "description": "not Tech/Startup"
            },
            {
              "category": "Tech/Startup",
              "description": "Tech/Startup"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "64df328e-4a0d-428c-9e6f-26cd378a3371",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1360,
        448
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "54ceedf7-a9bf-4a50-a3a8-8cdc37c0b9f8",
      "name": "Code in JavaScript1",
      "type": "n8n-nodes-base.code",
      "position": [
        1744,
        480
      ],
      "parameters": {
        "jsCode": "\nconst articles = items.map(item => item.json);\n\n// Return one array in one item\nreturn [{ json: { articles } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "13728a28-ba6e-465d-9257-2ec7cbc3a9a7",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2128,
        384
      ],
      "parameters": {
        "text": "={{ $json.articles }}",
        "options": {
          "systemMessage": "=\nYou are an expert technology editor creating a **daily curated digest** of technology and startup news.\nYou receive a list of articles as input (with titles, summaries, and links).\n\n### Your Goals:\n\n1. **Create a single daily digest page** that feels like a professional publication.\n2. **Write a short intro paragraph** summarizing the day\u2019s main themes.\n3. **Group articles by categories** (e.g., *AI & Developer Tools, Startups & Funding, Consumer Tech, Regulation, Hardware & Gadgets, Web & Internet Services*).\n\n   * Only include categories that are relevant for today\u2019s articles.\n4. **For each article**:\n\n   * Use a **bullet point format**.\n   * Write in **concise editorial style** (2\u20133 sentences max per article).\n   * Always include the **title as a link** to the article.\n5. **End with a closing note** like \u201cThat\u2019s it for today\u2019s digest.\u201d\n\n### Formatting Rules:\n\n* Use **Markdown headings** (`#`, `##`) for sections.\n* Ensure **links are clickable Markdown links**.\n* Do **not** include raw JSON, system notes, or AI meta-commentary.\n* Output should be **clean and publish-ready** for Notion.\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "d93debb8-7e57-4117-92fe-64b43501b326",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2176,
        608
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d5cd2cc9-5f16-40c7-97c4-68edbee168a3",
      "name": "Code in JavaScript2",
      "type": "n8n-nodes-base.code",
      "position": [
        2656,
        400
      ],
      "parameters": {
        "jsCode": "// Get markdown digest from AI output\nconst digest = $json[\"output\"];\nconst today = new Date().toISOString().split(\"T\")[0]; // YYYY-MM-DD\n\n// Helper: convert a markdown line into a Notion block\nfunction mdToBlock(line) {\n  line = line.trim();\n\n  // Headings\n  if (line.startsWith(\"### \")) {\n    return {\n      object: \"block\",\n      type: \"heading_3\",\n      heading_3: {\n        rich_text: [{ type: \"text\", text: { content: line.replace(/^### /, \"\") } }]\n      }\n    };\n  }\n  if (line.startsWith(\"## \")) {\n    return {\n      object: \"block\",\n      type: \"heading_2\",\n      heading_2: {\n        rich_text: [{ type: \"text\", text: { content: line.replace(/^## /, \"\") } }]\n      }\n    };\n  }\n  if (line.startsWith(\"# \")) {\n    return {\n      object: \"block\",\n      type: \"heading_1\",\n      heading_1: {\n        rich_text: [{ type: \"text\", text: { content: line.replace(/^# /, \"\") } }]\n      }\n    };\n  }\n\n  // Bulleted list\n  if (line.startsWith(\"- \")) {\n    const linkMatch = line.match(/\\[(.*?)\\]\\((.*?)\\)/);\n    let textContent = line.replace(/^- /, \"\");\n    let richText = [];\n\n    if (linkMatch) {\n      richText.push({\n        type: \"text\",\n        text: { content: linkMatch[1], link: { url: linkMatch[2] } }\n      });\n      const after = textContent.replace(linkMatch[0], \"\").trim();\n      if (after) {\n        richText.push({ type: \"text\", text: { content: \" \" + after } });\n      }\n    } else {\n      richText.push({ type: \"text\", text: { content: textContent } });\n    }\n\n    return {\n      object: \"block\",\n      type: \"bulleted_list_item\",\n      bulleted_list_item: { rich_text: richText }\n    };\n  }\n\n  // Horizontal rule\n  if (line.startsWith(\"---\")) {\n    return { object: \"block\", type: \"divider\", divider: {} };\n  }\n\n  // Regular paragraph\n  if (line.length > 0) {\n    return {\n      object: \"block\",\n      type: \"paragraph\",\n      paragraph: { rich_text: [{ type: \"text\", text: { content: line } }] }\n    };\n  }\n\n  // Empty line \u2192 blank paragraph\n  return {\n    object: \"block\",\n    type: \"paragraph\",\n    paragraph: { rich_text: [] }\n  };\n}\n\n// Convert markdown into array of Notion blocks\nconst blocks = digest.split(\"\\n\").map(mdToBlock).filter(Boolean);\n\n// Split blocks into chunks of 100\nconst chunkSize = 100;\nconst chunks = [];\nfor (let i = 0; i < blocks.length; i += chunkSize) {\n  chunks.push(blocks.slice(i, i + chunkSize));\n}\n\nreturn {\n  pagePayload: {\n    parent: { page_id: \"26f79f2b185180ffa6aded90ddd9ba4c\" }, // your parent page\n    icon: { emoji: \"\ud83d\udcf0\" },\n    cover: {\n      external: { url: \"https://upload.wikimedia.org/wikipedia/commons/6/62/Tuscankale.jpg\" }\n    },\n    properties: {\n      title: [\n        {\n          text: { content: `Tech & Startup Daily Digest \u2013 ${today}` }\n        }\n      ]\n    },\n    children: chunks[0] // first 100 blocks only\n  },\n  extraChunks: chunks.slice(1) // save rest for appending\n};\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "6caf59be-ed6b-4ac7-8699-28fd3cc0c799",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "disabled": true,
      "position": [
        448,
        384
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 20
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7a2e7407-a775-466b-8022-37836b1927f6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        -48
      ],
      "parameters": {
        "height": 576,
        "content": "## manual activation is for testing\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ba4b3f32-885b-4155-ab8e-a30530dc1f07",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        240
      ],
      "parameters": {
        "width": 208,
        "height": 128,
        "content": "## we can schedule it for daily"
      },
      "typeVersion": 1
    },
    {
      "id": "8e8e21ca-190f-491e-be20-f14861347e2e",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        16
      ],
      "parameters": {
        "height": 416,
        "content": "## date filter can be modified for desired days or may be hours to fetch articles from notion database\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3c1c0e30-ebe5-4b1b-b431-916716b822f1",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        48
      ],
      "parameters": {
        "height": 400,
        "content": "## this code does initial filtering for required articles for our these **Tech and startup** "
      },
      "typeVersion": 1
    },
    {
      "id": "adff5b0a-8745-4a2e-9325-3a165055ac91",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        32
      ],
      "parameters": {
        "width": 368,
        "height": 560,
        "content": "## more filtering for articles with text classifier model used is (gpt-4.1-mini)"
      },
      "typeVersion": 1
    },
    {
      "id": "1d4c0870-766f-453a-a2cc-dc4f38f433f1",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1696,
        352
      ],
      "parameters": {
        "height": 320,
        "content": "## combile articles in one object to pass into ai agent\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0709856a-1b2e-4c31-97c8-b4546169cf60",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2096,
        192
      ],
      "parameters": {
        "width": 304,
        "height": 544,
        "content": "## generate summaries of all articles into single article with raw notion page format"
      },
      "typeVersion": 1
    },
    {
      "id": "c36eeaae-77ee-4d73-9e2f-6879c9c1801d",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2528,
        272
      ],
      "parameters": {
        "width": 384,
        "height": 288,
        "content": "## format into correct notion page json object to pass into http node"
      },
      "typeVersion": 1
    },
    {
      "id": "5dfb71e3-db06-49a2-b3ce-ff953a00ac50",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3040,
        272
      ],
      "parameters": {
        "width": 320,
        "height": 304,
        "content": "## create notion page\n### here created for specific day"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code in JavaScript2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Text Classifier": {
      "main": [
        [],
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get many database pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Text Classifier",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Text Classifier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript2": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many database pages": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get many database pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This n8n workflow automates the curation of a daily tech and startup news digest from articles stored in a Notion database. It filters articles from the past 24 hours, refines them using keyword matching and LLM classification, aggregates them into a single Markdown digest with…

Source: https://n8n.io/workflows/8665/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Thread Extraction: Automatically detects and extracts all tweets from a provided Twitter thread (flood) link. Translation: Translates each extracted tweet into your target language using OpenAI. Rewri

Agent, OpenAI Chat, HTTP Request +3
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Agent, OpenAI Chat, OpenAI +8
AI & RAG

Telegram Redis. Uses telegramTrigger, telegram, redis, googleSheets. Event-driven trigger; 40 nodes.

Telegram Trigger, Telegram, Redis +8
AI & RAG

This n8n template uses a Telegram chatbot to conduct a Product Satisfaction Survey and fetches questions and stores answers in a Google sheet. It augments an AI Agent to ask follow-up questions to eng

Telegram Trigger, Telegram, Redis +8
AI & RAG

This n8n workflow demonstrates a simple multi-agent setup to perform the task of competitor research. It showcases how using the HTTP request tool could reduce the number of nodes needed to achieve a

OpenAI Chat, Tool Http Request, Output Parser Structured +3