Message placeholders
Many features let you write a message with placeholders: short tokens the bot swaps for live values when it posts. The rich-text editor has a placeholder menu (the { } button) that lists exactly the ones available for whatever you are editing, grouped by category, so you never have to memorise them. Tokens are written {category.property} and are not case-sensitive.
Placeholders only fill in where the bot has that data
The menu shows you a tidy set per surface, but the exact data depends on what triggered the message. If a value isn't available it renders as empty. When in doubt, use the editor's preview and the Test button (where available), or run the command/automation live, to confirm yours works.
Formatting shortcuts
Use the toolbar for bold, italic, lists, and the rest, or type Discord markdown as you go: a line starting with > becomes a quote, ``` starts a code block, and `text` becomes inline code. Inside a code or quote block, press Enter to leave it and Shift+Enter to add another line within it.
User
| Token | Becomes |
|---|---|
{user.name} | The member's display name, as plain text. |
{user.tag} | The member's username (handle). |
{user.id} | The member's numeric Discord ID. |
{user.mention} | A mention of the member (pings them where pings are allowed). |
{user.nickname} | The member's server nickname (falls back to their name). |
Server
| Token | Becomes |
|---|---|
{server.name} | The server's name. |
{server.id} | The server's numeric ID. |
{server.membercount} | The current (live) member count; goes up and down. |
{server.membernumber} | A per-server join counter that only ever goes up (welcome only). Best for a "you're member #N" badge. |
Channel
| Token | Becomes |
|---|---|
{channel.name} | The channel's name. |
{channel.id} | The channel's numeric ID. |
{channel.mention} | A clickable channel link. |
{channel.type} | The channel's type (Text, Voice, Stage, News, Forum). |
Previous channel
Only used by the Member moved voice channel automation trigger. It is the voice channel the member moved away from. The {channel.*} tokens above are the channel they moved into.
| Token | Becomes |
|---|---|
{oldchannel.name} | The name of the voice channel the member came from. |
{oldchannel.id} | The numeric ID of the voice channel the member came from. |
{oldchannel.mention} | A clickable link to the voice channel the member came from. |
Role
| Token | Becomes |
|---|---|
{role.name} | The role's name (comma-joined when several apply). |
{role.id} | The role's numeric ID. |
{role.mention} | A mention of the role. |
{role.color} | The role's colour as a hex code. |
Message
Used by message and moderation triggers. For the contains words, starts with and tag triggers, {message.content} is the message that was just sent. For the edit and delete triggers the content comes from the Message logging cache. If that feature is off, or the channel isn't logged, they show a short note instead.
| Token | Becomes |
|---|---|
{message.content} | The message content (or, on warn/note triggers, the reason text). |
{message.oldcontent} | The message content before an edit/delete. |
XP
| Token | Becomes |
|---|---|
{xp.level} | The member's XP level. |
{xp.amount} | The member's total XP. |
Ticket
| Token | Becomes |
|---|---|
{ticket.category} | The ticket's category name. |
{ticket.number} | The ticket's sequential number. |
Feed
Used by the optional custom announcement on a feed subscription.
| Token | Becomes |
|---|---|
{feed.source} | The feed's display name (the source you subscribed to). |
{feed.kind} | The feed kind (YouTube, Twitch, Kick, GitHub, RSS). |
{feed.title} | The new item's title. |
{feed.link} | A link to the new item. |
{feed.id} | The new item's unique id. |
Moderation
Used by the optional custom warning DM. The warned member is on the {user.*} tokens; the acting moderator is on {mod.*}.
| Token | Becomes |
|---|---|
{mod.name} | The acting moderator's display name. |
{mod.mention} | A mention of the acting moderator. |
{mod.reason} | The warning text. |
{mod.action} | The moderation action taken. |
Reminder
Used by the optional custom reminder DM.
| Token | Becomes |
|---|---|
{reminder.content} | The reminder text the member set. |
{reminder.channel} | A clickable link to where the reminder was set. |
{reminder.setat} | When the reminder was created (relative time). |
Suggestion
Used by the optional custom suggestion embed title/body.
| Token | Becomes |
|---|---|
{suggestion.number} | The suggestion's sequential number. |
{suggestion.content} | The suggestion text. |
{suggestion.status} | The suggestion's current status. |
{suggestion.upvotes} | The number of upvotes. |
{suggestion.downvotes} | The number of downvotes. |
{suggestion.author} | The suggestion author's display name. |
Poll
Used by the optional custom poll close summary.
| Token | Becomes |
|---|---|
{poll.question} | The poll question. |
{poll.results} | The per-option vote breakdown. |
{poll.total} | The total number of votes cast. |
Achievement
Used by the achievement card and the Achievement earned automation trigger.
| Token | Becomes |
|---|---|
{achievement.name} | The achievement's name. |
{achievement.description} | The achievement's description. |
{achievement.rarity} | The rarity tier (your server's renamed name). |
{achievement.id} | The achievement's unique id (handy in automation conditions). |
Done by
Used by automation triggers where someone made a change: role, nickname and timeout changes, kicks, bans, warnings and notes, deleted messages, voice joins, leaves and moves, channel, role and server changes, and invite, emoji, sticker, thread and webhook changes. For a new invite or a new thread, Discord says who made it right away. For everything else the bot finds out who did it by reading your server's audit log (Discord's own record of who changed what), so it needs the View Audit Log permission.
| Token | Becomes |
|---|---|
{actor.name} | The name of who did it. That can be a member, a moderator, another bot or app, or SnowstormBot itself. Shows Unknown when the bot can't find out. |
{actor.mention} | A mention of who did it, or Unknown. |
{actor.id} | The Discord ID of who did it, or empty when unknown. |
A message that was deleted without anyone else being recorded was deleted by its own author, so {actor.name} is the author then.
The same goes for the voice triggers. When a member leaves voice or switches channel and no moderator is recorded, they did it themselves, so {actor.name} is the member. Joining voice is always done by the member.
On the Member left trigger these name the person who kicked the member. When the member left by themselves there is nobody to name, so they stay empty.
Leave
Used by the Member left automation trigger.
| Token | Becomes |
|---|---|
{leave.kicked} | true when the member was kicked, false when they left by themselves. Telling the two apart needs the View Audit Log permission. Without it, this is only true for kicks done with the bot's own /kick command. |
For a kick, the reason the moderator gave is in {message.content}.
Changes
Used by the Server updated, Channel updated, Role updated and Webhook created, updated or deleted triggers.
| Token | Becomes |
|---|---|
{changes.list} | Everything that changed, one line each, like Name: Old name → New name. Empty when the bot can't read the audit log. |
Profile
Used by the Member started boosting and Member stopped boosting triggers.
| Token | Becomes |
|---|---|
{profile.boostsince} | When the member's boost started, shown as a relative time like "3 months ago". On stopped boosting it is when the boost that just ended began. |
{profile.boostsince} only fills in on the boost triggers. Anywhere else it is empty.
Older templates that still use {profile.avatartype} or one of the old name and avatar tokens (like {profile.oldusername}) now show nothing in their place.
Invites
Used by the Invite created and Invite deleted triggers. The channel the invite leads to is on {channel.mention} and {channel.id}.
| Token | Becomes |
|---|---|
{invite.code} | The invite's code, the part after discord.gg/. |
{invite.link} | The full invite link, like https://discord.gg/aBcD123. |
{invite.maxuses} | How many times the invite can be used, or No limit. Only for a new invite. |
{invite.expires} | When the invite stops working, like after 7 days, or Never. Only for a new invite. |
Emoji
Used by the Emoji created, renamed or deleted trigger.
| Token | Becomes |
|---|---|
{emoji.name} | The emoji's name. After a rename, this is the new name. |
{emoji.oldname} | The emoji's name before a rename. For anything else it is the same as {emoji.name}. |
{emoji.change} | What happened: created, renamed or deleted. |
Sticker
Used by the Sticker created, renamed or deleted trigger.
| Token | Becomes |
|---|---|
{sticker.name} | The sticker's name. After a rename, this is the new name. |
{sticker.oldname} | The sticker's name before a rename. For anything else it is the same as {sticker.name}. |
{sticker.change} | What happened: created, renamed or deleted. |
Thread
Used by the Thread created and Thread deleted triggers. A forum post is a thread too. The channel the thread lives in is on {channel.mention} and {channel.id}.
| Token | Becomes |
|---|---|
{thread.name} | The thread's name. Empty when the bot can't find out the name of a deleted thread. |
{thread.mention} | A clickable link to the thread. |
{thread.id} | The thread's numeric ID. |
Webhook
Used by the Webhook created, updated or deleted trigger. A webhook is a way for an app or a person to post messages in a channel under any name and picture. The channel is on {channel.mention} and {channel.id}. Those two can be empty for an edit when the bot can't tell which channel the webhook belongs to, for example when someone only renamed it or changed its picture.
| Token | Becomes |
|---|---|
{webhook.name} | The webhook's name. As long as the webhook still exists the bot can find its name, even for an edit that only changed its picture. It is empty without the View Audit Log permission, or for a deleted webhook when the audit log doesn't say what it was called. |
{webhook.change} | What happened: created, updated or deleted. Without the View Audit Log permission it says changed. |
{webhook.id} | The webhook's numeric ID. |
Tagged
Used by the Member tagged, Role tagged and Channel linked automation triggers. It is the member, role or channel that someone tagged in their message. The person who wrote the message is on the {user.*} tokens.
| Token | Becomes |
|---|---|
{tagged.name} | The name of the member, role or channel that was tagged. |
{tagged.mention} | Tags it again: @name for a member or role, #name for a channel. |
{tagged.id} | Its numeric ID. |
API
Used by the API triggered automation trigger. Your own program sends these values with the developer API.
| Token | Becomes |
|---|---|
{api.yourName} | The value your program sent as yourName. In the editor, pick API, Custom variable from the placeholder menu and type the name (letters, numbers and underscores). Double click the chip to rename it. A name your program did not send becomes empty. |
Values can never ping anyone: @everyone and mentions are shown as plain text.
The default level-up message, for example, is GG {user.mention}, you reached level {xp.level}!
Channel names
Channel-name templates (voice hub channel names, ticket channel names) are not markdown surfaces (Discord lowercases them and strips formatting), so they use their own small token set rather than the catalog above: voice hubs support {user}, and ticket channel names support {user} and {number}.