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": "QCbb7Bm12gDIH0mI",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Keep discord clean",
"tags": [
{
"id": "CgBu2Sxr4mqipxlK",
"name": "template",
"createdAt": "2025-01-08T19:56:24.079Z",
"updatedAt": "2025-01-08T19:56:24.079Z"
}
],
"nodes": [
{
"id": "dde530b8-edd5-4f1d-a3c8-326925c97269",
"name": "Loop Over Channels",
"type": "n8n-nodes-base.splitInBatches",
"position": [
560,
400
],
"parameters": {
"options": {}
},
"retryOnFail": false,
"typeVersion": 3
},
{
"id": "3e2684b1-08ad-41bd-930f-cbb229e16617",
"name": "Loop Over Messages",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1260,
320
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "430d13be-670f-4e5d-acdf-ffe1a65a49e3",
"name": "Every day at 9pm",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-160,
400
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 21
}
]
}
},
"typeVersion": 1.2
},
{
"id": "6d40f036-c87a-4b68-9ec6-523a3372447c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
40,
600
],
"parameters": {
"color": 6,
"width": 294,
"height": 80,
"content": "**Note \u261d\ufe0f**\nDon\u2019t forget to setup an error workflow to get notified if something goes wrong"
},
"typeVersion": 1
},
{
"id": "93290300-084b-4f91-95bc-f34c1aef93cd",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
420,
-60
],
"parameters": {
"color": 5,
"width": 327,
"height": 152,
"content": "### \ud83d\udc68\u200d\ud83c\udfa4 Setup\n1. Add your **Discord** credentials\n2. Change the server in each **Discord** node to the correct one\n3. Click the Test Workflow button\n3. Activate the workflow to run on a schedule"
},
"typeVersion": 1
},
{
"id": "5fead80a-de3a-4f45-a524-5228def7b4ad",
"name": "Cool down Discord API rate limits",
"type": "n8n-nodes-base.wait",
"position": [
280,
400
],
"parameters": {
"amount": 2
},
"typeVersion": 1.1
},
{
"id": "5a8d6402-458c-4c24-b379-6a41908a5af3",
"name": "Get all Discord channels",
"type": "n8n-nodes-base.discord",
"position": [
40,
400
],
"parameters": {
"guildId": {
"__rl": true,
"mode": "id",
"value": ""
},
"options": {
"filter": [
0,
2
]
},
"operation": "getAll",
"returnAll": true
},
"typeVersion": 2
},
{
"id": "a2b1d905-849d-4392-95db-e545f542ba78",
"name": "Cool down Message deletion API rate limits",
"type": "n8n-nodes-base.wait",
"position": [
1680,
340
],
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "8c134cfe-dcb1-400d-a518-17ed3f1cbf62",
"name": "Cool down Get messages API rate limits",
"type": "n8n-nodes-base.wait",
"position": [
1000,
480
],
"parameters": {
"amount": 2
},
"typeVersion": 1.1
},
{
"id": "18ba10df-dcec-4d27-8ecf-06171939b7eb",
"name": "Get messages from Channel",
"type": "n8n-nodes-base.discord",
"onError": "continueRegularOutput",
"position": [
800,
480
],
"parameters": {
"guildId": {
"__rl": true,
"mode": "id",
"value": ""
},
"options": {},
"resource": "message",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"operation": "getAll",
"returnAll": true
},
"retryOnFail": false,
"typeVersion": 2,
"alwaysOutputData": true,
"waitBetweenTries": 5000
},
{
"id": "57f2395a-b624-41d3-aada-4107b21a3359",
"name": "Delete Message",
"type": "n8n-nodes-base.discord",
"onError": "continueRegularOutput",
"position": [
1500,
340
],
"parameters": {
"guildId": {
"__rl": true,
"mode": "id",
"value": ""
},
"resource": "message",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.channel_id }}"
},
"messageId": "={{ $json.id }}",
"operation": "deleteMessage"
},
"retryOnFail": false,
"typeVersion": 2,
"alwaysOutputData": true,
"waitBetweenTries": 5000
},
{
"id": "c224ef25-57d8-4fe6-b14a-b09131ce8c1c",
"name": "Filter Messages older than 7 days",
"type": "n8n-nodes-base.filter",
"position": [
1000,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2864fc65-1d9d-433f-bd61-766278a7e54c",
"operator": {
"type": "dateTime",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.timestamp }}",
"rightValue": ""
},
{
"id": "a05636ea-8663-4398-8a55-a03ab34f83a5",
"operator": {
"type": "dateTime",
"operation": "before"
},
"leftValue": "={{ $json.timestamp }}",
"rightValue": "={{ $today.minus({days: 7}) }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c3654c25-6318-4652-9f76-82770cc28324",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
40,
300
],
"parameters": {
"color": 6,
"width": 194,
"height": 80,
"content": "**Tip \ud83d\udc47**\nOAuth2 Authentication is very easy to setup"
},
"typeVersion": 1
},
{
"id": "f3d8b35e-6b13-4df9-bd33-2d44381e6fc5",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-200,
-60
],
"parameters": {
"color": 4,
"width": 600,
"height": 280,
"content": "# Nightly Discord Channel Cleanup\n### This workflow runs every day at 9:00 p.m. and:\n- Retrieves all Discord channels using your provided credentials.\n- Pauses briefly to respect Discord API rate limits.\n- Loops through each channel and fetches messages.\n- Filters out messages older than seven days.\n- Deletes those older messages, again pausing to stay within deletion rate limits.\n\nBy setting up this workflow on a schedule, you can automatically keep Discord channels tidy and compliant with retention policies."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "C3NlThVZU7vFr4Um",
"executionOrder": "v1",
"saveManualExecutions": true
},
"versionId": "a4b9f5d2-d905-4c86-9fa6-2a274909ecce",
"connections": {
"Delete Message": {
"main": [
[
{
"node": "Cool down Message deletion API rate limits",
"type": "main",
"index": 0
}
]
]
},
"Every day at 9pm": {
"main": [
[
{
"node": "Get all Discord channels",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Channels": {
"main": [
[
{
"node": "Filter Messages older than 7 days",
"type": "main",
"index": 0
}
],
[
{
"node": "Get messages from Channel",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Messages": {
"main": [
[],
[
{
"node": "Delete Message",
"type": "main",
"index": 0
}
]
]
},
"Get all Discord channels": {
"main": [
[
{
"node": "Cool down Discord API rate limits",
"type": "main",
"index": 0
}
]
]
},
"Get messages from Channel": {
"main": [
[
{
"node": "Cool down Get messages API rate limits",
"type": "main",
"index": 0
}
]
]
},
"Cool down Discord API rate limits": {
"main": [
[
{
"node": "Loop Over Channels",
"type": "main",
"index": 0
}
]
]
},
"Filter Messages older than 7 days": {
"main": [
[
{
"node": "Loop Over Messages",
"type": "main",
"index": 0
}
]
]
},
"Cool down Get messages API rate limits": {
"main": [
[
{
"node": "Loop Over Channels",
"type": "main",
"index": 0
}
]
]
},
"Cool down Message deletion API rate limits": {
"main": [
[
{
"node": "Loop Over Messages",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow maintains a tidy Discord server by automatically deleting old messages, ensuring your community stays organised and free from clutter without manual effort. It's ideal for server admins or moderators who manage active channels and want to enforce retention policies effortlessly. The key step involves looping through channels and messages via Discord integration, then systematically removing content older than a set period, with built-in waits to respect API rate limits.
Use this workflow for daily clean-ups in high-traffic Discord servers where message volume builds up quickly, such as gaming communities or support forums. Avoid it for small, low-activity servers where manual moderation suffices, or if your retention needs vary by channel—consider customising the age threshold in variations. For broader automation, pair it with notifications to alert admins of completed purges.
About this workflow
Keep discord clean. Uses splitInBatches, scheduleTrigger, stickyNote, discord. Scheduled trigger; 14 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.
Wait Schedule. Uses spotify, supabase, compareDatasets, noOp. Scheduled trigger; 54 nodes.
This n8n template demonstrates how to automatically monitor and track username and nickname changes across your Discord server members. Perfect for community moderation, security monitoring, and maint
🌸 Affirmation Sender + Weekly Gratitude Digest v2
I wanted a journal but never had the discipline to write one. Most of my day happens in Discord anyway, so I built this to do it for me.
This workflow monitors product prices from BooksToScrape and sends alerts to a Discord channel via webhook when competitor's prices are lower than our prices. Schedule (for daily or required schedule)