A Discord poll bot posts a question, collects votes, and announces the winner. Discord's built-in polls are fine for a quick vote — but a bot gives you what they don't: one-vote-per-member enforcement you control, results your workflows can act on, automatic closing, and announcements written your way.
There are two ways to build one in Noria, and they're good at different things. Native Discord polls are three fields on a Send Message action — fastest to ship, and your workflow can close the poll and read who voted. Button polls are assembled from message buttons, durable storage and a score counter — more nodes, but you decide exactly how voting, tallying and closing behave.
The quick version: a native Discord poll
- Add a Discord — Send Message action and fill in Poll question, Poll answers (2 to 10, one per entry) and optionally Poll duration (hours). That's the whole poll — Discord handles voting and shows the tally on the message.
- To decide something with the result, add a Wait node, then a Discord — End Poll action pointing at the poll's
{{message_id}}. It closes voting and hands back the final tally in{{poll_answers}}and{{poll_total_votes}}. - Need the actual people? Discord — Get Poll Voters with an Answer number (
1for the first answer) returns{{voters}}— enough to hand out a role to everyone who picked "yes", or to draw a winner from them.
Two limits worth knowing before you commit: a bot can only end a poll it posted itself, and ending is permanent. Everything else — one vote per member, live counts — Discord enforces for you.
Native polls stop short when you want your rules: private confirmations, vote-changing, a tally your workflow shapes. That's the button poll below.
What you're assembling (button poll)
- Send Message with buttons — the poll itself. Each button gets its own output branch in the editor, so a click flows straight into your counting logic.
- Remember Data — a durable voter list, so each member votes once.
- Scores — a persistent counter per option.
- Wait — pauses the workflow for hours or days, then closes the poll.
- Edit Message — greys out the buttons when voting ends.
If you've built a giveaway with button entries, this will feel familiar — it's the same click-and-record pattern with a tally on top.
Build a button poll
- Connect your Discord bot to Noria.
- Start the workflow however you like: a Slash Command trigger (so
/pollposts it on demand), a Schedule trigger for a recurring poll, or the Run button for a one-off. - Add a Discord — Send Message action with your question, and add one button per option in Buttons & menus — say
YesandNo. Each button appears as its own output handle on the node. - From the
Yesbutton's branch, add a Remember Data node, operation Append unique. Record key:poll:{{message_id}}, field:voters, value:{{user_id}}. This adds the voter to a durable list — and itsUpdated?output tells you whether they were new. - Add an If / Else node checking that
{{updated}}is true. - On the true branch, add a Scores node, operation Increment. Key:
poll:{{message_id}}, member:yes. Then reply with a Discord action (Reply to Slash Command — it answers button clicks too) with the private-reply option on:Vote counted!Only the voter sees it. - On the false branch, send the same kind of private reply:
You already voted. - Repeat steps 4-7 for the
Nobranch, incrementing membernoinstead. Same voter list, so nobody can vote on both options.
That's the whole voting machine: one vote per member, private confirmations, durable counts. This simple version doesn't let members change their vote — if you want that, the Remember Data node's Remove from array operation plus a negative Score increment can build a "switch vote" branch, but most servers skip it.
Close the poll and announce results
Continue from the Send Message node's main branch (not the button branches):
- Add a Wait node, mode Duration, set to
1 day(or2h,3 days— it pauses without holding anything up and survives restarts, unlike the short Delay node). - Add a Scores node, operation Score, key
poll:{{message_id}}, memberyes— name its outputyes_votes. Add a second one fornoasno_votes. For polls with many options, the Top operation returns the full ranking in one call. - Add a Discord — Send Embed with the results:
Yes: {{yes_votes}} — No: {{no_votes}}. Some embed styling makes the reveal feel like an event. - Add a Discord — Edit Message action targeting the poll's
{{message_id}}, with Buttons & menus mode set to disable all. The buttons grey out, so the poll visibly closes.
Prefer polls that close at a fixed time — every Friday at 18:00, say? Store the poll's message ID with Remember Data under a fixed key, and let a separate Schedule-triggered workflow read it, tally, and announce.
Reaction polls: the two-minute version
For casual votes, reactions are hard to beat:
- Send Embed with your question and numbered options.
- Chain Add Reaction actions on the new message — one per option emoji (
1️⃣,2️⃣,3️⃣) — so voters just click. - Discord shows live counts next to each reaction. For a quick vote, that's your result — no tallying needed.
Want recorded results you can announce? Add a Discord — Reaction trigger with Message Filter set to the poll's message ID and Emoji Filter set to your option emojis, and wire Reaction Added into a Scores Increment with member {{emoji}}. Wire Reaction Removed into an Increment with amount -1, so retracted votes don't inflate the count.
The honest tradeoffs: a member can react to several options unless you add the same Remember Data dedup as above, and live counts are visible while voting is open — which can nudge people toward the leader. Button polls avoid both.
Start building
A poll bot is one message with buttons, a voter list, and a counter — wired exactly how you want, running on your own bot, free during Noria's open beta.
Start building free — or keep going with these guides:
- Build a Discord giveaway bot — the same button pattern with a random winner.
- Keep a notice pinned to the bottom of a channel with a sticky message.