Guide · Make.com · Discord

Make.com + Discord: post updates with webhooks or a bot

Short answer: The simplest way to post from Make into a Discord channel is a Discord webhook. Create it in the channel's settings, then send JSON to its URL with Make's HTTP → Make a request module. No bot needed. Use Make's Discord app (Make's bot, connected with OAuth) when you need more than posting: DMs, threads, roles, channels, or posting to many channels with one connection. Both support embeds for tidy, formatted messages.

By Flowpaja · Published

A form or Stripe event sent by Make's HTTP module to a Discord webhook with wait=true, posting an embed for about 2 credits
Add ?wait=true to the webhook URL so a message Discord didn't save shows up as an error.
Disclosure: everything in this guide works with plain Make.com and the apps it connects. At the end we mention our own Make templates and our Make scenario fix service on Fiverr. Module names, settings and limits were checked against Make's Discord app docs and Discord's webhook docs in October 2026. Menus and limits change, so check them if something looks different.

Some links on this page are affiliate links. If you sign up through them, Flowpaja may earn a commission at no extra cost to you.

What you need

  • A Make account. The free plan is plenty for a few notifications a day. Sign up here if needed: Make (affiliate link)
  • A Discord server where you have the Manage Webhooks permission (for webhooks) or can authorise apps (for the Discord app).
  • A source of updates: a form, a Stripe account, or an RSS feed.

Honest limits:

  • Discord is built for communities. It's not a good place for sensitive customer data, because anyone in the channel can read it.
  • Discord limits how fast you can post (see "Rate limits"). It suits notifications, not bulk messaging.

Webhooks vs the Discord app

Discord webhook (via HTTP module)Make's Discord app
SetupCopy a URL from the channel settingsCreate a connection, pick the server, allow permissions, click Authorize
Post messages and embedsYes, to that one channelYes, to channels, threads, or as a DM to a server member (Send a Message)
Other actionsNoneRoles, channels, invites, events, reactions, editing and deleting messages
Read messagesNoLimited. With Make's own bot, Watch Channel Messages returns empty content for other people's messages (Discord's message content intent). You need your own Discord app credentials for full content.
Custom name/avatar per messageYes (username, avatar_url)Posts as the bot
Main riskAnyone with the URL can post to your channelBot permissions too broad

Rule of thumb: for "post an update to a channel", use a webhook. It's the least setup and has the fewest moving parts.

(The Discord app also has Create a Webhook Bot and Send a Message by Webhook Bot, which create and use channel webhooks through the connection. The plain HTTP route below gives you full control over the JSON.)

Step 1: Create a Discord webhook

  1. In Discord, open the channel → Edit Channel (gear icon) → Integrations → Webhooks → New Webhook (or Create Webhook if it's the first one).
  2. Give it a name, e.g. "Make notifications", and optionally an avatar.
  3. Click Copy Webhook URL.

The URL contains a secret token. Treat it like a password. If it leaks, delete the webhook and create a new one.

Step 2: Post a first message from Make

  1. Create a scenario. For a first test, the HTTP module can run on its own.
  2. Add HTTP → Make a request:
    • Authentication type: No authentication (the token is in the URL)
    • URL: your webhook URL, with ?wait=true added at the end
    • Method: POST
    • Body content type: application/JSON
    • Body input method: Data structure (recommended, see below) or JSON string
    • For a quick JSON string test:
{
  "content": "Hello from Make 👋",
  "username": "Flowpaja Bot"
}
  1. In the advanced settings, set Return error if HTTP request fails to Yes. Otherwise a 4xx or 5xx response from Discord doesn't stop the run, and a failed post can look like a success.
  2. Click Run once. The message appears in the channel.

Why ?wait=true: without it, Discord answers 204 No Content and, according to its docs, a message that isn't saved doesn't return an error. With wait=true, Discord confirms the send and returns the created message, including its ID.

Why Data structure: with Data structure, Make escapes quotes and line breaks in mapped values for you. With JSON string, a form answer containing " breaks the JSON. Use JSON string only for fixed test text.

Step 3: Use embeds for readable messages

Embeds give you a title, description, colour, fields and a footer. The payload looks like this (build the same shape in your data structure, or use it as a JSON string for fixed values):

{
  "username": "Orders",
  "embeds": [
    {
      "title": "New order {{1.order_number}}",
      "url": "{{1.admin_link}}",
      "description": "{{1.item_count}} item(s)",
      "color": 3066993,
      "fields": [
        { "name": "Total", "value": "{{1.total}} {{1.currency}}", "inline": true },
        { "name": "Source", "value": "{{1.source}}", "inline": true }
      ],
      "footer": { "text": "Sent by Make" },
      "timestamp": "{{formatDate(now; "YYYY-MM-DDTHH:mm:ssZ")}}"
    }
  ]
}

Embed rules that often cause errors:

  • color is a decimal number, not #2ecc71. 3066993 is that green in decimal.
  • Field value can't be empty. Use {{ifempty(…; "n/a")}}.
  • Discord's limits: 2,000 characters for content; per embed, 256 for the title, 4,096 for the description, up to 25 fields (name 256, value 1,024), footer 2,048; up to 10 embeds per message and 6,000 characters across all embeds combined. Going over returns 400 Bad Request. Shorten long text with substring().
  • At least one of content or embeds must have a value, or Discord rejects the message.

Worked examples

A. Form submissions → Discord

  1. Webhooks → Custom webhook (your form sends to it), or your form tool's instant trigger. New to webhooks? See the Make webhook tutorial.
  2. Filter: message exists.
  3. HTTP → Make a request to the Discord webhook, with an embed: title "New form message", fields for name and topic, and the message as the description (shortened with substring()).

Credits per submission: webhook 1 + HTTP 1 = 2 credits. Leave out the email address, unless the channel is private and only for staff.

B. Stripe payments → Discord

  1. Stripe → Watch Events (instant), event type e.g. payment_intent.succeeded or checkout.session.completed.
  2. HTTP → Make a request with an embed: "Payment received", amount and currency.
    • Stripe amounts are in the smallest currency unit, e.g. cents for EUR or USD. Show them as {{formatNumber(1.amount / 100; 2)}}.
    • Zero-decimal currencies such as JPY or KRW are already in whole units, so don't divide those by 100. Stripe's docs list them all.

Credits per payment: 2 (trigger + HTTP). Don't post customer names or emails into a public channel.

C. RSS feed → Discord

  1. RSS → Watch RSS feed items, scheduled every few hours, with a maximum of e.g. 5 items per run.
  2. HTTP → Make a request: content = New post: {{1.title}} {{1.url}}.

Credits:

  • RSS is a polling trigger: 1 credit per check, even with nothing new, plus 1 per posted item.
  • Every 4 hours ≈ 180 checks a month, plus the posts.
  • Every 15 minutes ≈ 2,880 checks, which is more than the free plan's 1,000.

See Make credits explained.

Keep notifications useful (and safe)

A channel that pings people for every small event soon gets muted. A few habits help:

  • Block unwanted pings from user content. If a form answer contains @everyone or @here, Discord may ping the whole server. Add this to the payload, so mentions in the text are shown but don't notify anyone:
"allowed_mentions": { "parse": [] }
  • Ping on purpose only. If an urgent alert should notify one role, put the mention in content (<@&ROLE_ID>) and allow only that role:
"allowed_mentions": { "parse": [], "roles": ["ROLE_ID"] }
  • One channel per kind of update. For example #orders, #forms and #blog, so people can mute what they don't need.
  • Summaries over streams. For frequent events, a daily digest built with an aggregator is often more useful than 40 separate messages.

Rate limits

Discord applies rate limits per route (each webhook and each channel has its own bucket) and a global limit of 50 requests per second per bot. Discord doesn't publish fixed numbers for each webhook. It tells you the current limits in response headers, and asks developers not to hard-code them. When you hit a limit, Discord answers 429 Too Many Requests, with a retry_after value telling you how long to wait.

In Make:

  • Don't post 50 items in one run. Lower the trigger's maximum, or combine items into one message with an aggregator.
  • Add a Retry error handler (formerly Break) on the HTTP module for 429 and 5xx errors, with Store incomplete executions turned on. Error handlers don't use credits.
  • If you post bursts often, add Tools → Sleep (e.g. 1–2 seconds) between posts. Each Sleep run also uses a credit.
  • Fix broken webhook URLs quickly. Discord temporarily blocks IP addresses that send too many invalid requests (401, 403, 429), so don't leave a scenario hammering a deleted webhook.

Using Make's Discord app instead

If you choose the Discord app in Make:

  1. Add a module, click Create a connection, select your server, allow the message and channel permissions, and click Authorize.
  2. Make sure the bot can View Channel, Send Messages and Embed Links in the target channel.
  3. Use Discord → Send a Message, choose Send a Message to a Channel (or to a thread, or a DM to a member), and pick the channel. Embeds have their own fields in the module.

Good for: posting to many channels without managing many webhook URLs, or jobs that need more than posting. Downside: the bot needs the right permissions in every channel, and those are easy to break when roles change. To read message content with Watch Channel Messages, you need a connection with your own Discord app (bot token, client ID and secret) and the message content intent switched on in Discord's developer portal.

Common errors

ErrorCauseFix
404 Unknown WebhookWebhook deleted, or URL copied wrongCreate a new webhook; paste the full URL
401 Invalid Webhook TokenToken part of the URL wrongRe-copy the URL
400 Cannot send an empty messageNo content and no embeds, or the mapped values are emptyAdd a filter (e.g. message exists); use ifempty()
400 Invalid Form BodyBad embed: colour as text, empty field value, text too longColour as a decimal number; fill empty values; shorten text
400 "The request body contains invalid JSON"Quotes or line breaks in mapped text broke a JSON stringSwitch Body input method to Data structure
403 Missing Permissions (Discord app)Bot lacks Send Messages or Embed Links in the channelFix the role permissions for that channel
Empty message content in Watch Channel MessagesMake's bot can't read others' message contentUse a connection with your own Discord app and the message content intent
429 Too Many RequestsRate limitFewer posts per run; aggregate; Retry; Sleep
Run shows success but no messageReturn error if HTTP request fails is off, or no wait=trueTurn the option on; add ?wait=true; check the status code

More error types and handlers: Make error cheat sheet.

Related guides: Make webhook tutorial · All Make integration guides

FAQ

Do I need a Discord bot to post from Make?
No. For posting to one channel, a Discord webhook and Make's HTTP module are enough. Use the Discord app when you need more than posting, such as DMs, threads, roles or many channels.
How do I send a Discord embed from Make?
Send JSON with an embeds list to the webhook URL using HTTP Make a request. Use a decimal colour number, avoid empty field values, and keep text within Discord's limits.
Why does Discord return Invalid Form Body?
The JSON is valid, but something in it breaks Discord's rules, such as a colour written as text, an empty field value, or text that's too long.
Why do I get error 429 from Discord?
You're posting too fast for Discord's rate limits. Post fewer messages per run, combine updates into one message, and add a Retry handler.
How many credits does a Discord notification use?
Usually 2 per update: 1 for the trigger and 1 for the HTTP module. Polling triggers like RSS also use 1 credit per check, even when nothing is new.

Discord posts failing?

Send the exported blueprint and the failed run's error text to our Make scenario fix service on Fiverr. No logins needed.

Stuck on an error in your own Make scenario? Make scenario fix / debugging on Fiverr, from $25: send the exported blueprint and a description of the error, no logins needed.

← All guides · All templates

Make, Discord, Stripe and the other app names mentioned are trademarks of their owners. Flowpaja is independent and not affiliated with or endorsed by them. Menus, prices and features change; check the providers' current pages.