Jump to

Slack

Receive notifications about new survey responses directly in a Slack channel.

Setup

Step 1 — Create an Incoming Webhook in Slack

  1. Go to api.slack.com/apps and click Create New App → From scratch.
  2. Give the app a name (e.g. ftools) and select your workspace.
  3. In the left menu select Incoming Webhooks and enable Activate Incoming Webhooks.
  4. Click Add New Webhook to Workspace, select the channel where notifications should appear, and click Allow.
  5. Copy the Webhook URL — it looks like this:
    https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

Step 2 — Connect the integration in ftools

  1. Open the survey and go to the Integrations tab.
  2. Click Add integration and select the type Webhook.
  3. In the Provider field select Slack.
  4. Paste the Webhook URL from step 1 into the Webhook URL field.
  5. Optionally set a name, e.g. Slack — Product feedback.
  6. Click Save.

The integration will send a notification to Slack on every new survey response.

Step 3 — Done

Messages will appear in the selected channel and look like this:

🟢 9 · Post-onboarding NPS

Love the new dashboard

user@example.com · pro · PL · 2026-05-07T10:15:00

  • Emoji color: 🟢 promoter (9–10), 🟡 passive (7–8), 🔴 detractor (0–6) — NPS surveys only
  • The context line includes email, plan, country, and time — if provided in the response metadata

Optional — Signature verification

If you want to verify that requests come from ftools, set a secret in the Secret field when creating the integration, or leave it blank to auto-generate one.

The secret can be rotated at any time via the Rotate secret button in integration settings.

Each request will include an X-Webhook-Signature: sha256=<signature> header. See Webhook signature verification for verification instructions.

Reference

Integration configuration

Comparison table
FieldValue
integration_typewebhook
providerslack
event_types["survey.response"]
urlSlack Incoming Webhook URL
secretHMAC signing secret (auto-generated if not provided)

Trigger

The survey.response event fires on every new survey response submitted through the public widget. Subscription requirement: ACTIVE or CANCELED. Delivery does not occur on PAYMENT_OVERDUE.

Retries

On failure: 30 s → 120 s → 600 s.

HTTP request

POST <url>
Content-Type: application/json
X-Webhook-Event: survey.response
X-Webhook-Signature: sha256=<hmac>
User-Agent: feedback-tools-webhook/1.0

Timeout: 10 seconds. A 2xx response is considered a success.

Payload format

Slack receives a Block Kit payload:

{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "🟢 9 · Post-onboarding NPS",
        "emoji": true
      }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "> Love the new dashboard"
      }
    },
    {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": "user@example.com · pro · PL · 2026-05-07T10:15:00+00:00"
        }
      ]
    }
  ]
}

Formatting rules

Header: {emoji} {score} · {survey.title}

  • Emoji is based on NPS bucket: 🟢 promoter (9–10), 🟡 passive (7–8), 🔴 detractor (0–6)
  • Emoji only appears for nps_10 survey type; omitted for other types
  • Score is omitted if value is null
  • Maximum 150 characters (truncated)

Section (quoted text): only rendered if the response contains text (response.text). Maximum 2900 characters.

Context line: built from available fields in order: metadata.email · metadata.plan · response.country · response.created_at. Fields are skipped if missing or empty.

Signature verification

See Webhook signature verification.

Delivery

Comparison table
FieldDescription
statuspending / success / failed
attempt_countAttempt number (1–4)
response_statusHTTP status returned by Slack
response_bodyResponse body (up to 2048 characters)
errorError description on network failure

Delivery history is available in the Integrations section on the survey page.