This workflow follows the Execute Workflow Trigger → Postgres 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": "sub004-rss-ingestion-00000000000",
"name": "SUB-004-rss-ingestion",
"nodes": [
{
"parameters": {
"inputSource": "passthrough"
},
"id": "c1000000-0004-0004-0004-000000000001",
"name": "Trigger",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"typeVersion": 1.1,
"position": [
240,
500
]
},
{
"parameters": {
"url": "={{ $json.feed_url }}",
"options": {}
},
"id": "c1000000-0004-0004-0004-000000000002",
"name": "Fetch RSS Feed",
"type": "n8n-nodes-base.rssFeedRead",
"typeVersion": 1.1,
"position": [
460,
500
]
},
{
"parameters": {
"operation": "executeQuery",
"query": "={{ `SELECT COALESCE((SELECT id FROM raw_research WHERE source_url = '${($json.link||'').replace(/'/g,\"''\")}' LIMIT 1), 0) AS existing_id, '${($json.link||'').replace(/'/g,\"''\")}' AS link, '${($json.title||'').replace(/'/g,\"''\")}' AS title, '${($json.contentSnippet||$json.content||$json.title||'').replace(/'/g,\"''\")}' AS content_text` }}",
"options": {}
},
"id": "c1000000-0004-0004-0004-000000000003",
"name": "Check Duplicate",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.5,
"position": [
680,
500
],
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "c1000000-0004-0004-0004-000000000030",
"leftValue": "={{ $json.existing_id }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "c1000000-0004-0004-0004-000000000004",
"name": "Is New?",
"type": "n8n-nodes-base.filter",
"typeVersion": 2.2,
"position": [
900,
500
]
},
{
"parameters": {
"operation": "executeQuery",
"query": "={{ `INSERT INTO raw_research (channel_id, source_type, source_url, source_name, content_title, content_text, status, created_at) VALUES (${$('Trigger').item.json.channel_id}, 'rss', '${($json.link||'').replace(/'/g,\"''\")}', '${($('Trigger').item.json.source_name||'').replace(/'/g,\"''\")}', '${($json.title||'').replace(/'/g,\"''\")}', '${($json.content_text||'').replace(/'/g,\"''\")}', 'ingested', NOW()) RETURNING id` }}",
"options": {}
},
"id": "c1000000-0004-0004-0004-000000000005",
"name": "Insert Raw Research",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.5,
"position": [
1120,
500
],
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"aggregate": "aggregateAllItemData",
"destinationFieldName": "inserted_items",
"options": {}
},
"id": "c1000000-0004-0004-0004-000000000006",
"name": "Aggregate Results",
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
1340,
500
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "c1000000-0004-0004-0004-000000000040",
"name": "items_inserted",
"value": "={{ $json.inserted_items.length }}",
"type": "number"
},
{
"id": "c1000000-0004-0004-0004-000000000041",
"name": "feed_url",
"value": "={{ $('Trigger').item.json.feed_url }}",
"type": "string"
}
]
},
"options": {}
},
"id": "c1000000-0004-0004-0004-000000000007",
"name": "Return",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1560,
500
]
}
],
"connections": {
"Trigger": {
"main": [
[
{
"node": "Fetch RSS Feed",
"type": "main",
"index": 0
}
]
]
},
"Fetch RSS Feed": {
"main": [
[
{
"node": "Check Duplicate",
"type": "main",
"index": 0
}
]
]
},
"Check Duplicate": {
"main": [
[
{
"node": "Is New?",
"type": "main",
"index": 0
}
]
]
},
"Is New?": {
"main": [
[
{
"node": "Insert Raw Research",
"type": "main",
"index": 0
}
]
]
},
"Insert Raw Research": {
"main": [
[
{
"node": "Aggregate Results",
"type": "main",
"index": 0
}
]
]
},
"Aggregate Results": {
"main": [
[
{
"node": "Return",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
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.
postgres
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
SUB-004-rss-ingestion. Uses executeWorkflowTrigger, rssFeedRead, postgres. Event-driven trigger; 7 nodes.
Source: https://github.com/navin-labs/content-factory-os/blob/main/n8n/workflows/subworkflows/SUB-004-rss-ingestion.json — 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.
WF-34 manage_sources. Uses executeWorkflowTrigger, postgres, rssFeedRead. Event-driven trigger; 10 nodes.
SUB-006-trends-ingestion. Uses executeWorkflowTrigger, rssFeedRead, postgres. Event-driven trigger; 7 nodes.
WF-13 discovery_rss. Uses executeWorkflowTrigger, postgres, rssFeedRead. Event-driven trigger; 5 nodes.
Reagendamiento_v2. Uses executeWorkflowTrigger, redis, httpRequest, n8n-nodes-evolution-api. Event-driven trigger; 89 nodes.
Agendamiento_v2. Uses n8n-nodes-evolution-api, redis, httpRequest, executeWorkflowTrigger. Event-driven trigger; 59 nodes.