7 Days to Die Discord Integration & Webhooks (2026)

Last verified: May 26, 2026. Tested against 7DTD V2.6 dedicated server (April 2026 Stable).

What changed in 2026: The dedicated server's telnet protocol is unchanged from V2.5, so existing bridges keep working through the V2.6 upgrade. Two security-relevant defaults shifted: telnet now binds to 127.0.0.1 on fresh installs (move your bridge to the same host or set TelnetAllowedIPs), and the default empty-password telnet is rejected at server start (set TelnetPassword explicitly). Discord's webhook API itself is stable; the rate-limit numbers below have not changed since 2023.

Pairing your 7 Days to Die server with a Discord guild keeps your community engaged when players are not logged in. The dev team has never shipped a native Discord integration; everything goes through third-party tools that watch the server log or hook the telnet console. Two patterns cover almost every use case:

  1. One-way Discord webhooks for posting server events into a channel (restart alerts, Blood Moon countdowns, player deaths, server crash recovery).
  2. Two-way chat bridges via a server manager or bot for in-game chat <-> Discord chat conversation, so players away from their machines can keep up.

This guide covers both, the four maintained tools that handle them in 2026, a ready-to-paste Python script for custom event forwarding, the channel layout that scales past 30 players, and the rate-limit traps that bite during Blood Moon nights.

Webhook vs. Chat Bridge: Which One Do You Need?

Discord Webhook (one-way)Chat Bridge (two-way bot)
DirectionServer → DiscordServer <-> Discord
What it sendsServer-generated events: player joins, deaths, restarts, level-ups, Blood Moon countdownLive chat messages, both directions
Setup difficultyTrivial: generate URL in Discord, paste into the toolModerate: needs a Discord bot user and telnet access
Discord sideNo bot needed, just a webhook URLBot user with chat permissions
Server sideAnything that can POST HTTPTool that holds a persistent telnet connection
Best forStatus channels, "important events" feeds, automated alertsActive communities where chat-while-at-work matters

Most communities run both: a webhook for events plus a bridge for chat. The two are not mutually exclusive; CSMM (the most-used 7DTD server manager) handles both from a single install.

Setting Up a Discord Webhook (5 minutes)

Discord webhooks are a built-in Discord feature. You do not need a bot, OAuth flow, or extra software on the Discord side. Just a URL that posts to a specific channel.

  1. In Discord: Server Settings → Integrations → Webhooks → New Webhook.
  2. Pick the target channel and a display name (e.g., 7D2D Server Bot). Optionally upload an avatar (the in-game cog or your community badge works well).
  3. Click Copy Webhook URL. Treat this URL as a secret. Anyone with it can post to your channel as that bot identity.
  4. Paste the URL into the tool that will send events. The exact location depends on the tool; see the Tools section below.

To verify the URL works before wiring it into anything, post a test message with curl:

curl -X POST -H "Content-Type: application/json" \
  -d '{"content":"Hello from 7D2D test."}' \
  https://discord.com/api/webhooks/<your-webhook-id>/<your-token>

If the message lands in your channel, the URL works. If you get HTTP 401 or 404, the URL is wrong, expired, or was deleted in Discord. Generate a new one.

The Four Maintained Tools in 2026

The dedicated server does not natively post to Discord. You need a layer that watches the server log or hooks the telnet chat, formats messages, and POSTs to the webhook (or runs a bot for bidirectional bridging). These four tools cover 99% of 7DTD Discord integrations in 2026:

1. CSMM (Catalysm's Server Manager): the full kitchen-sink option

Open-source, self-hosted web manager for 7DTD. Supports both Discord webhooks (event notifications, custom log-string detection, configurable event filters) and full bidirectional chat bridging via a Discord bot. The most feature-complete option that is actively maintained in 2026. GPL-3.0 licensed.

CSMM ships with prebuilt event types: player join/leave, death/respawn, level-up, base-claim, level-50 hits, chat messages, kicks/bans, and a flexible "match this log line" trigger for anything else. The Discord-side commands let admins kick/ban/give-item/teleport from a privileged channel.

Trade-off: CSMM itself runs on a Node.js + PostgreSQL stack and needs a small VPS or container alongside your game server. If you do not want a second service running, skip CSMM and use Dishorde or a script.

2. Dishorde: the small focused chat bridge

Discord bridge bot purpose-built for 7DTD. Logs into your Discord guild as a bot user, opens a telnet connection to the game server on port 8081, and bridges chat both ways. No web panel; no event filtering; no admin command UI; just chat. About 1500 lines of Node.js, easy to audit.

Best for a small community where the goal is "let people at work see the in-game chat." Lower operational burden than CSMM; less functionality.

3. ServerTools (modlet, with Discord_Bot module)

ServerTools is the long-running 7DTD modlet that adds dozens of admin tooling features (zones, wallets, player tracking, anti-grief, plus much more). Its Discord_Bot tool turns the modlet into a webhook sender for ServerTools-internal events: zone breaches, player-killed-by-zombie-during-Blood-Moon, vault-overflow, etc.

ServerTools also requires Web_API to be enabled for the bot to talk to Discord. Configuration is XML files in the modlet's config directory; for a server already running ServerTools, this is the lowest-effort way to add Discord events.

Verify ServerTools is updated for V2.6 before installing on a 2026 server; the modlet's release cycle lags the base game by a few weeks after major patches.

4. Custom script (Python or Node) over telnet

If you want exact control over which events forward, write a 30-line script that connects to the telnet port, watches lines as they come in, and POSTs to the webhook. The example below is a complete Python implementation.

Ready-to-Paste Python Webhook Script

This is a complete working script that connects to the 7DTD telnet console, watches for player events, and forwards them to Discord. Replace the four variables at the top and run it on the same machine as the game server (or any machine that can reach the telnet port).

#!/usr/bin/env python3
# 7dtd-discord-webhook.py - minimal log-to-webhook forwarder.
# Requires: Python 3.8+; standard library only.

import telnetlib3
import asyncio
import urllib.request
import json
import re

# === Configure these ===
TELNET_HOST    = "127.0.0.1"
TELNET_PORT    = 8081
TELNET_PASS    = "your_telnet_password_here"
WEBHOOK_URL    = "https://discord.com/api/webhooks/<id>/<token>"
# ========================

# Regex patterns for events we care about. Tune to your taste.
EVENTS = {
    "join":      re.compile(r"Player connected, entityid=\d+, name='([^']+)'"),
    "leave":     re.compile(r"Player disconnected: EntityID=\d+, PlayerID='[^']+', OwnerID='[^']+', PlayerName='([^']+)'"),
    "death":     re.compile(r"died at\(([\-\d\., ]+)\)"),
    "blood_moon":re.compile(r"Blood Moon is rising"),
    "restart":   re.compile(r"Saving and exiting server"),
}

def send_discord(message: str) -> None:
    """POST a message to Discord; swallow rate-limit errors."""
    payload = json.dumps({"content": message}).encode("utf-8")
    req = urllib.request.Request(
        WEBHOOK_URL, data=payload,
        headers={"Content-Type": "application/json"}
    )
    try:
        urllib.request.urlopen(req, timeout=5).read()
    except Exception as e:
        # Rate-limit (429) or transient errors: log and continue.
        print(f"Discord send failed: {e}")

def parse_line(line: str) -> None:
    if m := EVENTS["join"].search(line):
        send_discord(f":green_circle: **{m.group(1)}** joined the server.")
    elif m := EVENTS["leave"].search(line):
        send_discord(f":red_circle: **{m.group(1)}** left the server.")
    elif EVENTS["blood_moon"].search(line):
        send_discord(":warning: **Blood Moon is rising.** Brace yourselves.")
    elif EVENTS["restart"].search(line):
        send_discord(":arrows_counterclockwise: Server is restarting.")

async def main():
    reader, writer = await telnetlib3.open_connection(
        host=TELNET_HOST, port=TELNET_PORT,
        connect_minwait=1.0, connect_maxwait=2.0,
    )
    # Authenticate.
    writer.write(TELNET_PASS + "\n")
    await writer.drain()
    # Tail forever.
    while True:
        line = await reader.readline()
        if not line:
            await asyncio.sleep(1)
            continue
        parse_line(line.strip())

if __name__ == "__main__":
    asyncio.run(main())

Install dependencies: pip install telnetlib3. Run with python3 7dtd-discord-webhook.py in a tmux/screen session or as a systemd service so it survives across game-server restarts.

What you can extend:

  • Add a regex for level-up events (Player .* leveled up to level \d+) and forward to a #achievements channel
  • Add a 5-second buffer between sends to absorb Blood Moon bursts
  • POST embeds (rich messages with title/colour/fields) instead of plain content; the Discord API accepts a JSON shape with embeds: []
  • Persist event counts to a SQLite file for daily summary reports

Blood Moon Rate-Limit Strategy

Blood Moon (Horde Night) generates a burst of player events: zombie hits, deaths, respawns, damage logs, level-ups. A naive forwarder hits Discord's webhook rate limit (5 messages per 2 seconds per webhook) within the first minute of horde combat and starts dropping messages.

Three mitigations, in order of complexity:

  1. Filter aggressively. You do not need every zombie-hit logged. Forward joins, deaths, level-ups, restarts, and Blood Moon start/end. Skip everything else.
  2. Batch deaths into a single message. Instead of "Player A died" then "Player B died" then "Player A died (again)", buffer 5-10 seconds and post "Last 10s: 4 deaths (Player A x2, Player B, Player C)".
  3. Use a queue with a token-bucket rate limiter. Build a queue that drains at most 3 messages per 2 seconds; overflow messages are merged or dropped. CSMM does this automatically; in a custom script add ~30 lines.

Event Recipes Worth Setting Up

The events your community will actually engage with, ranked by community-management leverage:

EventChannelSourceWhy it matters
Server restart announcements#server-statusRestart script + webhook curlPlayers know what is happening; reduces "is the server down?" pings
Blood Moon imminent (24h, 1h, now)#alertsCustom script watching the day counterPlayers in raid groups can coordinate
Player join/leave#player-activityWebhook from any toolFriends see when each other are on
Player death#player-activityWebhook from any toolLighthearted; people laugh at each other
Level-up milestones (every 25 levels)#achievementsFilter on log lines or ServerTools eventRecognition for progression
Crash and auto-restart#admin-logWatchdog script + webhookAdmins see crashes in real time
Admin command logging#admin-log (private)CSMM or ServerToolsAudit trail for community trust
Daily player count snapshot#statsCron job that posts at midnightTrack community growth/decay over months

Channel Layout That Scales

For anything beyond a casual server, splitting events into purpose-specific channels makes them readable. The pattern that holds up past 30 players:

ChannelWhat goes thereVolume
#server-statusRestarts, planned downtime, "server is back up" noticesLow (a few per day)
#in-game-chatTwo-way chat bridge (if running CSMM or Dishorde)High during peak hours
#alertsBlood Moon countdown, scheduled events, mod-config warningsMedium
#player-activityJoins, leaves, deaths, level-upsHigh
#achievementsMilestone level-ups (every 25 levels), trader rep maxed, blood-moon-survivor countsLow
#admin-log (private)Admin commands run, bans, kicks, anti-cheat triggers, telnet auth attemptsMedium; admins only
#tickets or #helpPlayer support requests. CSMM has a built-in ticket flow that posts hereLow-medium

Webhook Security Checklist

  • Never commit webhook URLs to git. Treat them like API keys. If a URL leaks (Discord shows recent posts under Server Settings → Integrations → Webhooks → View History), regenerate it and update your tool.
  • Sanitise in-game input before forwarding. Discord renders mentions, links, and limited markdown. A player could chat @everyone in-game and ping your entire server if you forward verbatim. Strip @ mentions, role IDs, and markdown control characters in your sender.
  • Rate-limit your sender. Discord's webhook rate limit is 5 per 2 seconds per webhook. Your sender should queue with a floor of about 400ms between messages.
  • Hide admin channels. #admin-log should be readable only by admin roles. Players do not need to see kick reasons or anti-cheat triggers.
  • Rotate the URL annually. Even without a known leak, regenerating once a year limits the blast radius of any long-tail URL exposure.
  • Telnet password discipline. The chat bridge tools all use telnet to read the game; if the telnet password is weak, anyone on the same network can issue admin commands. Use a 16+ character password and bind telnet to localhost when possible.

Verbatim Error Strings: When Discord Goes Quiet

If your bridge tool or webhook script prints any of these, this is what they actually mean. Copy the message into a sub-section header and grep your logs.

HTTP 401 Unauthorized
{"message": "Invalid Webhook Token", "code": 50027}

Webhook URL was regenerated or deleted in Discord. Generate a new URL and update your tool's config. The previous URL is permanently dead; no amount of retry helps.

HTTP 429 Too Many Requests
{"message": "You are being rate limited.", "retry_after": 4.2, "global": false}

Per-webhook rate limit hit (5 requests per 2 seconds). The retry_after tells your sender how long to wait. The default X-RateLimit-Remaining response header is more useful than the body for proactive throttling - read it and stop sending before you hit the limit, not after.

HTTP 404 Not Found
{"message": "Unknown Webhook", "code": 10015}

Channel was deleted, the entire Discord server was deleted, or the webhook was removed from Server Settings > Integrations. Recreate the webhook and update.

telnet: connection refused
ERROR: cannot connect to 127.0.0.1:8081

Game server hasn't bound to telnet yet (still starting), telnet is disabled in serverconfig.xml (TelnetEnabled=false), or post-V2.6 the bind address moved to localhost and your bridge is on a different machine. Check TelnetEnabled, TelnetPort, and TelnetAllowedIPs in serverconfig.xml.

Bridge auth failed:
"Password incorrect" - server rejected telnet password

Telnet password in the bridge config doesn't match TelnetPassword in serverconfig.xml. Note: special characters in passwords sometimes need escaping in YAML/JSON bridge configs. Test with a simple alphanumeric password first; rotate to a strong one after confirming the bridge works.

Troubleshooting: It Works, Then Stops

Messages stopped landing in Discord overnight

Three suspects, in order:

  1. Telnet connection died. The game server restarts on a schedule; many bridge tools do not auto-reconnect. Check the tool's log for "connection refused" or "EOF on socket"; restart the bridge.
  2. Webhook URL was regenerated. Someone in your Discord admin team rotated the URL; your tool still has the old one. Update the configuration.
  3. Rate-limit cooldown. If you sent a flood (Blood Moon, server-load script bug), Discord put your webhook on cooldown for 5-60 minutes. Check Discord's audit log; wait it out.

Messages duplicate (same event posts 2-3 times)

You have two tools wired to the same webhook (e.g., CSMM and a custom script both forwarding joins). Pick one source per event; disable the other.

Chat bridge sends messages from Discord but the game does not show them

Telnet authentication for the bridge worked, but the bridge does not have permission to post in-game. The bridge user (whatever it is logged in as via telnet) needs admin permission in your serveradmin.xml. Add the bridge as permission_level="0".

The bot posts but cannot see existing channel history

Webhooks do not read history (they only POST). If you want history, you need a real bot user with the Read Messages scope. Switch from webhook to bot integration; CSMM and Dishorde both use bots.

What Changed in 2026

The 7DTD V2.0 to V2.6 transition (during 2025-2026) broke many older Discord integration mods. If you find a guide that recommends a tool not listed above, it is probably abandoned. The maintained tools as of May 2026 are CSMM (active, GitHub commits weekly), Dishorde (active, smaller scope), and ServerTools (active, version-tracking V2.6).

Discord itself shipped two relevant changes in 2025-2026:

  • Linked Roles + Server Subscriptions can now be combined with a bot to gate access to your in-game-chat channel by Steam-account verification. CSMM supports this in their 2026.x releases.
  • Forum-style channels are now the preferred shape for #player-activity on large servers. Posting joins/deaths to a forum thread instead of a flat channel keeps your Discord scrollable.