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. Two exceptions: in goodbye messages it is the member's username (they already left, so a mention would point at nobody), and in custom command responses it is the username as well |
{user.mention} | A mention | Always pings — use it in custom commands when you do want the ping |
{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 |
| Placeholder | Becomes |
|---|---|
{server} | Server name |
{server.name} | Server name — same as {server} |
{server.memberCount} | Current member count |
| 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 |
Stream alerts have no placeholders: the custom message is posted verbatim, ahead of the alert embed, and the optional notify role is a separate setting.
| Plugin | Field | Supported |
|---|---|---|
| Welcome & Goodbye | Welcome text | All user and server placeholders |
| Welcome & Goodbye | Goodbye text | Same, but {user} is the username (no ping) |
| Leveling | Level-up message | All user and server placeholders, plus {level} |
| Birthdays | Celebration message | All user and server placeholders, plus {age} |
| Tickets | Welcome message | {user} |
| Tickets | Channel name template | {user} {number} — lower-cased, Discord-safe characters only |
| Temp Voice | Name template | {user} (the owner's display name) |
| Custom Commands | Response content | All user and server placeholders — {user} is the username, {user.mention} pings |
| Reaction Roles | Feedback texts | {user} {role} |
| AutoMod | Warn / timeout notice | {user} {rule} |
| AutoMod | Escalation notice | {user} {count} {action} — {rule} is not available here |
| Scheduled Messages | Content | Server placeholders only — there is no member involved |
| 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.A role mention pasted into a template (<@&roleId>) renders as a role link, but Cloudy does not
ping roles from message templates — welcome and goodbye messages only ever notify the member they
are about. Where a role should be pinged (stream alerts, for example), the plugin has a dedicated
notify-role setting.
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.