> ## 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 Discord

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

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

Like Slack, there's no native Discord integration built into Formpaste - no "Add to
Discord" button. What exists is a generic, signed webhook that fires on every delivered
submission, and Discord webhooks expect their own body shape
(`{"content": "..."}`, optionally `embeds`), not Formpaste's envelope. This is the
honest version: how to bridge the two with a relay, without pretending it's a one-click
integration.

## Why you can't point Formpaste straight at a Discord webhook URL

Discord's webhook endpoint expects something like:

```json theme={null}
{ "content": "New form submission" }
```

Formpaste's webhook instead sends its own versioned envelope:

```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!" }
}
```

Discord doesn't know what to do with `type`, `version`, or a nested `data` object - you
need something in between to reshape one into the other.

## The recipe: automation platform as the relay

1. **Get a Discord webhook URL.** In your Discord server, go to the target channel's
   **Integrations → Webhooks**, create one, and copy its URL.
2. **Create an automation workflow** (Zapier, Make, Pipedream, or n8n) that starts from
   a **Catch Webhook / Webhook trigger** step. This gives you a URL - that's what Form
   Paste will call.
3. **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. Keep the `whsec_…` signing secret it shows you.
4. **(Recommended) Verify the signature in the automation** before doing anything else —
   check `X-Formpaste-Signature` against the secret, the same way as in the
   [webhook verification snippet](/docs/features/webhooks#verifying-the-signature), so you're
   not relaying arbitrary POSTs to your Discord channel.
5. **Add an HTTP/webhook step that POSTs to your Discord webhook URL**, with a JSON body
   built from the incoming payload's `data` fields:

```json theme={null}
{
  "content": "**New submission** on {{form_id}}\n**From:** {{data.name}} <{{data.email}}>\n**Message:** {{data.message}}"
}
```

(Field referencing syntax varies by platform - use the field picker in Zapier/Make, or
reference the trigger payload directly in a Pipedream/n8n code step.)

6. **Test it.** Submit your form once and confirm the message appears in the Discord
   channel within a few seconds.

## What fires, and what doesn't

The webhook only fires for **delivered, non-spam** submissions - the same set that
triggers an email notification. A submission that lands in
[quarantine](/docs/features/quarantine) doesn't fire the webhook and won't reach Discord;
check the dashboard's Spam tab for those.

## Free vs. Pro

This recipe needs [Pro](/docs/features/pro-plan) - webhooks aren't available on Free:

| 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="Slack notifications" icon="slack" href="/docs/guides/slack-notifications">
    The same recipe, for Slack.
  </Card>
</CardGroup>
