DWEEB
Workflow guide · Forum posts and threads

Send Discord Webhooks to Forum Posts and Threads

If Discord answered "Webhooks posted to forum channels must have a thread_name or thread_id", your webhook belongs to a forum or media channel and the request did not say which post to use. A forum post is a thread inside its parent channel: add thread_name to create a new post, or add thread_id to the URL to reply inside an existing one. This guide shows both — in a raw request, in an automation tool and in DWEEB.

Fix “must have a thread_name or thread_id” (error 220001)

A text channel accepts webhook messages directly. A forum or media channel does not: everything in it lives inside a post, so Discord needs to know which post a message belongs to. Pick one of the two fixes below — never both, or the request fails the other way.

Add "thread_name" to the JSON body to create a new post titled with that text, or add ?thread_id=POST_ID to the webhook URL to send into a post that already exists. The table lists every thread-related error with the exact message Discord returns, so you can match the one in your logs.

Fix “must have a thread_name or thread_id” (error 220001)
Discord's messageCodeWhat it meansFix
Webhooks posted to forum channels must have a thread_name or thread_id220001The webhook's channel is a forum or media channel and the request named no postAdd "thread_name" to the body for a new post, or ?thread_id= to the URL for an existing one
Webhooks posted to forum channels cannot have both a thread_name and thread_id220002The request asked to create a post and reply in one at the same timeRemove thread_name when replying; remove thread_id when creating
Webhooks can only create threads in forum channels220003thread_name was sent to a webhook in an ordinary text channelDrop thread_name; to post inside an existing thread there, use ?thread_id=
Unknown Channel10003The thread_id is not a thread under this webhook's channel, or it was deletedCopy the ID from inside the post and use that channel's own webhook

Fix it in a script or an automation tool

Both fixes are one change to the request you already send. The first command creates a new forum post; the second replies inside an existing post. Add wait=true when you need the response: the message it returns carries the new post's ID as its channel_id, which is the thread_id for every later reply to that post.

In a no-code tool that only lets you paste a URL — a CI job, a monitoring alert, a form service — append ?thread_id=POST_ID to the webhook URL, and every message that tool sends lands in that one post. A tool that lets you add JSON fields can create posts instead by adding thread_name. The cURL guide and the Python and JavaScript guides cover the rest of each request.

# Create a new forum post (thread_name in the JSON body)
curl -H "Content-Type: application/json" \
  -d '{"thread_name": "Release notes: 2.4", "content": "What changed this week"}' \
  "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN?wait=true"

# Reply inside an existing post or thread (thread_id in the URL)
curl -H "Content-Type: application/json" \
  -d '{"content": "Hotfix 2.4.1 is out"}' \
  "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN?thread_id=POST_ID"

# Python requests: the same two calls
requests.post(url, params={"wait": "true"}, json={"thread_name": "Release notes: 2.4", "content": "What changed"})
requests.post(url, params={"thread_id": post_id}, json={"content": "Hotfix 2.4.1 is out"})

Choose a new post or an existing thread

For a forum or media destination, Discord requires a new post title or an existing thread target. Use one path at a time. The webhook belongs to the parent channel; the thread ID identifies a child destination within it.

Decide based on how members should find the information. Use a new post for a separate topic such as each release's notes. Use an existing thread for a follow-up on that topic. Use Update for a correction to the original message so readers do not have to reconstruct the current version from several posts.

Choose a new post or an existing thread
Your goalDWEEB controlRequest field
Create a forum or media postForum post → Thread namethread_name in the JSON body
Send into an existing post or threadSend → optional Thread IDthread_id in the request query
Change a message already postedRestore, then UpdateOriginal message ID and its thread target

Create a new forum post in DWEEB

The editor limits Thread name to 100 characters and Applied tags to 5 IDs. When a known forum destination is missing a title, its validation issue leads back to the Forum post fields. A tag belongs to a particular channel's configuration; copying a template's text does not create matching tags in another server.

  • Build the first message, then select the forum or media channel in the connected destination flow or supply that channel's webhook URL.
  • Open Forum post in the builder's message options and enter Thread name. This title is separate from any heading written inside your Text Display.
  • Add Applied tags if needed, using tag IDs from this destination's configured tags. DWEEB accepts comma- or space-separated IDs.
  • Leave the Send panel's optional Thread ID empty, review the destination and confirm the new post.
  • Keep the returned Discord message link. DWEEB records the new thread target after a successful send so an in-place update reaches the post you just created.

JSON example for a new forum post

This is a complete small V2 design you can import into DWEEB. The top-level thread_name creates the forum title, while the Text Display contains the post body. The mention policy makes it suitable for a first connectivity test without mention pings.

When sending from your own client, POST this JSON to the parent channel's webhook URL with with_components=true and wait=true. Keep the returned message ID and channel ID with your application record. Do not put a live webhook credential in a shared example or source file.

{
  "flags": 32768,
  "thread_name": "Release notes: community update",
  "allowed_mentions": { "parse": [] },
  "components": [
    {
      "type": 10,
      "content": "## Community update\nShare feedback and questions in this post."
    }
  ]
}

Send into an existing thread or forum post

In Discord with Developer Mode enabled, copy the thread's Channel ID. Open DWEEB's Send panel, expand the optional thread or forum-post control and paste it into Thread ID. Use a webhook for the parent channel, clear Thread name and any create-only tag settings, then review the send destination.

In your own code, thread_id belongs in the webhook URL's query string, not inside the components tree. Keep the normal exported V2 body, without thread_name. An ID from an unrelated text channel cannot be used to make the webhook post there; choose that channel's own destination instead.

An archived post is not a dead end: Discord unarchives the thread automatically when a webhook sends into it with thread_id. A locked thread is different — check its state and the posting app's access before retrying.

POST https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN?with_components=true&wait=true&thread_id=THREAD_ID

Add forum tags with applied_tags

A new post can carry the forum's tags: send "applied_tags" beside "thread_name" as an array of tag IDs, for example "applied_tags": ["1234567890123456789"]. Tags only apply when creating a post, and only in forum and media channels.

Use the tag's ID, not its visible name. Tag IDs are part of the forum channel's own configuration — the available_tags list on the channel object — so the same tag name in another server, or in another forum of the same server, has a different ID.

Restore and edit a message inside a forum post

Copy the complete message link from inside the post and open Restore. Keep the original webhook selected and supply the thread target if the workflow needs it. After the message loads, edit the design and choose Update. Changing Text Display content edits that message; the Forum post title field is for creating a new post.

In the embedded Discord Activity, the collaboration room belongs to the server where the Activity launched. Restore can confirm a sibling-channel switch within that server. For a message in another server, open the draft on the web and choose the appropriate destination there. A server switch cannot travel with the original collaboration room.

See editing webhook messages for ownership requirements. A fresh webhook URL is not a substitute for the webhook that sent the original message.

Troubleshoot forum and thread delivery

For a locked thread, inspect its state and the access available to the posting app before retrying. A successful preview cannot determine whether the destination is currently writable. The webhook troubleshooting guide covers the broader HTTP errors, with every common error message quoted exactly, and how to read a field-specific response.

Troubleshoot forum and thread delivery
ProblemCheck in your design or destination
220001: no forum targetEnter a Thread name for a new post or the existing Thread ID
220002: conflicting targetsClear the target for the operation you are not performing
10003: unknown channelCheck the thread's parent against the selected webhook's channel
Every send creates another postThe request still has thread_name; send follow-ups with the first post's thread_id, or Update the original
Missing or invalid tagsUse tag IDs configured for this forum, not role IDs or visible tag names
Message lands in the wrong postThe thread_id is from another post; copy the ID from inside the post you want

Frequently asked questions

What does “Webhooks posted to forum channels must have a thread_name or thread_id” mean?

The webhook belongs to a forum or media channel, where every message has to live inside a post, and the request did not say which one. Add thread_name to the JSON body to create a new post, or add ?thread_id=POST_ID to the webhook URL to send into an existing post.

How do I send a Discord webhook to a specific thread?

Append ?thread_id=THREAD_ID to the webhook URL and send the message as usual. The webhook must belong to the thread's parent channel, and Discord unarchives an archived thread automatically when the message arrives.

How do I create a forum post with a webhook?

Send the message to the forum channel's webhook with a thread_name field in the JSON body; that text becomes the post title. Add applied_tags with the forum's tag IDs if the post should carry tags.

Can a webhook create a thread in a normal text channel?

No. thread_name only creates posts in forum and media channels; in a text channel Discord answers with error 220003. A webhook can still post inside an existing thread there by adding thread_id to the URL.

Why does my forum webhook create a new post every time?

Every request that includes thread_name creates a new post. Send the first message with wait=true, keep the channel_id from the response — that is the new post's ID — and send later messages with it as thread_id.

Put the guide into practice

Open the exact workflow in DWEEB. Nothing posts until you review and confirm it.

Build a forum post visually →

Primary sources

Keep learning