docs/slack-webhooks
Slack & Outbound Webhooks
Dispatch real-time incident notification cards to Slack channels or custom outbound webhook endpoints as incidents traverse the dual-gate triage pipeline.
Best-effort, non-blocking alerts: Outbound webhook dispatches run in asynchronous background tasks. A failed or slow webhook response never delays incident triage or blocks developer dashboard actions.
Global Slack Webhook Configuration
Configure your organization-wide Slack webhook URL in your environment. Ichnois dispatches rich Block Kit message cards whenever an incident requires Gate 2 review or is published to GitHub:
.env
| 1 | SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX |
Per-Project Outbound Webhook Overrides
In microservice fleets, different teams own different services. In the dashboard at Projects → Service Settings, you can configure dedicated outbound overrides per microservice:
- Slack Channel Override: Route payment incidents to
#eng-paymentsand auth crashes to#team-auth. - Custom Webhook URL: Forward triaged incident JSON payloads directly to an internal microservice, custom Discord bot, or incident queue via
webhook_url.
Slack Notification Card Dispatch
| 1 | # Slack Incoming Webhook Notification Dispatcher |
| 2 | import httpx |
| 3 | |
| 4 | def notify_slack_run(state: RunState, settings: Settings, webhook_url: str | None = None) -> bool: |
| 5 | target = webhook_url or (settings.slack_webhook_url.get_secret_value() if settings.slack_webhook_url else None) |
| 6 | if not target: |
| 7 | return False |
| 8 | payload = { |
| 9 | "text": f"[{state.severity}] Incident Triaged: {state.incident.exception_type}", |
| 10 | "blocks": [ |
| 11 | {"type": "header", "text": {"type": "plain_text", "text": f"🚨 {state.severity}: {state.incident.exception_type}"}}, |
| 12 | {"type": "section", "fields": [ |
| 13 | {"type": "mrkdwn", "text": f"*Service:* |
| 14 | {state.incident.service}"}, |
| 15 | {"type": "mrkdwn", "text": f"*Suspect Commit:* |
| 16 | {state.culprit.commit_sha if state.culprit else 'Unknown'}"}, |
| 17 | ]} |
| 18 | ] |
| 19 | } |
| 20 | return httpx.post(target, json=payload, timeout=4.0).is_success |
Test Your Webhook Connection
Verify connectivity directly from the terminal or using the test button in Dashboard → Settings → Notifications:
Terminal — Test Slack Webhook
| 1 | curl -X POST https://ichnoisapi.onrender.com/api/v1/notifications/slack/test \ |
| 2 | -H "Authorization: Bearer <admin-token>" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{"webhook_url": "https://hooks.slack.com/services/..."}' |