Moving multiple Discord channels from one server to another can be a tedious task if done manually. You need to recreate each channel, copy permissions, and repost messages. Discord does not provide a built-in move or copy feature for channels. This article explains how to use webhook export tools to transfer multiple text channels, including message history, from a source server to a target server. You will learn the exact steps to export channel content and import it into new channels while preserving message structure and timestamps.
Key Takeaways: Moving Discord Channels with Webhook Export
- Webhook export tool (e.g., DiscordChatExporter): Exports all messages from a text channel into a JSON or CSV file that preserves timestamps, usernames, and content.
- Discord webhooks: A server integration that can post messages programmatically using a unique URL; used here to replay exported messages into new channels.
- Server Settings > Integrations > Webhooks: The menu path to create a webhook URL in the target server for each channel you want to populate.
How Webhook Export Tools Work for Channel Migration
Discord does not allow you to move a channel between servers. The only way to transfer the content is to export messages from the source channel and then import them into a new channel on the target server. Webhook export tools like DiscordChatExporter (free, open-source) capture every message in a channel, including embeds, attachments, and reactions. The exported file can then be used with a script or a webhook import tool to replay those messages into the target channel.
The process has three phases: export, channel creation, and import. You must have the Manage Server permission on the source server to export messages and the Manage Webhooks permission on the target server to create webhooks. Discord’s API rate limits apply during the import phase, so large channels may take several hours to transfer.
Prerequisites Before Moving Channels
Before you begin, confirm you have the following:
- Source server access: You need the Manage Server permission on the server where the channels currently exist.
- Target server access: You need the Manage Server and Manage Webhooks permissions on the server where you want to create the new channels.
- DiscordChatExporter installed: Download the latest release from the official GitHub repository. It runs on Windows, macOS, and Linux.
- Python or a webhook import script: Optional but recommended for automated replay. A simple Python script using the
requestslibrary can read the exported JSON and post messages via webhook.
Step-by-Step: Export Channels from the Source Server
- Open DiscordChatExporter
Launch the application. If you are using the CLI version, open a terminal and navigate to the folder containing the executable. - Obtain your Discord token
In Discord, press Ctrl+Shift+I to open Developer Tools. Go to the Application tab, then Local Storage. Click the discord.com entry and look for thetokenkey. Copy its value. Keep this token private — it grants full access to your account. - Enter the token in DiscordChatExporter
In the GUI version, paste the token into the Token field and click Fetch Guilds. In the CLI version, use the command:DiscordChatExporter.Cli exportguild -t YOUR_TOKEN -g GUILD_ID. Replace YOUR_TOKEN and GUILD_ID with your token and the source server ID. - Select the channels to export
After fetching guilds, a list of channels appears. Check the boxes next to the text channels you want to move. You can also select all channels by checking the top box. - Choose export format and output folder
Select JSON as the export format. JSON preserves the most data, including message IDs and timestamps. Choose a folder on your computer where the export files will be saved. Click Export. - Wait for the export to finish
The tool will download all messages from each selected channel. Large channels with thousands of messages may take several minutes. Once complete, you will have one .json file per channel.
Step-by-Step: Create Channels and Webhooks on the Target Server
- Create new text channels
On the target server, right-click the channel list and select Create Channel. Choose Text channel. Give the channel the same name as the source channel for consistency. Repeat for each channel you are moving. - Open channel settings
Click the gear icon next to the new channel name. Select Integrations from the left menu. - Create a webhook
Click Create Webhook. Give the webhook a name, such as “Import Bot.” Click Copy Webhook URL and save it in a text file. Repeat this step for each new channel, saving the URL alongside the corresponding channel name. - Set channel permissions (optional)
If the source channel had specific permission overrides, recreate them on the target channel. Go to the Permissions tab and add the same role or member overrides.
Step-by-Step: Import Messages Using Webhooks
You can import messages manually by posting each message via webhook, but that is impractical for more than a few messages. Use a script to automate the process. Below is a Python example that reads the exported JSON file and posts messages to the webhook URL.
- Install Python and requests
Download Python from python.org. Open a terminal and runpip install requests. - Create the import script
Open a text editor and paste the following code. Save it asimport_channels.py.
import json
import requests
import time
# Replace with your webhook URL
WEBHOOK_URL = "https://discord.com/api/webhooks/..."
# Path to the exported JSON file
EXPORT_FILE = "channel_export.json"
with open(EXPORT_FILE, "r", encoding="utf-8") as f:
messages = json.load(f)
for msg in messages:
# Build the payload
payload = {
"content": msg["content"],
"username": msg["author"]["name"],
"avatar_url": msg["author"]["avatarUrl"]
}
# Add attachments if present
if msg.get("attachments"):
payload["content"] += "\n" + "\n".join([a["url"] for a in msg["attachments"]])
response = requests.post(WEBHOOK_URL, json=payload)
if response.status_code == 429:
# Rate limited — wait and retry
time.sleep(5)
response = requests.post(WEBHOOK_URL, json=payload)
# Wait 1 second between messages to avoid rate limits
time.sleep(1)
print("Import complete.")
- Run the script for each channel
Open a terminal in the folder containing the script. Runpython import_channels.py. The script will post each message from the export file into the channel associated with the webhook URL. Repeat for each channel, changing the WEBHOOK_URL and EXPORT_FILE variables accordingly. - Verify the imported messages
Check the target channels to ensure messages appear in the correct order. Timestamps will reflect the time of import, not the original time. To preserve original timestamps, you would need a bot with the Manage Webhooks permission and the ability to modify message creation time — standard webhooks cannot do this.
Common Issues After Moving Channels
Messages appear in reverse order
The export file may list messages from oldest to newest. The script above posts them in the order they appear in the file. If messages appear reversed, reverse the list before posting. Add messages.reverse() after the with open block.
Rate limit errors during import
Discord limits webhook posts to 30 messages per minute per webhook. The script includes a 1-second delay. If you still get 429 errors, increase the delay to 2 seconds. For very large channels, consider splitting the export into multiple files and importing over several hours.
Attachments and embeds are not preserved
Standard webhooks can only post text and links to attachments. The original files are not re-uploaded. The script above adds attachment URLs as plain links. To preserve actual files, you would need to download each attachment and re-upload it via the webhook, which is complex and time-consuming. Most users accept that attachments are lost during migration.
Channel permissions are not copied
The export and import process does not transfer permission overrides. You must manually recreate any role or member-specific permissions on the target channels. Use the same role names on the target server to simplify this.
Comparison: Manual Copy-Paste vs Webhook Export vs Bot Migration
| Item | Manual Copy-Paste | Webhook Export | Bot Migration |
|---|---|---|---|
| Message history preserved | No | Yes (text and links) | Yes (text, attachments, timestamps) |
| Attachments preserved | No | Links only | Yes (re-uploaded) |
| Time required for 1000 messages | Hours | ~17 minutes | ~5 minutes |
| Permissions transferred | No | No | Yes (with bot permissions) |
| Technical skill required | None | Low (run tool + script) | Medium (bot setup) |
The webhook export method is the best balance of speed and simplicity for most users. If you need full attachment preservation and permission copying, consider using a dedicated migration bot like Channel Mover or Xenon.
You can now move multiple Discord channels between servers using webhook export tools. Start by exporting channels with DiscordChatExporter, then create new channels and webhooks on the target server. Use the provided Python script to import messages automatically. For a more complete migration that includes attachments and permissions, explore bot-based solutions like Xenon. Always test the import on a small channel first to verify the script works with your export file.