#Approvals in Discord
Let your reviewers approve or reject an AI action without leaving Discord. When a decision is routed to the Discord surface, Ratifia posts an interactive message to your team's channel, pinging the approvers, with Approve / Reject buttons. One click decides it and resumes your workflow. No dashboard login, no context-switch.
Discord is a surface (how the binding verdict is recorded), independent of how the approver was notified. See Core concepts.
#What your reviewers see
Ratifia posts one message to the org's configured channel and @-mentions every approver who has a verified Discord id. The message carries two buttons:
- Approve / Reject. A single click records the verdict.
- View decision. A link into the dashboard for the full context.
The clicking Discord user is the voter: whoever presses a button casts the vote, so identity comes from the click, not a baked-in recipient. With a multi-approver quorum, each person's click counts as one vote; the message updates as the decision resolves, and once decided the buttons are replaced with the outcome so the same message can't be actioned twice.
When a decision asks for a structured answer rather than a plain yes/no, the buttons adapt: a multiple-choice decision renders one button per option (plus a Decline), and a free-text decision links out to Answer in dashboard (plus a Decline), since free text can't be typed into a button.
#How much the message shows
By default the channel message is a content-free pointer: it shows routing metadata only (the workflow / step, the engine, the surface, and a humanized SLA) with a footer line pointing at the full detail in Ratifia (sign-in required). No prompt, context, or draft appears in Discord. An org can opt into richer content in the message; this is governed by the org's notification content setting.
#Connecting Discord
Discord is connected per org from the dashboard, under Settings:
- Click Connect Discord. This sends the admin to Discord to authorize the Ratifia bot into their server.
- On authorize, Discord redirects back to Ratifia and the server (guild) is bound to your org.
- Back in the dashboard, pick the channel to post approvals to from the dropdown of the server's postable text channels.
- Click Send sample message to confirm the bot is reachable and the channel is writable before real decisions flow.
One bot, many servers
A single Ratifia bot serves every install, so a channel is only usable once your org has completed the connect flow above. The chosen channel must belong to your own connected server; picking a channel from another server is rejected.
#Routing a decision to Discord
Set the decision's surface to discord, either on the call or (recommended) as the default on a named approval policy so it's declarative. Any decision the policy gates is then presented in Discord. The context.blocks you pass to awaitApproval are what a reviewer sees when they open the decision (and, in rich mode, in the message itself).
#Requirements
- The Ratifia Discord app is connected and a channel is chosen. Until your org completes the connect flow and selects a channel, the surface is inactive and decisions fall back to the dashboard Inbox.
- The approver is reachable in Discord. An approver with a verified
discordid is@-mentioned in the post. As with any surface, an approver can only bind a verdict on a surface they're verified for.
#Security
Every button click is verified before it can move a decision:
- Each interaction is signed by Discord (Ed25519) and verified against the app's public key, so a forged or replayed callback is rejected, never recorded.
- A decided decision is final: re-clicking a stale button does nothing, and it can't be flipped after it resolves.
The buttons are a bearer affordance, since whoever can see the message can click, so post Discord approvals to the private channel you intend, the same way you'd scope any approval.