PaulCLI logoPaulCLI

Interactive buttons

Send messages with buttons and react to clicks — menus, polls, verification, claim buttons.

Two actions attach buttons to a message — Send message with buttons (optionally with an embed) and Reply with buttons. When a member clicks one, the Button clicked trigger fires in the same workflow, with the clicker as {user}, the message as context, and {button} / {button.label} identifying which button it was.

Button panel — the bot posts it for you

For permanent menus (role pickers, verification, FAQ buttons) use the Button panel trigger instead. You give it a channel, the message/embed and the buttons; when the workflow goes Live the bot publishes the panel itself and keeps it in sync — edit the text or buttons and save, and the live message is updated within about 30 seconds. Pause or delete the workflow and the panel is removed. Every click runs the workflow from that trigger, so no separate “start” trigger is needed.

Tip

A panel is tied to its node: delete the node and the message disappears; move it to another channel and it is re-posted there. If someone deletes the message by hand, the bot re-posts it on the next sync.

Defining buttons

In the inspector, each button has a label, an optional emoji, a style (Blurple, Grey, Green, Red, or Link) and an id. The id is what you filter on in Button clicked; it is auto-derived from the label until you edit it. Link buttons open a URL and never fire a trigger. Up to 25 buttons, laid out five per row.

Responding to a click

Discord expects a response to every click within 3 seconds, so the engine handles it for you: if no action in the run replies, the click is acknowledged silently. To respond explicitly, use one of the click-aware actions — they must come first on the branch:

Reply privately
An ephemeral message only the clicker sees — ideal for confirmations and menus.
Edit the clicked message
Replace the message text in place (e.g. “✅ Claimed by {user}”).
Disable the clicked message's buttons
Grey out all buttons — one-shot menus, claim buttons, closed polls.

Any other action (add role, send DM, give coins…) works as usual after a click; combine them freely. A button only triggers the workflow that created it — pausing or deleting the workflow turns its old buttons into a polite “this workflow is paused” notice.

Example — self-assign roles

  1. Button panel → channel #roles, message “Pick your platform”, buttons pc 🖥️, console 🎮, mobile 📱 (all Blurple). Leave Only run for this button id empty.
  2. Panel → Text matches? is not needed: add three Button clicked triggers instead — id pc → Toggle role @PC → Reply privately “Toggled {button.label} for you.”; same for console and mobile.
  3. Enable the workflow. The bot posts the panel; clicks toggle roles.

Tip

You can also wire actions straight after the Button panel node and branch on {button} with Text matches? — but one Button clicked trigger per id reads better on the canvas.

Example — ticket-style claim

  1. Message sent in #requests → Reply with buttons “Staff: claim this request”, button claim ✋ (Green).
  2. Button clicked (id claim) → Has permission? Manage Messages → yes: Edit the clicked message “✋ Claimed by {user}” → Disable the clicked message's buttons; no: Reply privately “Staff only.”