This workflow corresponds to n8n.io template #12348 — we link there as the canonical source.
This workflow follows the Agent → Google Docs 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 →
{
"id": "h4WpFeL0h9sTncuh",
"name": "Automated Industry Trend Scraper & Outline Creator",
"tags": [],
"nodes": [
{
"id": "9b77ff1c-97de-4e2e-8db2-8f9ce1fab2d1",
"name": "Structured Output",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-480,
448
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "[\n {\n \"header\": \"---\",\n \"body\": \"---\"\n },\n {\n \"header\": \"---\",\n \"body\": \"---\"\n }\n]"
},
"typeVersion": 1.3
},
{
"id": "7dca1ae1-667f-497b-9e2a-e5879564b6eb",
"name": "OpenRouter",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
-624,
448
],
"parameters": {
"model": "anthropic/claude-sonnet-4.5",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "316a1bba-f2af-4910-a556-7f2665dd3316",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
640,
240
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "30b52f1e-4bc2-409a-b55b-7c0bd5062e0d",
"name": "Analyzer & Script writer",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-624,
256
],
"parameters": {
"text": "={{ $json.output.string }}",
"options": {
"systemMessage": "You are an advanced Content Intelligence Engine. You specialize in analyzing raw JSON feeds of Medium articles, filtering out noise, identifying duplicates, and restructuring the data into a high-signal digest.\n\nInput Data: You will receive a standard JSON string representing an array of article objects. Each object contains title, author, and summary.\n\nWorkflow & Logic:\n\n1. Data Cleaning & De-Duplication\n\nIdentify Duplicates: Scan for articles with identical or near-identical titles. Merge them into a single entry.\n\nSpam Detection: Aggressively identify low-value content.\n\nKeywords to flag: \"Invitation Code\", \"Discount\", \"VPN\", \"Cheap\", \"Save Money\", repetitive tool promotion.\n\nAction: Discard these entirely or relegate them to a final \"Low Signal\" bucket. Do not mix them with high-quality insights.\n\n2. Synthesis & Categorization Analyze the high-quality articles and assign them to one of these buckets:\n\n\ud83d\udc8e Must Reads: The top 3 most intellectually significant or viral stories.\n\n\ud83e\udd16 The AI Paradigm: AI's impact on work, society, and specific models (LLMs, Transformers).\n\n\ud83d\udcbb Engineering & Code: Technical tutorials, language wars, architecture, and dev careers.\n\n\ud83d\udcb0 Wealth & Markets: Finance, crypto, stock market.\n\n\ud83c\udfa8 Design & Culture: UX/UI, media, and personal essays.\n\n3. Output Formatting Rules (STRICT) You must output the final result as a single JSON Array containing objects.\n\nSchema: Every object must strictly use only the keys \"header\" and \"body\".\n\nConstraint - No Newlines (\\n): You are strictly forbidden from using newline characters inside any value. If you need to separate thoughts, list items, or articles, you must create a new object in the array.\n\nConstraint - Granularity: Do not group multiple articles into a single string. Each article must be its own independent object in the JSON array.\n\n4. Required Output Structure:\n\nItem 1: The Digest Overview (Mandatory First Object)\n\nThe very first object in the array must be the cover of the digest.\n\n\"header\": A creative title for the entire feed (e.g., \"Daily Tech Digest: [Current Date]\").\n\n\"body\": A 2-3 sentence executive summary of the entire collection of articles (e.g., \"Today's feed is dominated by the release of GPT-5 and skepticism regarding the crypto market...\").\n\nItem 2+: Category Sections\n\nCategory Header: When starting a new category, create an object with the Category Name in the \"header\" and a brief 1-sentence intro in the \"body\".\n\nArticle Items: For every article within that category, create a separate object.\n\n\"header\": Leave empty \"\" (unless it is a sub-section title).\n\n\"body\": Format as: \"Title\" by Author. [Punchy, rewritten summary].\"\n\nExample of Desired Output Format:\n\n\n[\n {\n \"header\": \"Daily Content Digest: October 24, 2025\",\n \"body\": \"Today's feed highlights a major shift in AI architecture debates and a controversial take on the German developer market. Spam levels are low, with high engagement in engineering tutorials.\"\n },\n {\n \"header\": \"\ud83d\udc8e Top 3 Must-Reads\",\n \"body\": \"Our algorithm selected these stories based on intellectual significance and viral potential.\"\n },\n {\n \"header\": \"\",\n \"body\": \"1. 'The Lie At The Heart Of The AI Revolution' by Will Lockett. A critical look at the 'nuclear age' comparison in AI narratives.\"\n },\n {\n \"header\": \"\",\n \"body\": \"2. 'Programming In Germany Is Dead' by Jan Kammerath. A viral, controversial autopsy of the German developer market.\"\n },\n {\n \"header\": \"\ud83e\udd16 The AI Paradigm\",\n \"body\": \"Several authors are questioning the actual utility versus the hype.\"\n },\n {\n \"header\": \"\",\n \"body\": \"'Why AI Gives Wrong Answers' by Sarah J. A practical guide to hallucination in 2025.\"\n },\n {\n \"header\": \"\",\n \"body\": \"'Transformers Are Dead' by Google Research. Google's new architecture might finally replace the transformer model.\"\n },\n {\n \"header\": \"\ud83d\udcbb Engineering & Code\",\n \"body\": \"Technical deep dives and framework updates.\"\n },\n {\n \"header\": \"\",\n \"body\": \"'Rails 8.1 Just Dropped' by DHH. A look at the developer-first upgrades in the new release.\"\n }\n]"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "6a521c5f-f533-4046-83fe-170b1aa73619",
"name": "Add Spacer",
"type": "n8n-nodes-base.googleDocs",
"position": [
1200,
-160
],
"parameters": {
"simple": false,
"actionsUi": {
"actionFields": [
{
"text": "=\n",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ $('Create a Document for Outlines').first().json.id }}"
},
"credentials": {
"googleDocsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "c61ed05e-a466-4d55-bad6-d00dd8ecfc1a",
"name": "Add Header & Body",
"type": "n8n-nodes-base.googleDocs",
"position": [
1472,
-160
],
"parameters": {
"simple": false,
"actionsUi": {
"actionFields": [
{
"text": "={{ $json.header }}\n",
"action": "insert"
},
{
"text": "={{ $json.body }}",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ $('Create a Document for Outlines').first().json.id }}\n"
},
"credentials": {
"googleDocsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "2d1bab1f-6ffa-43e8-bd08-7915560b295f",
"name": "Add Body",
"type": "n8n-nodes-base.googleDocs",
"position": [
1472,
32
],
"parameters": {
"simple": false,
"actionsUi": {
"actionFields": [
{
"text": "={{ $json.body }}",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ $('Create a Document for Outlines').first().json.id }}"
},
"credentials": {
"googleDocsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "55dedd48-0617-4789-bda9-6fad19c07d81",
"name": "Documentation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1904,
-320
],
"parameters": {
"width": 420,
"height": 444,
"content": "## \u26a1 Workflow Overview & Setup\n\n**Summary:** This automation periodically scrapes Medium for industry trends, uses AI to filter spam and categorize insights, and compiles a formatted digest into a Google Doc.\n\n### Requirements\n* **Credentials:** BrowserAct, OpenRouter (Claude), Google Docs, Slack.\n* **Mandatory:** BrowserAct API (Template: **Automated Industry Trend Scraper & Outline Creator**)\n\n### How to Use\n1. **Credentials:** Configure all required credentials in the n8n settings.\n2. **BrowserAct Template:** Ensure you have the **Automated Industry Trend Scraper & Outline Creator** template saved in your BrowserAct account.\n3. **Configuration:** Update the **Target Page** node to point to the specific Medium tag or archive you wish to analyze.\n\n### Need Help?\n[How to Find Your BrowserAct API Key & Workflow ID](https://docs.browseract.com)\n[How to Connect n8n to BrowserAct](https://docs.browseract.com)\n[How to Use & Customize BrowserAct Templates](https://docs.browseract.com)"
},
"typeVersion": 1
},
{
"id": "d041b38a-ec5e-4d81-98ed-be477d29d355",
"name": "Step 1 Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1456,
96
],
"parameters": {
"color": 7,
"width": 588,
"height": 112,
"content": "### \u23f0 Step 1: Schedule & Extract\n\nThe workflow triggers on a set schedule and targets a specific Medium tag URL. It then initiates a BrowserAct automation to scrape article data from the target page for analysis."
},
"typeVersion": 1
},
{
"id": "806ed69f-6711-4dc4-b70a-a6a3c8619131",
"name": "Step 2 Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-672,
-64
],
"parameters": {
"color": 7,
"width": 1084,
"height": 144,
"content": "### \ud83e\udde0 Step 2: AI Intelligence\n\nAn AI agent analyzes the raw scraped data to remove duplicates and spam. It then categorizes valid articles into specific industry segments (e.g., \"Must Reads,\" \"Engineering\") and formats them into a structured digest."
},
"typeVersion": 1
},
{
"id": "f7572f49-3bbb-4496-831d-efa37f5e767d",
"name": "Step 3 Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
-336
],
"parameters": {
"color": 7,
"width": 1052,
"height": 144,
"content": "### \ud83d\udcc4 Step 3: Digest Generation\n\nThe system creates a new Google Doc and iterates through the structured AI output. It dynamically appends headers and article summaries to the document, inserting spacers between sections for readability."
},
"typeVersion": 1
},
{
"id": "200809bb-f8c2-46c9-98bb-6a0d417a0337",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1472,
-320
],
"parameters": {
"color": 6,
"width": 576,
"height": 336,
"content": "@[youtube](XUpmdpucNzg)"
},
"typeVersion": 1
},
{
"id": "05835aab-ba99-4a52-afda-bd2995b17aeb",
"name": "Target Page Link",
"type": "n8n-nodes-base.set",
"position": [
-1264,
256
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "8dfdc51d-0d3d-441f-984a-9adbf0098216",
"name": "Target_Medium_Link",
"type": "string",
"value": "https://medium.com/tag/artificial-intelligence/archive"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8a4df843-5970-4418-93de-85d72d5c9f67",
"name": "Every Day",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1472,
256
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.3
},
{
"id": "cfa3b7b7-a838-43cd-a90e-be1975ba6c8f",
"name": "Scrape Headlines",
"type": "n8n-nodes-browseract.browserAct",
"position": [
-1024,
256
],
"parameters": {
"type": "WORKFLOW",
"workflowId": "70169279773867251",
"workflowConfig": {
"value": {
"input-Medium": "={{ $json.Target_Medium_Link }}"
},
"schema": [
{
"id": "input-Medium",
"type": "string",
"display": true,
"removed": false,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "Medium",
"defaultMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"input-Medium"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"open_incognito_mode": false
},
"credentials": {
"browserActApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "dc6c75ed-caf4-4440-bbb1-63dac47f427e",
"name": "Waiting for Inputs",
"type": "n8n-nodes-base.merge",
"position": [
80,
240
],
"parameters": {
"mode": "chooseBranch",
"useDataOfInput": 2
},
"typeVersion": 3.2
},
{
"id": "a894a274-892f-49ab-bd33-b25c732c5f5a",
"name": "Slack Team Notification",
"type": "n8n-nodes-base.slack",
"position": [
832,
336
],
"parameters": {
"text": "The 'Automated Industry Trend Scraper & Outline Creator' workflow has been completed.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09KLV9DJSX",
"cachedResultName": "all-browseract-workflow-test"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 2.4
},
{
"id": "e521b76b-c584-4252-b233-d680cc2cead3",
"name": "Check for Header",
"type": "n8n-nodes-base.if",
"position": [
1200,
80
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "500400e1-4830-41fa-873c-a30714d803dd",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.header }}",
"rightValue": "="
}
]
}
},
"typeVersion": 2.3
},
{
"id": "c4e6a2f6-133c-441c-b2b8-0acc4855b61c",
"name": "Rate Limit Mitigation",
"type": "n8n-nodes-base.wait",
"position": [
960,
80
],
"parameters": {
"amount": 10
},
"typeVersion": 1.1
},
{
"id": "474c4852-d637-4fac-986f-a190d75249b6",
"name": "Split the AI-generated data",
"type": "n8n-nodes-base.splitOut",
"position": [
304,
240
],
"parameters": {
"options": {},
"fieldToSplitOut": "output"
},
"typeVersion": 1
},
{
"id": "15ae5ed5-81f3-4da4-a2c1-3daedb640aa2",
"name": "Create a Document for Outlines",
"type": "n8n-nodes-base.googleDocs",
"position": [
-192,
144
],
"parameters": {
"title": "={{ $json.output[0].header }}",
"folderId": "default"
},
"credentials": {
"googleDocsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2,
"alwaysOutputData": true
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "0fb3c7d2-5b86-4a91-ae00-4ae109d9a8b8",
"connections": {
"Add Body": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Every Day": {
"main": [
[
{
"node": "Target Page Link",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter": {
"ai_languageModel": [
[
{
"node": "Analyzer & Script writer",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Structured Output",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Slack Team Notification",
"type": "main",
"index": 0
}
],
[
{
"node": "Rate Limit Mitigation",
"type": "main",
"index": 0
}
]
]
},
"Check for Header": {
"main": [
[
{
"node": "Add Header & Body",
"type": "main",
"index": 0
}
],
[
{
"node": "Add Body",
"type": "main",
"index": 0
}
]
]
},
"Scrape Headlines": {
"main": [
[
{
"node": "Analyzer & Script writer",
"type": "main",
"index": 0
}
]
]
},
"Target Page Link": {
"main": [
[
{
"node": "Scrape Headlines",
"type": "main",
"index": 0
}
]
]
},
"Add Header & Body": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Structured Output": {
"ai_outputParser": [
[
{
"node": "Analyzer & Script writer",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Waiting for Inputs": {
"main": [
[
{
"node": "Split the AI-generated data",
"type": "main",
"index": 0
}
]
]
},
"Rate Limit Mitigation": {
"main": [
[
{
"node": "Check for Header",
"type": "main",
"index": 0
},
{
"node": "Add Spacer",
"type": "main",
"index": 0
}
]
]
},
"Analyzer & Script writer": {
"main": [
[
{
"node": "Create a Document for Outlines",
"type": "main",
"index": 0
},
{
"node": "Waiting for Inputs",
"type": "main",
"index": 1
}
]
]
},
"Split the AI-generated data": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Create a Document for Outlines": {
"main": [
[
{
"node": "Waiting for Inputs",
"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.
browserActApigoogleDocsOAuth2ApiopenRouterApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the process of market research by generating high-quality, curated digests of Medium articles for specific topics. It scrapes recent content, uses AI to filter out spam and duplicates, categorizes the stories into readable buckets, and compiles everything…
Source: https://n8n.io/workflows/12348/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow automates the discovery of new B2B service providers entering the market. It scrapes a specific category on Clutch.co weekly, standardizes the data using AI, and compares it against a hi
This workflow automates competitive intelligence by continuously monitoring competitor websites for pricing and feature updates. It scrapes current data using BrowserAct, compares it against historica
This workflow automates Generative Engine Optimization (GEO) tracking by monitoring how your company appears in AI search results. It generates strategic queries, simulates searches on AI engines like
This workflow acts as an automated marketing analyst. It runs weekly to scrape competitor landing pages, compare them against historical data to detect changes in pricing, messaging, or offers, and de
This workflow acts as a "Generative Engine Optimization" (GEO) tracker. It automatically monitors how your brand is being recommended on AI-powered search engines by simulating real user queries on Pe