Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Discord

Connect FlutterFlow to Discord using a Channel Webhook URL — create it in your Discord server settings, then POST {"content": "message"} or a rich embeds payload from a FlutterFlow API Call with no auth header needed. The webhook URL itself is the credential. For rich embed cards, use the structured embeds JSON format and remember that embed color must be a decimal integer, not a hex string.

What you'll learn

  • How to create a Discord channel webhook and copy its URL
  • How to build a FlutterFlow API Call that posts plain text messages to Discord
  • How to structure rich embed payloads with titles, descriptions, and colors
  • Why embed color must be a decimal integer (not hex) and how to convert it
  • How Discord's 5-requests-per-2-seconds rate limit works and how to avoid hitting it
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner16 min read15 minutesCommunicationLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Discord using a Channel Webhook URL — create it in your Discord server settings, then POST {"content": "message"} or a rich embeds payload from a FlutterFlow API Call with no auth header needed. The webhook URL itself is the credential. For rich embed cards, use the structured embeds JSON format and remember that embed color must be a decimal integer, not a hex string.

Quick facts about this guide
FactValue
ToolDiscord
CategoryCommunication
MethodFlutterFlow API Call
DifficultyBeginner
Time required15 minutes
Last updatedJuly 2026

Posting to Discord from Your FlutterFlow App

Discord is no longer just a gaming platform — it's become the community hub for developer communities, creator audiences, startup teams, and product builders. For a FlutterFlow app founder, the ability to post automated notifications to a Discord channel is immediately useful: alert your team about new users, post community updates, notify moderators about flagged content, or build a real-time activity feed for your Discord community. The best news is that Discord's Channel Webhook makes this one of the fastest integrations in this entire library — you can have messages posting to Discord within 15 minutes, with zero authentication setup.

Discord Channel Webhooks work like a drop-box URL: you create a webhook on any channel you have Manage Webhooks permission for, and Discord gives you a unique URL. Any HTTP POST to that URL with the right JSON body creates a message in that channel. The URL is the only credential — no headers, no tokens, no OAuth flows. Discord's free plan includes webhooks, and you can create multiple webhooks on the same channel or different channels.

Beyond plain text, Discord webhooks support rich embeds: structured message cards with a title, description, URL link, timestamp, color-coded left sidebar, thumbnail image, and up to 25 field rows. Embeds are what make Discord notifications look professional and information-dense. One important technical detail: the embed color must be specified as a decimal integer (e.g., 5814783 for blue, 15158332 for red) — not as a hex string like '#58B9FF'. Sending a hex string is the most common cause of 400 Bad Request errors on Discord embed payloads. The rate limit for webhooks is approximately 5 requests per 2 seconds per webhook URL — sufficient for most app notification patterns but worth planning around for high-frequency events.

Integration method

FlutterFlow API Call

FlutterFlow creates an API Call that POSTs directly to a Discord Channel Webhook URL. Discord generates this URL in the channel's integration settings — no bot, no OAuth, no auth header needed. The URL itself authenticates the request. For rich embed cards (titles, descriptions, colored sidebars, thumbnail images), you POST an embeds array instead of a plain content string. For two-way interaction (reading messages, responding to slash commands), you need a Discord Bot running in a Cloud Function — that path is described as optional in this guide.

Prerequisites

  • A Discord account with at least one server where you have Manage Webhooks permission on a channel
  • A FlutterFlow project (no Firebase or backend required for the basic webhook path)
  • The Discord channel where notifications should be posted
  • For the optional Bot path: a Firebase project with Cloud Functions on the Blaze plan

Step-by-step guide

1

Create a Discord channel webhook and copy the URL

Open Discord in your browser or desktop app and navigate to the server where you want to receive FlutterFlow notifications. Find the channel you want to post to — or create a new dedicated channel like #app-notifications or #new-orders. Right-click on the channel name (or click the gear icon on hover) to open Channel Settings. In the channel settings sidebar, click Integrations. On the Integrations page, click Create Webhook (or Webhooks, then New Webhook if webhooks already exist). A webhook editor appears. Click the default webhook name 'Spidey Bot' and rename it to something descriptive — this name appears as the message sender in Discord (e.g., 'FlutterFlow App', 'Order Bot', 'Alerts'). Optionally, click the avatar area to upload a profile picture for the webhook sender — this makes your notifications look polished and identifiable at a glance. Click Copy Webhook URL. The URL looks like: https://discord.com/api/webhooks/1234567890/XXXXX...XXXXX. This is your only credential — the entire URL, including the token at the end, must be kept private. Anyone who has this URL can post messages to your Discord channel. Test it quickly: in any HTTP tool (your browser console, Hoppscotch, or similar), send a POST to the URL with body {"content": "Hello from FlutterFlow test!"} and check that the message appears in Discord. Discord returns a 204 No Content response on success — not a 200 with a body, and not 'ok'. This is important to know for the FlutterFlow test step.

Pro tip: Create a dedicated Discord channel for each notification type (e.g., #new-orders, #new-signups, #errors) rather than posting all notifications to one channel. Discord channels are free and unlimited — separate channels make notifications easier to track and less noisy.

Expected result: A Discord webhook is created on your chosen channel. The webhook URL is copied. A test POST to the URL shows a message in the Discord channel. The channel shows the webhook name you set as the message sender.

2

Create a FlutterFlow API Call that posts plain text to Discord

In FlutterFlow, click API Calls in the left navigation panel (the two-arrows icon). Click + Add → Create API Group. Name the group Discord_Webhooks. For the Base URL, enter https://discord.com. Leave the group-level Headers section empty — Discord webhooks require no Authorization header. Add a call inside the group: click + Add → Create API Call. Name it PostMessage. Set Method to POST. For the Endpoint, paste the path portion of your webhook URL — everything after discord.com. It will look like /api/webhooks/1234567890/XXXXX. Go to the Variables tab and add one variable: messageContent (type: String). This holds the message text. Click the Body tab. Set body type to JSON. Enter: {"content": "{{ messageContent }}"} Now go to the Response & Test tab. In the messageContent test field, type 'Test notification from FlutterFlow'. Click Test API Call. Discord returns a 204 No Content response, which FlutterFlow may show as an empty response body — this is correct and means success. If you see a red error, check that the webhook URL path is pasted correctly into the endpoint field (no double slashes, no missing segments). Verify the message appeared in Discord. The sender name should be the webhook name you set in Step 1. Your plain-text Discord notification is ready — this is all you need for simple alerts.

api_call_body.json
1{"content": "{{ messageContent }}"}

Pro tip: Discord returns HTTP 204 (No Content) on successful webhook posts, not 200. In FlutterFlow's API Call action flow, use 'Status Code is 2xx' (or 'is 204') as the success condition rather than checking for a specific response body.

Expected result: The FlutterFlow API Call test returns a 204 response and a test message appears in your Discord channel. The API Group is saved and ready for action flow integration.

3

Build rich embed payloads for professional-looking Discord notifications

Discord's embeds system lets you send visually structured message cards with a colored left sidebar, title, description, URL link, timestamp, inline and block fields, thumbnail image, footer text, and an author line. Embeds transform your notifications from plain text into information-dense cards that are easy to scan in a busy Discord channel. The embed payload replaces the content field (or supplements it) with an embeds array. Here's the key rule: the color field must be a decimal integer, not a hex string. For example, the hex color #58B9FF (a nice blue) converts to decimal 5814783 — you must use 5814783, not '#58B9FF'. An easy way to convert: search 'hex to decimal converter' online, paste your hex value (without the #), and copy the decimal result. Sending a hex string causes a 400 Bad Request that Discord returns without a helpful error message, making it a frustrating and common failure. Update your FlutterFlow API Call body to use the embeds format. Add new Variables for the dynamic embed fields you want — for example, embedTitle, embedDescription, embedColor (as an integer AppState variable). Configure these variables to be bound to your app's data when the action fires. For the full embed structure, the code block below shows a well-formed example. Notice the timestamp field uses ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ) — in FlutterFlow, you can generate this from a DateTime variable using the formatDate action. The thumbnail url should be a publicly accessible image URL (not a local file path or Firestore storage URL that requires auth).

discord_embed_body.json
1{
2 "embeds": [
3 {
4 "title": "{{ embedTitle }}",
5 "description": "{{ embedDescription }}",
6 "color": 5814783,
7 "timestamp": "{{ isoTimestamp }}",
8 "thumbnail": {
9 "url": "{{ thumbnailUrl }}"
10 },
11 "fields": [
12 {
13 "name": "Customer",
14 "value": "{{ customerName }}",
15 "inline": true
16 },
17 {
18 "name": "Amount",
19 "value": "{{ orderAmount }}",
20 "inline": true
21 }
22 ],
23 "footer": {
24 "text": "FlutterFlow App • {{ appVersion }}"
25 }
26 }
27 ]
28}

Pro tip: Use an online color picker (like htmlcolorcodes.com) to pick your brand color visually, then use its DEC (decimal) value directly. Common colors: green = 3066993, red = 15158332, blue = 5814783, orange = 15105570, purple = 10181046.

Expected result: Discord messages from your app render as rich embed cards with a colored sidebar, title, description, and field rows — visually distinct from plain-text bot messages.

4

Trigger the Discord notification from a FlutterFlow app event

With the API Call configured and tested, connect it to real app events. Open the screen or widget where the trigger should fire — for example, a 'Submit' button on a form, a Firestore collection listener, or an on-page-load action for an event-driven flow. Select the triggering widget and open the Actions panel on the right. Click + Add Action → Backend/API Calls → API Call. Select your Discord_Webhooks group and the PostMessage call (or your embed variant). In the variable binding area, bind each variable to the appropriate app data. For messageContent on a simple text notification: use FlutterFlow's string combination to build 'New order from [customerName]: $[amount]'. For embed variables in the structured payload: bind embedTitle to a fixed string like 'New Order Placed', embedDescription to a combination of order fields, customerName to the Firestore field, and so on. Handle the response: add a conditional action after the API Call — if Status Code is 204, show a Snackbar 'Notification sent to Discord'. For any other status, show an error Snackbar. Note that 204 means success even though there's no response body. For rate-limit awareness: if your app might trigger many Discord notifications in quick succession (e.g., a batch operation that processes many records), add a Wait action (500-1000ms) between successive Discord calls in a loop. Discord's webhook limit is approximately 5 requests per 2 seconds per webhook URL — exceeding this returns a 429 response with a retry_after value in the body.

Pro tip: For high-frequency notification scenarios (many events per minute), consider routing through a Firebase Cloud Function that queues and batches Discord messages rather than firing one webhook call per event. This keeps you comfortably under the rate limit without adding Wait delays in your FlutterFlow action flows.

Expected result: Triggering the app action (button tap, form submit, or database event) sends a Discord notification to the channel. The message appears within 1-2 seconds. The action flow Snackbar confirms success.

5

(Optional) Add a Discord Bot via Cloud Function for two-way interaction

The webhook-only approach is one-way: your app posts to Discord, but users can't reply or interact with the messages in a way that your app sees. If you need two-way interaction — responding to button clicks on embed messages, processing slash commands, or reading channel messages — you need a Discord Bot running on a server. FlutterFlow apps cannot host a persistent server process (there's no server in a Flutter app), so Discord's Gateway (WebSocket) connection must run in a Firebase Cloud Function or a separate Node.js host. Create a Discord application and Bot at discord.com/developers/applications, enable the MESSAGE_CONTENT and SERVER_MEMBERS intents, and copy the Bot token. Deploy a Cloud Function that uses the discord.js library (or direct REST calls) to handle Discord interactions. The Bot token is a secret — put it in Firebase Functions config, never in FlutterFlow. The Cloud Function listens for Discord interaction events (sent via HTTP POST to a registered interactions endpoint URL), processes them, writes results to Firestore, and your FlutterFlow app reads Firestore in real time. For most FlutterFlow founders, the webhook-only approach covers 90% of use cases. The Bot path is worth the additional complexity only if your app genuinely needs to respond to Discord user actions — like a community moderation tool or a game with Discord leaderboard interaction.

index.js
1// Minimal Discord interactions endpoint (Cloud Function)
2// Registers as the interactions endpoint in Discord Developer Portal
3// npm install discord-interactions axios cors
4
5const functions = require('firebase-functions');
6const { InteractionType, InteractionResponseType, verifyKeyMiddleware } = require('discord-interactions');
7const admin = require('firebase-admin');
8cors = require('cors')({ origin: true });
9
10admin.initializeApp();
11const db = admin.firestore();
12
13const DISCORD_PUBLIC_KEY = functions.config().discord.public_key;
14// Set with: firebase functions:config:set discord.public_key="YOUR_APP_PUBLIC_KEY"
15
16exports.discordInteractions = functions.https.onRequest((req, res) => {
17 // Discord sends a PING to verify the endpoint on first registration
18 if (req.body.type === InteractionType.PING) {
19 return res.status(200).json({ type: InteractionResponseType.PONG });
20 }
21 // Write interaction data to Firestore for the FlutterFlow app to read
22 if (req.body.type === InteractionType.APPLICATION_COMMAND) {
23 const interaction = req.body;
24 db.collection('discord_interactions').add({
25 commandName: interaction.data.name,
26 userId: interaction.member?.user?.id,
27 timestamp: admin.firestore.FieldValue.serverTimestamp()
28 });
29 return res.status(200).json({
30 type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
31 data: { content: 'Command received! Check the app.' }
32 });
33 }
34 return res.status(400).send('Unknown interaction type');
35});

Pro tip: Register your Cloud Function's HTTPS URL as the 'Interactions Endpoint URL' in your Discord Application settings (discord.com/developers/applications → your app → General Information). Discord will send a PING verification request — your function must respond with {"type": 1} (PONG) immediately or Discord won't accept the URL.

Expected result: Discord interactions from your server (slash commands, button clicks) reach the Cloud Function, get written to Firestore, and are readable by your FlutterFlow app in real time.

Common use cases

Community app that posts new member welcomes to Discord

A creator community app built in FlutterFlow posts a rich welcome embed to a #new-members Discord channel whenever someone joins. The embed shows the member's display name, join date, and a welcome message with a colored sidebar. Discord community members see real-time join activity and can give a warm welcome in replies.

FlutterFlow Prompt

When a new user joins the community, post a Discord embed to #new-members with the user's name, join date, and a welcome message. Use a green color sidebar.

Copy this prompt to try it in FlutterFlow

SaaS app that sends error alerts to a #bugs Discord channel

A FlutterFlow admin tool lets users report bugs with a description and screenshot URL. Each submission triggers a Discord embed in #bug-reports with the bug description, the user's account ID, the device type, and the screenshot link. The engineering team triages incoming bugs directly from Discord without opening a separate dashboard.

FlutterFlow Prompt

When a user submits a bug report, post a Discord embed to #bug-reports with the bug title, description, user ID, device type, and a link to the screenshot. Use a red color sidebar to indicate urgency.

Copy this prompt to try it in FlutterFlow

Marketplace app that broadcasts new listings to a Discord server

A FlutterFlow marketplace app for digital products posts a Discord embed every time a seller lists a new item. The embed shows the product name, price, category, and a link to the product page in the app. Community members browsing Discord get first looks at new listings without needing to check the app proactively.

FlutterFlow Prompt

When a new product is listed, post a Discord embed to #new-listings with the product name, price, category, and a link to view it in the app.

Copy this prompt to try it in FlutterFlow

Troubleshooting

400 Bad Request when sending a Discord embed — no message appears in the channel

Cause: The most common cause is the embed color field being a hex string (e.g., '#58B9FF') instead of a decimal integer (e.g., 5814783). Discord strictly requires decimal integers for the color field. Other causes include malformed JSON in the embeds array or an empty required field.

Solution: Convert your hex color to decimal using an online tool (remove the # prefix first). Check your JSON structure against the Discord API docs — the embeds field must be an array containing objects, not a single object. Use FlutterFlow's API Call test tab to paste the exact body and observe the response detail.

429 Too Many Requests from the Discord webhook

Cause: You exceeded Discord's webhook rate limit of approximately 5 requests per 2 seconds per webhook URL. This commonly happens in loop-based batch operations or when multiple users trigger notifications simultaneously.

Solution: Check the retry_after value in the 429 response body (in seconds or milliseconds, depending on the endpoint). Add a Wait action in your FlutterFlow action flow between successive Discord calls. For high-volume use cases, route notifications through a Firebase Cloud Function that queues and throttles requests rather than firing them directly from the app.

The webhook URL stopped working — Discord returns 404 Not Found

Cause: The webhook was deleted from the Discord channel settings. This can happen if a Discord admin cleaned up webhooks or if the channel itself was deleted.

Solution: Go to the channel in Discord → Edit Channel → Integrations → Webhooks and check if your webhook still exists. If it's gone, create a new one and update the endpoint path in your FlutterFlow API Call. Keep the webhook URL stored in a FlutterFlow App Value or Firestore document so it's easy to update without re-deploying.

Discord message posts as a bot but with no username or avatar, or with the wrong name

Cause: The webhook's username and avatar_url can be overridden per-request by including them in the POST body. If not specified, Discord uses the webhook's default name and avatar (set when you created the webhook in Step 1).

Solution: To set a custom username or avatar for a specific message, add username and avatar_url fields to your POST body: {"content": "...", "username": "Order Bot", "avatar_url": "https://..."}. To set a permanent default, edit the webhook in Discord channel settings → Integrations → Webhooks → click your webhook → edit name and avatar.

Best practices

  • Keep the webhook URL out of public source code repositories — while the risk is channel spam rather than data breach, treat it as a credential and store it in FlutterFlow App Values or Firestore.
  • Always use decimal integers for embed colors — hex strings cause 400 errors that Discord doesn't explain helpfully, wasting debugging time.
  • Add a rate-limit handler in your action flow: check for 429 responses and show a retry message rather than letting the raw error surface to users.
  • Use embeds instead of plain content for structured data (orders, signups, alerts) — embedded cards are far easier to scan in an active Discord channel.
  • Create separate Discord channels for each notification category (#orders, #signups, #errors) and a separate webhook per channel — this keeps notifications organized and reduces noise.
  • Test the webhook URL independently before building your FlutterFlow action flow — a 204 response confirms the URL works, isolating it from any action flow configuration issues.
  • For two-way Discord interaction, always route Bot logic through a Firebase Cloud Function — never put a Discord Bot token in a FlutterFlow API Call header or Dart custom action.

Alternatives

Frequently asked questions

Does the Discord webhook work on FlutterFlow's free plan?

Yes. The Discord webhook integration is a plain API Call in FlutterFlow — no Firebase, no special FlutterFlow features, and no paid plan required on either side. Discord webhooks are free, and FlutterFlow's API Call feature is available on all plans. You can post to Discord from a FlutterFlow app with zero recurring cost.

Can I include images or file attachments in the Discord message?

You can include image URLs in an embed's thumbnail, image, or author.icon_url fields — as long as the URL points to a publicly accessible image. Actual file uploads (attaching a file to the webhook post) require a multipart/form-data request with a file field, which is more complex to configure in FlutterFlow's API Call editor. For most notification use cases, linking to a public image URL in the embed is sufficient.

Is there a limit to how many webhooks I can create on one Discord server?

Discord allows up to 10 webhooks per channel and up to 500 webhooks total per server. For virtually any FlutterFlow app, these limits are more than sufficient. If you hit a channel's 10-webhook limit, you can delete unused webhooks and create new ones.

Can my FlutterFlow app read messages that users post in a Discord channel?

Not via the webhook approach — webhooks are write-only. To read Discord channel messages, you need a Discord Bot with the MESSAGE_CONTENT intent, running in a Firebase Cloud Function that subscribes to Discord's Gateway (WebSocket). The function writes new messages to Firestore and your FlutterFlow app reads Firestore in real time. This is the two-way architecture described in Step 5.

How do I post to multiple Discord channels from the same app?

Create multiple webhooks — one per channel — and store each URL separately in FlutterFlow App Values or a Firestore configuration document. In your action flow, choose which webhook URL to call based on the event type. For example, order events call the #orders webhook, and signup events call the #signups webhook. If you'd rather skip the multi-webhook management, RapidDev can set up a single Cloud Function that routes notifications to the correct channel — free scoping call at rapidevelopers.com/contact.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.