> ## Documentation Index
> Fetch the complete documentation index at: https://formpaste.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Sending submissions to Slack

> Route form submissions into a Slack channel using Formpaste's webhook - Pro.

<Info>**Pro** - this recipe depends on [webhooks](/docs/features/webhooks), which are Pro-only.</Info>

There's no native Slack integration in Formpaste - no "Connect to Slack" button in the
dashboard. What's real is a generic, signed webhook that fires on every delivered
submission, and Slack's own incoming-webhook format is different enough (`{"text": …}`
vs. Formpaste's versioned JSON envelope) that the two can't talk directly. This guide
is the honest version: how to bridge them yourself with a small relay, using an
automation platform so you don't have to host anything.

## Why you can't point Formpaste straight at Slack

A Slack incoming webhook expects a body like `{"text": "hello"}`. Formpaste's webhook
sends its own envelope instead:

```json theme={null}
{
  "type": "submission.received",
  "version": 1,
  "id": "sub_...",
  "form_id": "frm_...",
  "created_at": 1720700000000,
  "data": { "name": "John Smith", "email": "john@example.com", "message": "Hello!" }
}
```

Slack will reject that shape outright. Something in the middle needs to reshape it —
that's the relay.

## The recipe: automation platform as the relay

The fastest path is a no-code automation tool (Zapier, Make, Pipedream, or n8n) sitting
between the two:

1. **Create a Zap/scenario/workflow** that starts from a **Catch Webhook** /
   **Webhook trigger** step. The platform gives you a unique URL for this - that's what
   Formpaste will call.
2. **Point Formpaste's webhook at that URL.** In the [dashboard](https://app.formpaste.com),
   open your form → **Settings** → **Webhooks**, paste the automation platform's URL
   into `webhook_url`, and save. Copy the `whsec_…` signing secret it shows you.
3. **(Recommended) Verify the signature inside the automation.** Most of these
   platforms support a code step (JS in Pipedream/n8n, a "Code by Zapier" step in
   Zapier) - use it to check `X-Formpaste-Signature` the same way the
   [webhook verification snippet](/docs/features/webhooks#verifying-the-signature) does,
   before acting on the payload. This confirms the request actually came from Form
   Paste and not something guessing your relay URL.
4. **Add a Slack step.** Use the platform's built-in Slack action (post message to
   channel), and map the fields you want from the incoming payload —
   `data.name`, `data.email`, `data.message`, etc. - into the Slack message text.
5. **Turn it on and submit a test.** Submit your form once; you should see the message
   land in Slack within a few seconds.

A minimal message template:

```
New submission on {{form_id}}
From: {{data.name}} <{{data.email}}>
Message: {{data.message}}
```

(Exact templating syntax depends on the platform - Zapier/Make use their own field
picker, Pipedream/n8n let you reference `steps.trigger.event.body.data.name` etc.
directly in JS.)

## What fires, and what doesn't

Only **delivered, non-spam** submissions trigger the webhook - the same ones that
generate an email notification. A submission routed to
[quarantine](/docs/features/quarantine) never fires the webhook, so it never reaches Slack
either; check the dashboard's Spam tab for those.

## Free vs. Pro

Webhooks - and therefore this whole recipe - require [Pro](/docs/features/pro-plan). A
Free-plan form can't save a `webhook_url`:

| Code               | HTTP | Meaning                           |
| ------------------ | ---- | --------------------------------- |
| `upgrade_required` | 403  | This feature requires a Pro plan. |

<CardGroup cols={2}>
  <Card title="Webhooks" icon="webhook" href="/docs/features/webhooks">
    Full payload shape, signing, retries, and the delivery log.
  </Card>

  <Card title="Discord notifications" icon="discord" href="/docs/guides/discord-notifications">
    The same recipe, for Discord.
  </Card>
</CardGroup>
