Developer docs

Slack notifications

DeploySeal posts Block Kit cards to Slack when something worth a glance happens in a launch: a new issue, a decision-grade status change, a launch, a tester's verdict, a sealed report, a sign-off request. Channels are configured per organisation under Settings → Integrations → Slack; each channel picks its own events and severity filter. Two routes exist: an incoming webhook (one URL per Slack channel, nothing to install) and the DeploySeal Slack app (install once, pick channels from a list).

What DeploySeal posts

EventFires whenThe card
issue.createdA tester or teammate reports an issue.Severity-coloured header, severity / type / campaign / reporter fields, the page it was found on, “Open issue”.
issue.status_changedAn issue changes status. By default only Fixed, Retest failed, Closed and Won’t fix post; “all status changes” adds the rest.Old → new status, severity, campaign, who changed it, the reason if given.
campaign.launchedA campaign goes live to testers.Site, testers invited, target ship date, launched by, “Open campaign”.
tester.completedA tester finishes their session — with their verdict when they gave one.“Sarah N. finished testing: Approve with reservations”, their closing note as a quote, issues reported.
report.sealedThe readiness report is sealed (all required signers signed or waived; or any approval on a campaign without a signer list).Launch gate (cleared / awaiting sign-off / not cleared), readiness level, seal state + version, signatures, who sealed it and their decision, “Open sealed report”.
signoff.requestedRequired signers are asked to sign.Who was asked, who asked, target ship date, “Open readiness report”.

Every card is a header, a section of fields, a context line and one button back into DeploySeal. Severity colours are consistent across cards (🔴 Critical, 🟠 High, 🟡 Medium, 🔵 Low). The severity filter (all / High and above / Critical only) applies to both issue events. Cards are delivered from a durable queue with three quick attempts each; a channel whose last delivery failed shows a Failed badge with the reason, and heals on the next successful post — it is never switched off for you.

Route 1 — Incoming webhook (no install)

  1. In Slack, open Apps → Incoming Webhooks (or api.slack.com/apps → your app → Incoming Webhooks) and click Add New Webhook to Workspace.
  2. Pick the channel the cards should land in and copy the URL Slack shows you.
  3. In DeploySeal, go to Settings → Integrations → Slack Add incoming webhook, paste the URL, give it a label such as #go-live.
  4. Press Send test. Adjust the events and severity filter on the card.

The URL is encrypted at rest and never shown again. One webhook posts to exactly one channel — add another webhook for another channel.

Route 2 — Add to Slack (the DeploySeal app)

When the deployment has the Slack app configured, an Add to Slack button appears next to the webhook option. It runs Slack's OAuth install, stores the bot token encrypted, and lets you pick channels from a list instead of managing URLs.

  1. Settings → Integrations → SlackAdd to Slack → approve the three bot scopes on Slack's consent screen.
  2. Back in DeploySeal, press Pick a channel. Public channels are listed; a private channel appears once the bot is in it.
  3. In the Slack channel, run /invite @DeploySeal. The app deliberately does not request chat:write.public, so it can only post where it has been invited.
  4. Press Send test.

Scopes: chat:write (post cards), channels:read and groups:read (list channels for the picker). DeploySeal never reads messages.

For self-hosting / ops: the app manifest

Create the app once per deployment at api.slack.com/apps → Create New App → From a manifest, paste the JSON below with your host filled in, then copy the app's Client ID and Client Secret (Basic Information → App Credentials) into the API configuration. The redirect URL must match exactly — it is the web app's callback route, not the API host.

{
  "display_information": {
    "name": "DeploySeal",
    "description": "Launch-readiness cards: issues, tester verdicts, sealed reports.",
    "background_color": "#1f2a44"
  },
  "features": {
    "bot_user": {
      "display_name": "DeploySeal",
      "always_online": true
    }
  },
  "oauth_config": {
    "redirect_urls": [
      "https://YOUR-DEPLOYSEAL-HOST/api/integrations/slack/callback"
    ],
    "scopes": {
      "bot": ["chat:write", "channels:read", "groups:read"]
    }
  },
  "settings": {
    "org_deploy_enabled": false,
    "socket_mode_enabled": false,
    "token_rotation_enabled": false
  }
}

API configuration

# API configuration (appsettings / environment)
Slack__ClientId=1234567890.1234567890
Slack__ClientSecret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Slack__SigningSecret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   # optional today (no inbound events yet)

The API refuses to start in production with a half-configured Slack app (client id without secret or vice versa). Leave all three empty to run with incoming webhooks only — the settings page then shows a hint instead of the install button.

Ready to wire it up? Slack channels live in your workspace settings.

Open Slack settings

Using Microsoft Teams? See the Teams setup guide. Need raw events? See the webhook reference.