Birthday

Automatic congratulations, optional role, canvas card

The Birthday module congratulates your server members automatically. Users register their date privately, the bot posts on time in the server's timezone — optionally with a graphical card and a role that's automatically removed after 24 hours.

Setup

  1. Enable the module: top-right toggle on the Birthday page
  2. Pick a congratulation channel: in the Settings tab, dropdown "Channel" → choose your channel
  3. Set timezone and time (default: 00:00 Europe/Berlin)
  4. Optional: set a birthday role, adjust the ping toggle, pick a canvas template
  5. Click "Save", then run '/'geburtstag panel to post the registration embed in a channel

User commands in Discord

Server members have four slash commands available:

  • /geburtstag setRegister or change your own birthday privately (max. 1× per year)
  • /geburtstag removeDelete your own entry anytime
  • /geburtstag infoView a user's birthday (ephemeral)
  • /geburtstag panelAdmin: post the registration panel with a click-button in the current channel
All user-facing commands reply ephemerally (visible only to the user). Day and month are required, the birth year is optional and not displayed when omitted.

Template variables

The following variables are available in the canvas card and the fallback text:

VariableResult
{user}User mention (ping)
{user.name}Username (without discriminator)
{age}Current age (empty when no year was registered)
{day}Day as number (e.g. "15")
{month}Month as localised name ("June")
{birthday}Locale-formatted date ("15.06." / "06/15")
{server}Server name

Example

🎂 Happy Birthday, {user}! Today you turn {age} — cheers from {server}.

Timezone and time

The worker scans every minute through all enabled server configs and fires the congratulation when the server's local time matches the configured notify time. The timezone is an IANA zone like Europe/Berlin or America/New_York — DST transitions are handled automatically.

Default is 00:00 Europe/Berlin. If your server is mostly active in the evening, 09:00 or 12:00 might make more sense so the congratulation actually gets seen.

Birthday role (optional)

When you configure a role, the user gets it at the congratulation time for exactly 24 hours. Removal runs as a delayed BullMQ job — it survives bot restarts and is idempotent (does nothing if the role is already gone).

Canvas card

The Welcome card editor is embedded in the Settings tab (in birthday mode). Three pre-built templates are available, all freely customisable:

  • ClassicRose-orange gradient, large title with {user.name}, subtext with {birthday}
  • ConfettiDark background, yellow accent, also displays {age}
  • MinimalWhite background, subtle style with {birthday}

February 29 in non-leap years

Users born on February 29 are celebrated on February 28 in non-leap years (matches German § 187a BGB). In leap years like 2024 or 2028 the congratulation runs on February 29 as expected.

Dashboard tabs

The Birthday module has four tabs in the dashboard:

  • OverviewToday's birthdays, upcoming birthdays, and a monthly view
  • EntriesTable of all registered birthdays with search and month filter
  • Add entryAdmin workflow: pick a user via the Discord search-picker and register a date
  • SettingsChannel, timezone, time, role, ping toggle, canvas editor and fallback text

Privacy

Only day and month are required. The birth year may be omitted — in that case no age is stored or displayed. Server admins see the entries in the dashboard, but all user-facing commands reply ephemerally, so private registrations are never visible in the channel.

On account deletion (GDPR Art. 17) birthday entries are automatically removed via foreign-key cascade with the user account. Tombstoned users are explicitly skipped by the congratulation worker.

Frequent questions

What happens when the bot is offline at the notify time?
On next bot start, the tick worker resumes normally. If the congratulation day hasn't ended yet and 'lastCelebratedAt' isn't set, the congratulation is caught up — late, but exactly once.
Can users register birthdays for other server members?
No. With '/'geburtstag set users only register their own birthday. Server admins can register entries for other users in the dashboard — this is recorded in 'addedByUserId'.
How often can a user change their birthday?
At most once per year (measured from 'lastChangedAt'). This prevents date-hopping to grab repeated congratulations or the birthday role. Server admins can bypass the lock in the dashboard if needed.
Does the congratulation also fire in a custom-bot setup?
Yes. The worker resolves the right Discord client via custom-bot precedence — if a server has its own bot configured, that one posts the congratulation, otherwise the TeraOne default bot does.
Can I test the module without waiting a day?
Yes. Register yourself with today's date, set the notify time in the Settings tab to "now + 2 minutes" and save. The congratulation should appear in the configured channel within those 2 minutes.
Birthday · TeraOne Docs · TeraOne