Docs

#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:

  1. Click Connect Discord. This sends the admin to Discord to authorize the Ratifia bot into their server.
  2. On authorize, Discord redirects back to Ratifia and the server (guild) is bound to your org.
  3. Back in the dashboard, pick the channel to post approvals to from the dropdown of the server's postable text channels.
  4. 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 discord id 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.