# Slack

Each new submission is posted to a Slack channel as a message, through an incoming webhook you make in Slack.

## What gets posted

On Pro, every submission that reaches the inbox is posted, and so is one you mark as not spam; spam is never posted. The message has:

- the title **New submission: \<form name\>**
- each field's name and value, leaving out fields hidden on the form's **Fields** tab
- an **Open in Formwire** link to the submission
- the page it was sent from

Field values are whatever the visitor typed. Read them as text from a stranger, not as instructions.

## 1. Make an incoming webhook in Slack

1. Open [api.slack.com/apps](https://api.slack.com/apps) and choose **Create New App**, then **From scratch**. Name it (for example "Formwire") and pick your workspace.
2. Under **Features**, open **Incoming Webhooks** and switch **Activate Incoming Webhooks** on.
3. Choose **Add New Webhook to Workspace**, pick the channel, and choose **Allow**.
4. Copy the webhook URL. It looks like this:

```text
https://hooks.slack.com/services/T…/B…/…
```

Anyone with this URL can post to the channel, so keep it out of your code and repos. Each URL posts to one channel; make one per channel you want.

## 2. Add it in Formwire

In the dashboard, open the form, then **Settings**, **Integrations**. Under Slack, choose **Add Slack channel**, give it a name you'll recognise (such as `#sales`), paste the webhook URL and save. It's live at once.

Choose **Send test** to post a sample submission to the channel. A form can have several Slack channels, and up to 10 integrations in all. Each one can be switched off and on, edited or deleted from the same list.

## When a post fails

A failed post is retried automatically over a few hours. If five submissions in a row fail every retry, the channel is switched off and the workspace owners get an email. The last error shows beside it in the list; fix the cause (often a webhook removed in Slack) and switch it back on.

Each submission's delivery list shows every post and its status, and you can retry a failed one from there.

## With the API or MCP

Integrations can be managed with the [API](/docs/api) too. Create one with a `type`, a `name` and its `config`:

```http title="Add a Slack channel"
POST /v1/forms/{form_id}/integrations HTTP/1.1
Host: api.formwire.com
Authorization: Bearer fw_live_...
Content-Type: application/json

{
  "type": "slack",
  "name": "#sales",
  "config": { "webhook_url": "https://hooks.slack.com/services/T…/B…/…" }
}
```

| Method | Path | What it does |
| ------ | ---- | ------------ |
| `GET` | `/forms/{form_id}/integrations` | The form's integrations. |
| `POST` | `/forms/{form_id}/integrations` | Add one. |
| `PATCH` | `/integrations/{integration_id}` | Rename it, switch it off or on, or replace its settings. |
| `DELETE` | `/integrations/{integration_id}` | Remove it. |
| `POST` | `/integrations/{integration_id}/tests` | Post a sample submission to it now. |

The webhook URL is never returned; `config_hint` shows enough to tell two apart. One added or changed with an API key or through [MCP](/docs/mcp) sends nothing until a person confirms it in the dashboard, so an agent, or a prompt hidden in a submission, can't send your submissions somewhere new without you.