A Discord birthday bot does two jobs: it lets members save their birthday, and it celebrates them on the right day — a message in your general channel, an @mention, and a special birthday role that lasts 24 hours. In Noria you build both halves as visual workflows on your own Discord bot, no code required.
The design is simple: members submit their birthday through a form, the date is stored, and a daily scheduled workflow checks "whose birthday is it today?" and celebrates.
Workflow 1: let members submit their birthday
This workflow posts a button, opens a form when it is clicked, and saves the answer.
Step 1 — post the birthday button
- Add a Manual Trigger and connect a Discord action set to Send Message.
- Write something like:
Click the button below to register your birthday 🎂 - In Buttons & menus, add a button labelled
Set my birthdaywith the custom IDset_birthday. - Run the workflow once so the message appears in your
#birthdayschannel. This is a one-time setup post.
Step 2 — open a form on click
Add a Discord — Button Click trigger:
- Button ID Filter:
set_birthday - Open a form (modal) on click: build a form with two short fields —
Month (2 digits, e.g. 07)with custom IDmonthDay (2 digits, e.g. 09)with custom IDday
- Give the form a custom ID like
birthday_form.
Asking for two digits matters: the daily workflow will look dates up as 07-09, so 7 and 07 would not match.
Step 3 — save the submission
Add a Discord — Modal Submitted trigger with the Modal ID filter birthday_form. Each form field arrives as its own variable, so the answers are {{field_month}} and {{field_day}}.
Connect a Remember Data node:
- Operation: Append unique — add to a list field
- Record key:
birthdays:{{field_month}}-{{field_day}} - Field:
users - Value:
{{user_id}}
This keeps one record per calendar date, each holding the list of members born that day. "Append unique" means clicking twice never adds someone twice.
Finish with a Discord action set to Reply to Slash Command (it answers any interaction, including form submissions) with Ephemeral enabled: Saved! We'll celebrate you on {{field_month}}/{{field_day}} 🎂. Only the member sees the confirmation.
One honest limitation: if someone re-submits a different date, they stay in the old date's list too. For most servers that is rare enough to fix by hand; if you want it airtight, also store each member's last submission in a per-user Remember Data record and remove them from the old list first.
Workflow 2: the daily birthday check
This is a separate workflow with a Schedule trigger — see scheduled automation for how cron schedules work.
- Schedule trigger — cron
0 9 * * *, timezone set to yours. It fires every day at 09:00. - Date node — operation Format, Date
{{timestamp}}, formatMM-DD. The result{{result}}is today's date as07-09. - Remember Data — operation Get field, key
birthdays:{{result}}, fieldusers. This reads today's birthday list into{{value}}, and{{exists}}tells you whether anyone registered this date. - If / Else — continue only when
{{exists}}is true, so quiet days end silently. - For Each / Repeat — loop over
{{value}}. Inside the loop,{{loop.item}}is one member's user ID. - Inside the loop, add two Discord actions:
- Send Message:
Happy birthday <@{{loop.item}}>! 🎉 Everyone wish them a great day! - Add Role: pick your
🎂 Birthdayrole and set User to{{loop.item}}.
- Send Message:
Want a fancier announcement? Turn the message into a card with these Discord embed examples.
Remove the birthday role the next day
Add a second branch from the same Schedule trigger:
- Date node — operation Subtract, amount
1, unit Days. - A second Date node — operation Format, Date set to the previous node's result, format
MM-DD. - Remember Data — Get field on
birthdays:+ yesterday's date. - For Each / Repeat over the list, with a Remove Role action inside.
The role now exists for exactly one day per member.
Tips that save you a support ticket
- Role position: your bot's own role must sit above the birthday role in Server Settings, or Discord refuses the role change.
- Test before waiting a day: temporarily swap the Schedule trigger for a Manual Trigger, or register your own birthday as today's date, then run it. The testing guide shows how to inspect each node's output.
- Timezones: set the Schedule timezone explicitly.
0 9 * * *in UTC is not 9am in most places. - How storage works: Remember Data persists across runs — the same pattern powers leaderboards and giveaways. More in working with data.
Start celebrating birthdays automatically
Two workflows, zero code, and it runs on your bot with your name and avatar — free during the beta.
- Start building free
- New to the editor? Build your first workflow first.
- Want more scheduled posts? The Scheduled Weekly Digest template uses the same daily-trigger pattern.