This workflow corresponds to n8n.io template #11722 — we link there as the canonical source.
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": "y0Yk7da21T4u9zlp",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Medical Research Tracker with Matrix and Pipedrive",
"tags": [],
"nodes": [
{
"id": "a7b35349-86c3-4ca9-85ae-ea3494b4e76c",
"name": "Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
16
],
"parameters": {
"width": 550,
"height": 690,
"content": "## How it works\n\nThis workflow runs on a schedule and keeps healthcare administrators informed about brand-new policy documents released by major U.S. health agencies. Every 24 hours the Schedule Trigger fires and a Code node emits a curated list of source URLs for HHS, CMS, and FDA. The list is split so each page can be scraped in parallel by ScrapeGraphAI, which pulls titles, publication dates, links, and short summaries. Normalization code cleans the response and flags anything published in the last 24 hours. After all branches finish, a Merge node passes the combined data to a deduplication step and then an IF gate. Items judged \u201cnew\u201d are pushed into Pipedrive as open deals and, at the same time, a Matrix message alerts the policy team. Older or duplicate items flow silently past the gate, preventing noise.\n\n## Setup steps\n\n1. Add ScrapeGraphAI credentials\n2. Add Matrix account credentials and room ID\n3. Add Pipedrive API credentials\n4. Edit the Code node to point at your preferred policy URLs\n5. Adjust the schedule interval if needed\n6. Activate and test with manual execution"
},
"typeVersion": 1
},
{
"id": "b9298827-c145-4472-9cc0-3fcbfc5efa88",
"name": "Section \u2013 Trigger & URL Prep",
"type": "n8n-nodes-base.stickyNote",
"position": [
288,
64
],
"parameters": {
"color": 7,
"width": 450,
"height": 654,
"content": "## Trigger & URL Preparation\n\nThis cluster kick-starts the entire automation. The **Schedule Trigger** launches the workflow once a day (you can change the interval to any cron or interval rule). Immediately after, the **Define Policy URLs** Code node returns an array of JSON items that list the web pages you care about\u2014by default HHS, CMS, and FDA news portals. Using a code-based list keeps the workflow flexible; simply add or remove objects in the array to monitor different agencies or policy think-tanks without touching downstream logic. Each item also includes a `source` label so we can track which agency generated a specific policy alert later on when we send notifications or store records. Passing a tidy, predictable payload at this early stage prevents headaches further down the line and sets up the Split node for smooth batch processing."
},
"typeVersion": 1
},
{
"id": "cfa312b2-b856-44e5-9534-76f30aa78e17",
"name": "Section \u2013 Scraping",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
64
],
"parameters": {
"color": 7,
"width": 450,
"height": 638,
"content": "## Scraping Engine\n\nThe nodes beneath this sticky handle live extraction of policy content. **Split URLs** ensures each web page travels its own execution path so ScrapeGraphAI can run multiple scrapes in parallel\u2014important because agency portals vary in response time and format. The **Fetch Policy Data** ScrapeGraphAI node consumes the `url` field from each item and uses an LLM prompt to pull down the latest titles, summaries, publication dates, and canonical links. AI-based scraping is resilient to layout changes that regularly break CSS-selector scrapers, giving you long-term stability. The prompt also hard-codes a JSON schema so downstream nodes receive uniform structures regardless of agency quirks. Positioning the scraping layer here keeps the workflow modular: swap in new prompts or additional parsing logic without disturbing triggers or storage."
},
"typeVersion": 1
},
{
"id": "59039658-1ede-4a0f-bd49-48f4403a93c6",
"name": "Section \u2013 Processing & Detection",
"type": "n8n-nodes-base.stickyNote",
"position": [
1280,
64
],
"parameters": {
"color": 7,
"width": 450,
"height": 638,
"content": "## Data Processing & Change Detection\n\nAfter ScrapeGraphAI finishes, the **Normalize Data** Code node standardizes field names, converts dates to ISO-8601, and appends a boolean `isNew` flag if the publication date falls within the past 24 hours. A **Merge Results** node waits for every branch, then passes everything to **Deduplicate Policies**, another Code node that removes duplicates based on the title so you never store the same regulation twice. Finally, the **Is New Policy?** IF node routes only fresh or updated items down the true path. This layered processing prevents alert fatigue and keeps Pipedrive lean by focusing on genuinely new content, while also providing a single choke point where you can plug in additional analytics\u2014sentiment scoring, keyword filters, or severity ranking\u2014without rewriting the entire workflow."
},
"typeVersion": 1
},
{
"id": "a7aa22cb-4544-4111-9362-897a19fafef2",
"name": "Section \u2013 Storage & Alerts",
"type": "n8n-nodes-base.stickyNote",
"position": [
1760,
64
],
"parameters": {
"color": 7,
"width": 674,
"height": 638,
"content": "## Storage & Notification\n\nEverything culminates here. The **Prepare Matrix Message** Set node composes a concise alert containing the policy title, agency, publication date, and a direct link. That feeds the **Send Matrix Alert** node, which posts to your chosen Matrix room so the policy team sees updates in real time without checking dashboards. In parallel, the **Upsert Policy Deal** Pipedrive node logs a new deal for each policy item\u2014allowing stakeholders to track implementation tasks, assign owners, and record follow-up actions right inside their CRM. Using Pipedrive instead of spreadsheets means policies become actionable objects that fit existing sales-style pipelines many health organizations already use for grant oversight and compliance projects. This dual path\u2014instant visibility plus structured archiving\u2014makes sure nothing slips through the cracks."
},
"typeVersion": 1
},
{
"id": "da488c85-9f34-4c80-a69b-7529972f4208",
"name": "Daily Policy Check",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
304,
400
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"typeVersion": 1.1
},
{
"id": "4b40f3a1-8ca6-4a64-ab98-bad0494085cd",
"name": "Define Policy URLs",
"type": "n8n-nodes-base.code",
"position": [
512,
400
],
"parameters": {
"jsCode": "// Define the policy or regulation source pages you want to monitor\nconst urls = [\n { url: 'https://www.hhs.gov/about/news/index.html', source: 'HHS' },\n { url: 'https://www.cms.gov/newsroom', source: 'CMS' },\n { url: 'https://www.fda.gov/news-events/fda-voices', source: 'FDA' }\n];\nreturn urls.map(obj => ({ json: obj }));"
},
"typeVersion": 2
},
{
"id": "ea292602-9055-47de-8a16-d8cc6898d8e3",
"name": "Split URLs",
"type": "n8n-nodes-base.splitInBatches",
"position": [
832,
464
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "78479135-46d8-4a67-af6c-fb8ed2f59cd9",
"name": "Fetch Policy Data",
"type": "n8n-nodes-scrapegraphai.scrapegraphAi",
"position": [
976,
464
],
"parameters": {
"userPrompt": "Extract the most recent healthcare policy or regulation entries from this page. For each entry return a JSON object with: title, date, summary, link, and keep the provided source value from input. Only include items published in the last 7 days if the information is available.",
"websiteUrl": "={{ $json.url }}"
},
"typeVersion": 1
},
{
"id": "b625d2fc-f1f8-4f0e-9833-db032b873b33",
"name": "Normalize Data",
"type": "n8n-nodes-base.code",
"position": [
1120,
432
],
"parameters": {
"jsCode": "// Normalise field names and flag new policies\nconst ONE_DAY = 24 * 60 * 60 * 1000;\nconst items = $input.all();\nreturn items.map(item => {\n const d = item.json;\n const obj = {\n title: d.title || d.name || 'Untitled Policy',\n date: d.date || new Date().toISOString(),\n summary: d.summary || d.description || '',\n link: d.link || d.url || '',\n source: d.source || item.json.source || 'unknown'\n };\n obj.isNew = (new Date(obj.date)).getTime() > Date.now() - ONE_DAY;\n return { json: obj };\n});"
},
"typeVersion": 2
},
{
"id": "c0c76204-ae95-4f29-b55e-f5dc004cdba3",
"name": "Merge Results",
"type": "n8n-nodes-base.merge",
"position": [
1312,
400
],
"parameters": {
"mode": "combine",
"options": {},
"mergeByFields": {
"values": [
{}
]
}
},
"typeVersion": 2.1
},
{
"id": "fc49ead7-465d-454c-9be0-d008f96d1af4",
"name": "Deduplicate Policies",
"type": "n8n-nodes-base.code",
"position": [
1504,
400
],
"parameters": {
"jsCode": "// Remove duplicate titles (case-insensitive)\nconst seen = new Set();\nconst out = [];\nfor (const item of $input.all()) {\n const key = (item.json.title || '').toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n out.push(item);\n }\n}\nreturn out;"
},
"typeVersion": 2
},
{
"id": "c1cf62a9-ad96-4c29-8afd-760d11f2cb2b",
"name": "Is New Policy?",
"type": "n8n-nodes-base.if",
"position": [
1776,
400
],
"parameters": {
"options": {},
"conditions": {
"boolean": [
{
"value1": "={{ $json.isNew }}",
"operation": "true"
}
]
}
},
"typeVersion": 2
},
{
"id": "5221d284-0e04-4d1c-b895-b286950f020d",
"name": "Prepare Matrix Message",
"type": "n8n-nodes-base.set",
"position": [
2000,
352
],
"parameters": {
"options": {}
},
"typeVersion": 3.4
},
{
"id": "2548fbc6-7ebb-4b7d-8701-e7a8b617786f",
"name": "Send Matrix Alert",
"type": "n8n-nodes-base.matrix",
"position": [
2176,
336
],
"parameters": {
"operation": "send"
},
"typeVersion": 1
},
{
"id": "a5578f51-ac76-4e54-b6e4-65b3db6fe765",
"name": "Upsert Policy Deal",
"type": "n8n-nodes-base.pipedrive",
"position": [
2016,
528
],
"parameters": {
"title": "={{ $json.title }}",
"additionalFields": {
"label": "Policy",
"value": 0,
"status": "open",
"visible_to": 3
}
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "f4a4c2e3-7946-4697-b883-8b7288a54530",
"connections": {
"Split URLs": {
"main": [
[
{
"node": "Fetch Policy Data",
"type": "main",
"index": 0
}
],
[
{
"node": "Merge Results",
"type": "main",
"index": 0
}
]
]
},
"Merge Results": {
"main": [
[
{
"node": "Deduplicate Policies",
"type": "main",
"index": 0
}
]
]
},
"Is New Policy?": {
"main": [
[
{
"node": "Prepare Matrix Message",
"type": "main",
"index": 0
},
{
"node": "Upsert Policy Deal",
"type": "main",
"index": 0
}
]
]
},
"Normalize Data": {
"main": [
[
{
"node": "Merge Results",
"type": "main",
"index": 1
}
]
]
},
"Fetch Policy Data": {
"main": [
[
{
"node": "Normalize Data",
"type": "main",
"index": 0
}
]
]
},
"Daily Policy Check": {
"main": [
[
{
"node": "Define Policy URLs",
"type": "main",
"index": 0
}
]
]
},
"Define Policy URLs": {
"main": [
[
{
"node": "Split URLs",
"type": "main",
"index": 0
}
]
]
},
"Deduplicate Policies": {
"main": [
[
{
"node": "Is New Policy?",
"type": "main",
"index": 0
}
]
]
},
"Prepare Matrix Message": {
"main": [
[
{
"node": "Send Matrix Alert",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
⚠️ COMMUNITY TEMPLATE DISCLAIMER: This is a community-contributed template that uses ScrapeGraphAI (a community node). Please ensure you have the ScrapeGraphAI community node installed in your n8n instance before using this template.
Source: https://n8n.io/workflows/11722/ — 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 contains community nodes that are only compatible with the self-hosted version of n8n.
Sales managers and team leads Business development representatives Marketing teams managing lead generation CRM administrators and sales operations Account executives and sales representatives Sales e
Splitout Filter. Uses stickyNote, clearbit, pipedrive, scheduleTrigger. Scheduled trigger; 20 nodes.
⚠️ COMMUNITY TEMPLATE DISCLAIMER: This is a community-contributed template that uses ScrapeGraphAI (a community node). Please ensure you have the ScrapeGraphAI community node installed in your n8n ins
⚠️ COMMUNITY TEMPLATE DISCLAIMER: This is a community-contributed template that uses ScrapeGraphAI (a community node). Please ensure you have the ScrapeGraphAI community node installed in your n8n ins