When a deploy or promotion targets a protected environment, Levelrail requires a second, distinct user to approve it (see Deploy safety for the two-person gate). By default an approver opens the dashboard’s Approvals queue. This feature adds Approve and Deny buttons to the Slack or Discord message Levelrail sends when a request comes in, so an approver can decide from a phone.
It is an opt-in addition to an existing notification channel (Settings > Notification channels), not a separate integration. Connect a Slack or Discord channel the normal way first, then turn on Interactive approval buttons on that channel’s edit dialog. It is off by default, and the toggle requires the secret from the platform setup below, because without one there is nothing to verify an incoming click against.
Levelrail’s Slack channel sends through an Incoming Webhook. To receive button clicks, that webhook must belong to a Slack app with Interactivity turned on.Set the Request URL
Under Interactivity & Shortcuts, turn Interactivity on and set the Request URL to: Copy the signing secret
Under Basic Information, copy the Signing Secret and paste it into the channel’s interactive approval secret field. Levelrail uses it to verify that a click came from your Slack app.
Check webhook ownership
Make sure the same app owns the Incoming Webhook URL the channel is configured with.
Discord’s equivalent of a Request URL is an application’s Interactions Endpoint URL, and verification uses the application’s public key instead of a shared secret.Copy the public key
Open your application at https://discord.com/developers/applications (the one your Incoming Webhook belongs to). Under General Information, copy the Public Key and paste it into the channel’s interactive approval secret field. Save the channel with interactive approvals on first. Set the Interactions Endpoint URL
Set it to:Discord sends a verification ping when you save and refuses the URL if the ping is not answered correctly, so the key must already be saved in Levelrail.
What it does
- A deploy or promotion that needs approval posts a message with Approve and Deny buttons to every channel that has this turned on.
- A click decides the approval through the same code path as the dashboard’s buttons: the same not-pending check, the same rule that the requester cannot approve their own request, and the same freeze gate. It cannot apply a change the dashboard would not allow.
- A forged or replayed request cannot approve anything. Every incoming request is signature-verified against the channel’s own secret first, and an already-decided approval cannot be decided again (a second click or a retried delivery is told it is no longer pending).
Identity scopeLevelrail has no link between a Slack or Discord user and a Levelrail account. A verified click is authorized at the channel level: anyone who can click the button in that Slack channel or Discord server can decide the approval. The clicking user’s name is recorded on the decision for visibility, but it does not authorize it. Treat the channel or server you point this at as the trust boundary.
Endpoints
Neither route uses a session or API token, like POST /api/v1/webhooks/github/{name}, because neither platform can present one. The signature check stands in for auth, and a request that fails it is rejected with no state change. Last modified on October 12, 2026