# Slack

Post new submissions to a Slack channel with custom message templates.

## Slack

Post new submissions to a Slack channel with custom message templates, inline field values, and user or group mentions.

<h2 id="what-you-get">What you get</h2>

<ul>
  <li>Per-submission message in the channel of your choice</li>
  <li>
    Custom template — type <strong>@</strong> to insert any field value
  </li>
  <li>
    Mention users, user groups, and broadcasts (<code>@here</code>, <code>@channel</code>, <code>@everyone</code>)
  </li>
  <li>Separate template for abandoned responses</li>
  <li>Multiple integrations per form (different channels, different templates)</li>
</ul>

<h2 id="connect">Connect Slack</h2>

<h2 id="message-template">Message template</h2>

<p>
  The template editor lets you compose the exact message posted to Slack. Type <strong>@</strong> to open the mention menu and pick from:
</p>

<ul>
  <li>
    <strong>Form fields</strong> — resolved to the submitted value at delivery time
  </li>
  <li>
    <strong>Submission metadata</strong> — including PDF Link for the generated submission PDF
  </li>
  <li>
    <strong>Slack users</strong> — live search by name; sent as a real Slack mention that pings the user
  </li>
  <li>
    <strong>User groups</strong> — mention a group handle to notify the right team
  </li>
  <li>
    <strong>Broadcasts</strong> — <code>@here</code>, <code>@channel</code>, and <code>@everyone</code>
  </li>
</ul>

<p>
  <strong>Bold</strong>, <em>italic</em>, strikethrough, inline code, and links carry through as Slack mrkdwn. Underline does not — mrkdwn
  has no underline. The message limit is 3,000 characters; a longer message is truncated with an ellipsis.
</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. Optionally narrow it with <strong>Required fields</strong>: the message
  fires only when at least one of the fields you pick was filled in.
</p>

<p>
  A sweep runs every hour, so a message arrives at the first sweep after the idle window passes, not on the minute. 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 Slack integration is available on all plans. See{' '}
>     <a href="/subscription-billing/plans-pricing">plans & pricing</a>.
>   </p>

<h2 id="error-handling">Error handling</h2>

<ul>
  <li>
    <strong>Token revoked</strong> — If the token is revoked or the app is reinstalled, the integration shows an error. Reconnect to
    restore.
  </li>
  <li>
    <strong>Channel archived or deleted</strong> — Shows an error. Delete the integration and create a new one targeting a different
    channel.
  </li>
  <li>
    <strong>Rate limited</strong> — formbase retries automatically with the delay Slack requests.
  </li>
  <li>
    <strong>5 consecutive failures</strong> — The integration auto-pauses and the person who set it up receives an email. Fix the issue,
    then press Resume. See <a href="/integrations/health-monitoring">Integration health</a>.
  </li>
</ul>

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

  <p>
    Yes, but you need to invite the formbase bot to the channel first. In Slack, open the private channel and run
    <code>/invite @formbase</code>. Then refresh the channel list in formbase — the private channel will appear.
  </p>

  <p>
    Yes. Each integration has its own channel and message template — for example, one channel for completed submissions and another for
    abandoned responses.
  </p>

  <p>Yes. Each OAuth install creates a separate connection. Start a new integration and authorize with a different workspace.</p>

  <p>
    Yes. Slack connections are workspace-scoped, not per-user. Any workspace member can use any connected Slack account when setting up an
    integration.
  </p>

  <p>
    No. Slack is a notification-style integration — 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>
    Post messages, post to public channels without membership, read channel lists, read user and group lists (for mentions), and read team
    info. It does not request admin permissions, message history, or file access.
  </p>

  <p>
    Go to Form settings → Integrations → Slack and delete the integration. To also remove the formbase bot from your Slack workspace, go to
    Slack's app management page and uninstall it.
  </p>

<h2 id="next-steps">Next steps</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Discord](/integrations/discord) — Post submissions to a Discord channel
  - [Webhooks](/integrations/webhooks) — POST signed JSON to any URL
</div>
