When you send messages through a Discord webhook from an automated system, you may notice that messages arrive in the wrong order. This is called a race condition. It happens when two or more requests are sent at nearly the same time, and Discord processes them in a different order than you intended. This article explains what causes this race condition and provides concrete fixes to ensure your webhook messages appear in the correct sequence.
Key Takeaways: Fixing Discord Webhook Message Order
- Webhook request queueing: Send messages one at a time with a small delay between each to prevent concurrent processing.
- Use a timestamp field: Add a
timestampparameter to each webhook payload so Discord can sort messages by time. - Server-side rate limiting: Implement your own rate limiter that waits for each response before sending the next request.
Why Discord Webhooks Deliver Messages Out of Order
Discord webhooks accept HTTP POST requests and post the content to a channel. When you send multiple requests in rapid succession, each request is processed independently. Discord does not guarantee the order of processing. If two requests arrive at the server within the same millisecond, the server may process the second request first. This is a classic race condition caused by concurrent execution. The webhook endpoint has no built-in queue or ordering mechanism. The problem is most visible when you send messages from a script or bot that fires multiple webhook calls in a loop without waiting for a response.
Prerequisites for Fixing the Race Condition
Before applying the fixes, confirm the following:
- You have the webhook URL from Discord. Go to Server Settings > Integrations > Webhooks and copy the URL.
- You have permission to use the webhook. You need Manage Webhooks permission on the server.
- You are able to edit the code or script that sends the webhook requests.
Methods to Fix Out-of-Order Webhook Messages
There are three reliable methods to prevent race conditions. Choose one that fits your setup.
Method 1: Add a Delay Between Requests
The simplest fix is to pause between each webhook request. This ensures Discord receives and processes them in the order you send them.
- Identify the code that sends webhook requests
Locate the loop or function that calls the webhook URL. This could be in a Python script, a Node.js app, or a CI/CD pipeline. - Add a delay after each request
Insert a sleep or wait command before sending the next message. A delay of 200 to 500 milliseconds is usually enough. Example in Python:time.sleep(0.3). In JavaScript:await new Promise(r => setTimeout(r, 300));. - Test the sequence
Send three test messages with different content and verify they appear in the channel in the correct order.
Method 2: Use the Timestamp Parameter
Discord webhook payloads support a timestamp field. When you include this field, Discord sorts messages by timestamp, overriding any processing order issues. This method works best when you cannot add delays.
- Prepare the JSON payload
Include atimestampkey with an ISO 8601 date string. Example:{"content":"Message 1","timestamp":"2025-04-01T10:00:00.000Z"}. - Assign sequential timestamps
In your code, generate each timestamp with an increment of at least one millisecond. Use the system clock or a counter. In Python:from datetime import datetime, timezone, timedeltaand createdatetime.now(timezone.utc) + timedelta(milliseconds=i)for each message i. - Send all requests without delay
You can fire requests simultaneously. Discord will display them in timestamp order.
Method 3: Implement a Sequential Queue
For advanced users, create a local queue that sends one request at a time and waits for the HTTP response before sending the next. This guarantees order regardless of network latency.
- Create a queue data structure
Use a list or array to hold the messages you want to send. Example in JavaScript:const queue = [];. - Write a dequeue function
This function takes the first item from the queue, sends it viafetchorrequests.post, and calls itself again after receiving a 200 OK response. Use recursion or a while loop withawait. - Add error handling
If a request fails, retry it up to three times before moving to the next item. Log errors for debugging. - Start the queue processor
Call the dequeue function once. It will process all items in order.
If Discord Still Has Issues After the Main Fix
Even after applying one of the above methods, you may still see occasional out-of-order messages. Here are additional checks.
Messages from Different Sources Interleaving
If multiple scripts or bots use the same webhook URL, they can still cause race conditions. Each source must coordinate. Use a single queue manager that all sources push messages to. Alternatively, assign each source its own webhook URL and combine channels with a bot that reads from multiple webhooks.
Discord Server Latency
High latency on Discord’s side can cause messages to appear out of order even with timestamps. The timestamp field is a suggestion, not a guarantee. To improve reliability, add a 100 millisecond delay between requests even when using timestamps.
Webhook Rate Limits
Discord enforces rate limits on webhooks: 5 requests per second per webhook. If you exceed this, Discord returns a 429 Too Many Requests error and may drop or reorder messages. Respect the Retry-After header in the response. Implement exponential backoff in your queue.
Webhook Ordering Methods: Delay vs Timestamp vs Queue
| Item | Add Delay | Use Timestamp | Sequential Queue |
|---|---|---|---|
| Implementation complexity | Low | Medium | High |
| Requires code changes | Yes | Yes | Yes |
| Prevents race condition | Yes, if delay is long enough | Yes, with accurate timestamps | Yes, guaranteed |
| Works with concurrent requests | No | Yes | No |
| Respects rate limits | Yes, if delay is 200ms or more | No, can still hit rate limit | Yes, by waiting for responses |
Discord webhook race conditions are a common problem for developers automating notifications. Adding a small delay between requests is the quickest fix. Using the timestamp parameter gives you more flexibility for concurrent sends. A sequential queue provides the strongest guarantee of correct order. Choose the method that matches your technical skill and the reliability you need. For production systems, combine a queue with timestamps for maximum accuracy.