n8n Discord Node: Send Messages, Manage Channels, and Build Bots in Your Workflows [Free Workflow JSON]
The n8n Discord node lets you send messages, manage channels and roles, react to events with the Discord Trigger, and build full Discord bots—all without writing a bot framework from scratch. This guide covers every oper
The n8n Discord node lets you send messages, manage channels and roles, react to events with the Discord Trigger, and build full Discord bots—all without writing a bot framework from scratch. This guide covers every operation, the credential setup that trips most people up, and three production-ready workflow patterns you can import today.
Free workflow JSON for a Discord notification bot is included at the end.
Why Use the Discord Node?
Discord has 500M+ registered accounts and is the default community platform for developer tools, crypto projects, gaming, and SaaS products. If your product has a Discord server—or your team uses one—the n8n Discord node lets you:
- Send automated alerts and digests to channels
- DM users for onboarding or support events
- React to slash commands and mentions
- Manage roles for access-gating and onboarding
- Bridge Discord to any other service in your n8n stack
Credential Setup
The Discord node uses a bot token, not OAuth2. You must create a Discord application and bot.
Steps:
- Go to discord.com/developers/applications → New Application
- Go to Bot → Add Bot → copy the Token
- Under Privileged Gateway Intents, enable Server Members Intent and Message Content Intent if your workflow reads messages
- Go to OAuth2 → URL Generator: select
botscope + permissions your workflow needs (Send Messages, Manage Roles, etc.) - Open the generated URL to invite the bot to your server
- In n8n → Credentials → Discord API → paste the bot token
Common gotcha: The bot must be a member of the server AND have the correct channel-level permissions. A bot with Send Messages at the server level can still be blocked by channel permission overwrites.
Discord Node: All Operations
Message Operations
| Operation | What It Does |
|---|---|
| Send | Post a message to a channel (text, embeds, files) |
| Delete | Remove a message by ID |
| Get | Fetch a single message |
| Get Many | Fetch multiple messages (up to 100) |
| React | Add an emoji reaction to a message |
| Pin | Pin a message in a channel |
Channel Operations
| Operation | What It Does |
|---|---|
| Create | Create a text, voice, or category channel |
| Delete | Delete a channel |
| Get | Fetch channel details |
| Get Many | List channels in a server |
| Update | Rename, set topic, slow-mode, etc. |
Member / Role Operations
| Operation | What It Does |
|---|---|
| Get | Fetch a member's details |
| Get Many | List server members |
| Add Role | Assign a role to a member |
| Remove Role | Remove a role from a member |
| Ban | Ban a user from the server |
| Kick | Kick a user from the server |
Server Operations
| Operation | What It Does |
|---|---|
| Get | Fetch server (guild) metadata |
Discord Trigger Node
The Discord Trigger node listens for real-time gateway events. Add it as the first node of a workflow to react to:
-
MESSAGE_CREATE— every new message in monitored channels -
INTERACTION_CREATE— slash commands and button clicks -
GUILD_MEMBER_ADD/GUILD_MEMBER_REMOVE— member join/leave -
GUILD_MEMBER_UPDATE— role or nickname changes -
REACTION_ADD— emoji reactions
Important: The Discord Trigger requires a persistent connection to Discord's gateway. This works in n8n Cloud and self-hosted setups, but the workflow must be active (not just saved).
Key Fields When Sending Messages
Server ID (Guild ID): Right-click your server name in Discord → Copy Server ID. (Enable Developer Mode in Discord settings first.)
Channel ID: Right-click the channel → Copy Channel ID.
Content vs Embeds: Use content for plain text. Use Embed for rich cards with titles, descriptions, fields, colors, and images.
Message Reference: To reply to an existing message, set Message Reference → Message ID to the parent message's ID.
Gotchas
| Problem | Fix |
|---|---|
| "Missing Permissions" error | Bot doesn't have the required permission in that channel—check channel permission overwrites, not just server-level |
| Trigger doesn't fire | Workflow must be active, not just saved; gateway connection requires the workflow to be running |
| Message Content Intent not enabled | Enable it in the Developer Portal under Bot → Privileged Gateway Intents or MESSAGE_CREATE payloads arrive with empty content
|
| Embed not rendering | Discord enforces embed limits: title ≤ 256 chars, description ≤ 4096 chars, total ≤ 6000 chars across all fields |
| Rate limits | Discord enforces per-route rate limits (e.g., 5 msg/5s per channel); add a Wait node (1–2 seconds) in loops to avoid 429s |
| Bot can't DM user | User must share a server with the bot AND have DMs from server members enabled |
| Slash commands not showing | Slash commands must be registered via the Discord API; the n8n Discord node handles messages, not command registration |
3 Production-Ready Patterns
Pattern 1: Stripe Payment → Discord Alert
Trigger your team's Discord channel instantly when a new Stripe payment lands.
Workflow:
Stripe Trigger (checkout.session.completed)
→ Discord: Send Message
Channel: #payments
Content: 💰 New payment: {{$json.amount_total / 100}} {{$json.currency.toUpperCase()}} from {{$json.customer_details.name}}
Why it works: The Stripe Trigger fires synchronously; the Discord message lands in seconds. No polling, no delay.
Add: An IF node to only alert on amounts > $100 to reduce noise.
Pattern 2: New Member Welcome Bot
DM every new server member with an onboarding message and assign a role.
Workflow:
Discord Trigger (GUILD_MEMBER_ADD)
→ Discord: Send Message (DM to new member)
Content: Welcome to the server! Here's what to do first: ...
→ Discord: Add Role
Role: Newcomer
User: {{$json.user.id}}
Why it works: GUILD_MEMBER_ADD fires immediately on join. The DM + role assignment runs in under a second with no manual moderator action needed.
Gotcha: The bot must have Manage Roles permission and its role must be higher in the hierarchy than the role it assigns.
Pattern 3: Keyword Alert Monitor
Watch a high-volume channel for mentions of keywords (competitor names, bug reports, your product name) and route matches to a Slack channel or email.
Workflow:
Discord Trigger (MESSAGE_CREATE)
→ IF: content contains any of ["outage", "bug", "broken", "error"]
True → Slack: Send Message
Channel: #alerts
Text: Discord alert in #{{$json.channel_id}}: {{$json.content}}
False → NoOp
Why it works: The trigger fires on every message; the IF filters to only the ones that matter. You can extend the keyword list with a Code node using regex for more flexible matching.
Extend: Add a Google Sheets node to log every match for trend analysis.
Free Workflow JSON: Discord Notification Bot
This workflow sends a formatted embed to a Discord channel on a schedule—useful for daily digests, status updates, or metric summaries.
{
"name": "Discord Daily Digest Bot",
"nodes": [
{
"parameters": {
"rule": { "interval": [{ "field": "hours", "hoursInterval": 24 }] }
},
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [200, 300]
},
{
"parameters": {
"resource": "message",
"operation": "send",
"guildId": "YOUR_SERVER_ID",
"channelId": "YOUR_CHANNEL_ID",
"content": "",
"embeds": {
"values": [
{
"title": "Daily Digest — {{ $now.toFormat('LLL dd, yyyy') }}",
"description": "Here's what happened today. Replace this with your data source.",
"color": 5814783,
"fields": {
"values": [
{ "name": "New signups", "value": "42", "inline": true },
{ "name": "Revenue", "value": "$1,280", "inline": true },
{ "name": "Support tickets", "value": "7 open", "inline": false }
]
}
}
]
}
},
"name": "Discord: Send Digest",
"type": "n8n-nodes-base.discord",
"position": [420, 300],
"credentials": { "discordApi": { "name": "Discord Bot" } }
}
],
"connections": {
"Schedule Trigger": { "main": [[{ "node": "Discord: Send Digest", "type": "main", "index": 0 }]] }
}
}
To use: Replace YOUR_SERVER_ID and YOUR_CHANNEL_ID with your server's IDs, connect your Discord Bot credential, and wire in a real data source (HTTP Request, Google Sheets, database) to replace the static field values.
Discord Node vs Webhook vs Slash Commands
| Approach | Best For |
|---|---|
| Discord Node (bot token) | Sending messages, managing roles/channels, DMs |
| Discord Trigger | Reacting to events (messages, joins, reactions) |
| Webhook (incoming) | One-way posting without a bot (simpler setup, no trigger) |
| Slash commands | Interactive user-initiated commands (requires separate registration) |
For most automation use cases—alerts, digests, notifications—the Discord node + bot token is the right choice. Use an incoming webhook (HTTP Request node → Discord webhook URL) only if you want the simplest possible one-way push without managing a bot.
Build Your First Discord Automation
The Discord node covers every common automation pattern: alerts, onboarding, moderation, and monitoring. The key steps are always the same—create a bot, set the right permissions, grab server and channel IDs, then chain whatever trigger and data source makes sense for your workflow.
The n8n Workflow Starter Pack bundles pre-built workflow JSON files for Discord and 20+ other integrations so you can skip the setup and start from a working base.
👉 Get the n8n Workflow Starter Pack ($29)
Drop your Discord automation use case in the comments—I'd love to hear what you're building.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.