Link
GitHub Get Started

Slack Integration

Get real-time ButterStack notifications and updates directly in Slack.

Table of contents

  1. Overview
  2. Quick Setup (Incoming Webhooks)
    1. Step 1: Create Webhook in Slack
    2. Step 2: Configure in ButterStack
  3. What the Slack integration does today
  4. Troubleshooting
  5. Best Practices
  6. Integration Examples
    1. Python Webhook Example
  7. Related

Overview

Connect ButterStack to Slack for instant notifications about builds, asset updates, and approvals. The integration uses Slack incoming webhooks; see What the Slack integration does today for the current scope.

Requires Team or above

Slack is not included on the Indie plan - it appears under Needs upgrade on the integrations page. Discord is available on every plan and supports separate channels per notification type.

Quick Setup (Incoming Webhooks)

The fastest way to get started is with incoming webhooks for basic notifications.

Step 1: Create Webhook in Slack

  1. Go to api.slack.com/apps
  2. Click Create New App → From scratch
  3. Name it “ButterStack” and select your workspace
  4. Go to Incoming Webhooks → Enable
  5. Click Add New Webhook to Workspace
  6. Select the channel for notifications
  7. Copy the webhook URL

Step 2: Configure in ButterStack

  1. Navigate to Project → Integrations
  2. Click Add Integration → Slack
  3. Paste the Incoming Webhook URL
  4. Optionally set a default Channel (e.g. #builds)
  5. Save, then click Test Connection

Those two fields are the whole form - there is no per-notification-type selection.

What the Slack integration does today

The Slack integration is outbound incoming-webhook notifications only. In ButterStack it has exactly two fields - the incoming webhook URL and a default channel - and it posts build, asset and approval notifications to that webhook.

Not available yet

There is no ButterStack Slack app. The following do not exist and cannot be configured: OAuth / bot-token mode, a signing secret, slash commands (/butterstack ...), interactive message buttons (approve from Slack), Events API subscriptions, per-notification-type channel routing, and custom message templates. ButterStack exposes no /slack/commands, /slack/interactive or /slack/events endpoints for Slack to call.

If you want notifications split across several channels today, use Discord - it supports separate webhooks for builds, assets, alerts and approvals - or create more than one Slack integration, each with its own channel’s incoming webhook.

Approvals are performed in ButterStack: follow the link in the notification.

Troubleshooting

Messages Not Delivering

Check these common issues:

  1. Webhook URL: Ensure it’s correctly copied
  2. Channel permissions: the incoming webhook is bound to the channel you chose when you created it in Slack
  3. Rate limits: Slack limits to 1 message/second per channel
  4. Network: Verify ButterStack can reach Slack (no firewall blocking)

Test with cURL:

curl -X POST -H 'Content-type: application/json' \
  --data '{"text":"Test from ButterStack"}' \
  YOUR_WEBHOOK_URL

Best Practices

📢 Channel Strategy

  • Create one Slack integration per channel you want to post to
  • Keep a dedicated channel for build failures so they are not buried
  • Prefer Discord if you need builds/assets/alerts/approvals split automatically

🔕 Noise Reduction

  • Configure notification levels
  • Batch similar notifications
  • Use scheduling for non-urgent

🔐 Security

  • Rotate webhook URLs regularly
  • Limit bot permissions
  • Audit slash command usage

Integration Examples

Python Webhook Example

import requests
import json

def send_butterstack_notification(webhook_url, message):
    payload = {
        "text": "ButterStack Notification",
        "attachments": [{
            "color": "#5D5DFF",
            "title": message['title'],
            "text": message['description'],
            "fields": [
                {"title": "Status", "value": message['status'], "short": True},
                {"title": "Time", "value": message['timestamp'], "short": True}
            ],
            "footer": "ButterStack",
            "footer_icon": "https://www.butterstack.com/icon.png"
        }]
    }
    
    response = requests.post(
        webhook_url,
        data=json.dumps(payload),
        headers={'Content-Type': 'application/json'}
    )
    
    return response.status_code == 200

Copyright © 2026 ButterStack. All rights reserved.

Esc
Type to search the documentation