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": "As8TxF3PjyXygc0o",
"name": "\ud83e\uddf9 Archive (delete) duplicate items from a Notion database",
"tags": [],
"nodes": [
{
"id": "b758ce01-7f5e-4bdc-a4c3-6c00d6bc022a",
"name": "Every day",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-180,
660
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.2
},
{
"id": "1ca45ba5-4635-4710-9807-26f22d535059",
"name": "Get pages from database",
"type": "n8n-nodes-base.notion",
"position": [
60,
560
],
"parameters": {
"options": {},
"resource": "databasePage",
"operation": "getAll",
"returnAll": true,
"databaseId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"typeVersion": 2.2
},
{
"id": "ef8c8cfa-12fb-4fb9-8552-09f69f1f358d",
"name": "Aggregate all items",
"type": "n8n-nodes-base.aggregate",
"position": [
500,
560
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "pages"
},
"typeVersion": 1
},
{
"id": "f1c3c0ad-f904-4d63-a131-0b045a21ce04",
"name": "Format items properly",
"type": "n8n-nodes-base.set",
"position": [
280,
560
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "309a1e9b-f3e9-41a0-aadb-aa74bc993fe9",
"name": "id",
"type": "string",
"value": "={{ $json.id }}"
},
{
"id": "ad6e8fa9-9872-456d-971f-3cef940b7d8a",
"name": "property_to_check",
"type": "string",
"value": "=\"SET YOUR PROPERTY HERE\""
}
]
}
},
"typeVersion": 3.4
},
{
"id": "5d39d3b7-604d-4aca-bf9a-3bb09bddad66",
"name": "Filter duplicates",
"type": "n8n-nodes-base.code",
"position": [
720,
560
],
"parameters": {
"jsCode": "const inputData = $input.first().json.pages;\n\nconst seen = new Set();\nconst duplicates = new Map();\n\ninputData.forEach(item => {\n const propertyValue = item.property_to_check;\n if (seen.has(propertyValue)) {\n duplicates.set(propertyValue, item);\n } else {\n seen.add(propertyValue);\n }\n});\n\nconst output = Array.from(duplicates.values()).map(item => ({ json: item }));\n\nreturn output;"
},
"typeVersion": 2
},
{
"id": "55a8f0eb-702b-4056-a28c-96a7ade7c2cd",
"name": "Archive pages",
"type": "n8n-nodes-base.notion",
"position": [
920,
560
],
"parameters": {
"pageId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"operation": "archive"
},
"typeVersion": 2.2
},
{
"id": "2c9655ea-401c-410b-a4b1-b001ae6dbe4b",
"name": "When a page is added to the database",
"type": "n8n-nodes-base.notionTrigger",
"position": [
-180,
460
],
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"databaseId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"typeVersion": 1
},
{
"id": "672b647c-d009-45c3-b69e-6dfe85992e15",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"width": 860,
"height": 460,
"content": "## \ud83e\uddf9 Archive (delete) extra duplicate items from Notion database\n### ABOUT THIS WORKFLOW\nThis n8n workflow automatically gets duplicate database pages based on a property and \"archives\" them (equivalent to deleting them), leaving just one copy.\n\n### SETUP\n1. Create a Notion credential.\n2. Add it to the Notion nodes, selecting the appropriate database.\n3. In the \"Set\" node (\"Format items properly\"), specify a reference to the property you want to check for duplicates and assign it to the field \"property_to_check\". I recommend using the n8n property drag-and-drop feature.\n4. Enjoy!\n\n### ABOUT THE TRIGGERS\nThis workflow offers two possible triggers by default:\n- Run every time a page is added to the database.\n- Run every day.\n\n\nYou can enable, disable, or modify these triggers as you like."
},
"typeVersion": 1
},
{
"id": "83881bd3-60e3-40be-a469-0b7acb21d2be",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
400
],
"parameters": {
"color": 5,
"width": 220,
"height": 420,
"content": "## TRIGGERS"
},
"typeVersion": 1
},
{
"id": "cd4b8717-19ae-42d6-ac87-bbdd071dd774",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
480
],
"parameters": {
"color": 6,
"width": 860,
"height": 340,
"content": "## GET DUPLICATE PAGES"
},
"typeVersion": 1
},
{
"id": "087fb844-2241-4ed9-976d-9bdc7ccd8aa5",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
400
],
"parameters": {
"color": 3,
"width": 180,
"height": 420,
"content": "## ARCHIVE (DELETE)"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "fdd2e5ad-4ff5-4432-a5f9-ebbeb1a1a6cb",
"connections": {
"Every day": {
"main": [
[
{
"node": "Get pages from database",
"type": "main",
"index": 0
}
]
]
},
"Filter duplicates": {
"main": [
[
{
"node": "Archive pages",
"type": "main",
"index": 0
}
]
]
},
"Aggregate all items": {
"main": [
[
{
"node": "Filter duplicates",
"type": "main",
"index": 0
}
]
]
},
"Format items properly": {
"main": [
[
{
"node": "Aggregate all items",
"type": "main",
"index": 0
}
]
]
},
"Get pages from database": {
"main": [
[
{
"node": "Format items properly",
"type": "main",
"index": 0
}
]
]
},
"When a page is added to the database": {
"main": [
[
{
"node": "Get pages from database",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Keep your Notion database tidy by automatically archiving duplicate entries, saving time on manual clean-ups and ensuring reliable data for projects or teams. This workflow suits Notion users managing lists like task trackers or inventories where duplicates creep in from repeated imports or user errors. It runs daily via a scheduled trigger, fetching all pages from your specified database, identifying duplicates based on key fields like name or URL using a custom code filter, then archiving them seamlessly with Notion's API.
Use this workflow for ongoing maintenance of medium to large Notion databases that accumulate duplicates over time, such as content calendars or customer logs. Avoid it for tiny databases where manual checks suffice, or if your duplicates require complex criteria beyond basic field matching. Common variations include adjusting the schedule to weekly runs or adding a Slack notification for archived items to track changes.
About this workflow
🧹 Archive (delete) duplicate items from a Notion database. Uses scheduleTrigger, notion, notionTrigger, stickyNote. Scheduled trigger; 11 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
Send personalized cold outreach emails to partners without ever contacting the same person twice. This workflow reads a lead list from Google Sheets, validates and deduplicates entries, checks a track
Sync your Google Contacts with your Notion database.
WorkFlow 05. Uses notion, httpRequest. Scheduled trigger; 44 nodes.
Social Content Intelligence — Weekly Report. Uses httpRequest, notion, errorTrigger. Scheduled trigger; 42 nodes.
WorkFlow 08. Uses notion, httpRequest. Scheduled trigger; 37 nodes.