Message fields accept placeholders in curly braces that Cloudy replaces per message. They are case-sensitive and must be written exactly as listed.
An unknown placeholder is not an error — it is left in the message verbatim. If members see a
literal {membercount} in your welcome message, the placeholder was misspelled (it is
{server.memberCount}).
| Placeholder | Becomes | Notes |
|---|---|---|
{user} | A mention: @Nova | Pings the member. In goodbye messages it is the plain name instead — the member already left, so a mention would point at nobody |
{user.name} | Display name | No ping |
{username} | Discord username | No ping |
{user.tag} | Full tag | No ping |
{user.id} | Numeric user id | Useful in log-style messages |
{userMention} | A mention | Custom commands only — same result as {user} there |
| Placeholder | Becomes |
|---|---|
{server} | Server name |
{server.memberCount} | Current member count |
{memberCount} | Member count — custom commands only |
| Placeholder | Where | Becomes |
|---|---|---|
{level} | Leveling — level-up message | The level just reached |
{age} | Birthdays — celebration message | Age in years, when the member stored a birth year |
{role} | Reaction roles — feedback texts | The role that was granted or removed |
{rule} | AutoMod — warn and timeout notices | Name of the rule that fired |
{count} | AutoMod — escalation notice | Current number of active warnings |
{action} | AutoMod — escalation notice | The punishment applied (timeout, kick, ban) |
{number} | Tickets — channel name template | Sequential ticket number for the panel |
{streamer} | Stream alerts — custom message | Streamer name |
{url} | Stream alerts — custom message | Link to the stream |
{title} | Stream alerts — custom message | Stream title |
| Plugin | Field | Supported |
|---|---|---|
| Welcome & Goodbye | Welcome text | {user} {user.name} {username} {user.tag} {user.id} {server} {server.memberCount} |
| Welcome & Goodbye | Goodbye text | Same, but {user} is the plain name |
| Leveling | Level-up message | {user} {level} {user.name} {username} {server} {server.memberCount} |
| Birthdays | Celebration message | {user} {age} |
| Tickets | Welcome message | {user} |
| Tickets | Channel name template | {user} {number} |
| Temp Voice | Name template | {user} (the owner's display name) |
| Custom Commands | Response content | {user} {userMention} {server} {memberCount} |
| Reaction Roles | Feedback texts | {user} {role} |
| AutoMod | Warn / timeout notice | {user} {rule} |
| AutoMod | Escalation notice | {user} {count} {action} — {rule} is not available here |
| Stream Alerts | Custom message | {streamer} {url} {title} |
| Automations | Message / reply / DM content | User and server placeholders |
{rule} has no meaning there and stays as literal text if you use it.{user} produces a real mention, which produces a real notification. Two consequences worth
planning for:
{user.name}. It reads the same and pings
nobody.Role mentions work too — type @rolename in the field and Discord resolves it when the message is
sent. The bot needs permission to mention that role.
Message fields support normal Discord Markdown:
**bold** *italic* __underline__ ~~strikethrough~~ `code`
> quote
||spoiler||
Line breaks are preserved. Channel links (#channel) and custom emojis (<:name:id>) can be pasted
directly into any field.