# Discord

Post each form submission to a Discord channel with mentions.

## Discord

Post each form submission to a Discord channel — mention users and roles, inline field values, and notify your team in real time.

<h2 id="overview">Overview</h2>

<p>
  The Discord integration posts submissions to a channel as soon as they arrive. Compose the message with inline mentions of form fields,
  Discord users, and roles.
</p>

<p>
  formbase connects via OAuth as a bot — no webhook URLs to copy, no IDs to paste. Once the bot is in your server, you can pick any text or
  announcement channel it has access to.
</p>

> ℹ️ **Notifications, not archive**
> <p>
>     Only new submissions are posted after the integration is active. For historical data, use{' '}
>     <a href="/integrations/google-sheets">Google Sheets</a> or <a href="/integrations/notion">Notion</a>.
>   </p>

<h2 id="set-up-discord">Set up Discord</h2>

<h2 id="features">Features</h2>

<ul>
  <li>
    <strong>Channel picker</strong> — Text and announcement channels, grouped by Discord category.
  </li>
  <li>
    <strong>User and role mentions</strong> — Mention users or roles so the right people get pinged.
    <code>@everyone</code> and <code>@here</code> are not supported (see FAQ).
  </li>
  <li>
    <strong>Formatting</strong> — Bold, italic, strikethrough, inline code, and links carry through as Discord markdown. Underline does not;
    Discord has no underline.
  </li>
  <li>
    <strong>Test message</strong> — Send a sample message with placeholder data to verify your setup.
  </li>
</ul>

<h2 id="limits">Limits</h2>

<ul>
  <li>
    <strong>Message content:</strong> 2,000 characters (truncated with ellipsis if exceeded)
  </li>
  <li>
    <strong>Mentions:</strong> users and roles only — <code>@everyone</code> and <code>@here</code> are not supported
  </li>
  <li>
    <strong>Channels:</strong> text and announcement channels only — formbase excludes voice, stage, forum, and thread channels
  </li>
</ul>

<h2 id="bot-permissions">Bot permissions</h2>

<p>formbase requests only the permissions needed to deliver messages.</p>

<p>
  <strong>The bot needs:</strong>
</p>
<ul>
  <li>View Channels</li>
  <li>Send Messages</li>
  <li>Send Messages in Threads</li>
  <li>Create Public Threads</li>
  <li>Embed Links</li>
</ul>

<p>
  <strong>The bot does not request:</strong>
</p>
<ul>
  <li>Mention Everyone</li>
  <li>Read Message History</li>
  <li>Administrator</li>
  <li>Manage Messages or Channels</li>
</ul>

> 💡 **Restrict the bot to one channel**
> <p>Restrict the bot to a single channel by adjusting Discord's channel permission overrides for the formbase bot role.</p>

<h2 id="abandoned-responses">Abandoned response events</h2>

<p>
  When a respondent starts your form but doesn't finish, formbase can post a separate message. Set{' '}
  <strong>Send abandoned event after</strong> to 12 hours, 1 day, 3 days, or 1 week and compose a dedicated{' '}
  <strong>Abandoned message</strong> — it cannot be left empty. <strong>Required fields</strong> narrows it further: the message fires only
  when at least one of the fields you pick was filled in.
</p>

<p>
  A sweep runs every hour, so the message arrives at the first sweep after the idle window passes. Only drafts from a share link are swept —
  a <a href="/requests/overview">request</a> recipient who goes quiet is chased by the request's own reminders instead.
</p>

> ℹ️ **Pro feature**
> <p>
>     Abandoned response delivery requires a Pro or Business plan. The core Discord integration is available on all plans. See{' '}
>     <a href="/subscription-billing/plans-pricing">plans & pricing</a>.
>   </p>

<h2 id="faq">FAQ</h2>

  <p>
    Click <strong>Invite bot</strong> during setup. Pick the target server, confirm permissions, then return to formbase and refresh the
    server list.
  </p>

  <p>Common causes:</p>
  <ul>
    <li>The bot was kicked from the server</li>
    <li>The target channel was deleted</li>
    <li>The bot's permissions were removed for that channel</li>
    <li>The OAuth connection was revoked</li>
  </ul>
  <p>
    When the integration enters an error state, the person who set it up receives a notification email. Reconnect or delete and recreate the
    integration. The event log in the detail sheet shows the specific error.
  </p>

  <p>
    No. formbase does not request the "Mention Everyone" permission, and implicit mentions are disabled at the API level. Use a role mention
    for broad notifications instead.
  </p>

  <p>The server and channel are fixed after creation. Delete the integration and create a new one pointing to the new channel.</p>

  <p>
    Yes. Each integration targets one server and one channel. To post to multiple servers, create multiple Discord integrations on the same
    form.
  </p>

  <p>
    Yes. Discord connections are workspace-scoped. Any workspace member can use any connected Discord account when setting up an
    integration.
  </p>

  <p>
    No. Only new submissions are posted after the integration is active. For historical data, use{' '}
    <a href="/integrations/google-sheets">Google Sheets</a> or <a href="/integrations/notion">Notion</a>.
  </p>

  <p>
    Go to Form settings → Integrations → Discord and delete the integration. To also remove the bot from your Discord server, go to Server
    Settings → Integrations in Discord and remove formbase.
  </p>

  <p>
    Yes, after about 7 days. formbase refreshes them right before each delivery rather than on the daily schedule other providers use. If
    the refresh fails — the connection was revoked, or the bot was removed — the connection is marked expired and every integration using it
    stops with an error. Press Reconnect to restore them all at once.
  </p>

<h2 id="next-steps">Next steps</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Webhooks](/integrations/webhooks) — POST signed JSON to any URL
  - [Airtable](/integrations/airtable) — Push submissions into an Airtable base
</div>
