> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rbxweb.net/llms.txt
> Use this file to discover all available pages before exploring further.

# Placeholders

> Substitution tokens you can use inside any message template.

Placeholders are tokens wrapped in braces (like `{user}`) that are replaced with live values at send time. Every message template in the dashboard supports the same placeholders, except where noted.

## Common placeholders

These work in every message template: welcome, goodbye, auto-mute, message-on-mute, hug, slap, competition embeds, quick-thread templates.

<ResponseField name="{user}" type="Discord mention">
  Pings the relevant user (the one joining, leaving, being hugged, etc.). Renders as a blue clickable mention in Discord.
</ResponseField>

<ResponseField name="{user_name}" type="plain text">
  The same user's display name as plain text (nickname, then global name, then username). Use this in titles, footers, or when a ping isn't appropriate.
</ResponseField>

<ResponseField name="{server}" type="plain text">
  The server name.
</ResponseField>

<ResponseField name="{member_count}" type="number">
  Current member count of the server. Often used in welcome messages ("Welcome — you're member #{member_count}!").
</ResponseField>

## Contextual placeholders

These only render when the feature that's firing has the corresponding context.

<ResponseField name="{target}" type="Discord mention">
  In `!hug` and `!slap`, pings the user being hugged or slapped.
</ResponseField>

<ResponseField name="{target_name}" type="plain text">
  Same as `{target}` but as plain text.
</ResponseField>

<ResponseField name="{muted_by}" type="plain text">
  In message-on-mute templates, the display name of the moderator who applied the mute role.
</ResponseField>

<ResponseField name="{reason}" type="plain text">
  In message-on-mute, the reason if the mute came from a command that supports one. Empty otherwise.
</ResponseField>

<ResponseField name="{duration}" type="plain text">
  In auto-mute timeout messages, the duration of the Discord timeout (for example, `5 minutes`, `1 hour`).
</ResponseField>

## Competition placeholders

These are available in competition embeds: opening message, winner announcement, reminder, and periodic updates.

<ResponseField name="{title}" type="plain text">
  The competition title.
</ResponseField>

<ResponseField name="{theme}" type="plain text">
  The competition theme. Empty if no theme was set.
</ResponseField>

<ResponseField name="{prize}" type="plain text">
  Prize text for the current context (first prize in the opening embed, winner-appropriate prize in the announcement).
</ResponseField>

<ResponseField name="{winner}" type="Discord mention(s)">
  Pings the winner — or all winners, when there is more than one. Only valid in the winner announcement.
</ResponseField>

<ResponseField name="{winner_name}" type="plain text">
  Winner's display name — or a comma-separated list of all winners' names. Only valid in the winner announcement.
</ResponseField>

<ResponseField name="{winners}" type="number">
  Configured number of winners. Useful in reminders ("Voting ends in {hours}h — picking {winners} winners").
</ResponseField>

<ResponseField name="{votes}" type="number">
  Vote count for the winning entry. Only valid in the winner announcement.
</ResponseField>

<ResponseField name="{channel}" type="Discord channel mention">
  Link to the competition channel.
</ResponseField>

<ResponseField name="{hours}" type="number">
  Hours remaining until the competition ends. Only valid in reminders.
</ResponseField>

<ResponseField name="{ends_at}" type="Discord timestamp">
  End time rendered as a Discord relative timestamp, so it auto-localizes per viewer.
</ResponseField>

<ResponseField name="{competition}" type="Discord message link">
  A direct link back to the opening competition message.
</ResponseField>

The message/embed editors expose these clearer, competition-specific tokens (the `{title}` / `{theme}` / `{prize}` aliases above keep working in older templates):

<ResponseField name="{comp_title}" type="plain text">
  The competition title (alias of `{title}`).
</ResponseField>

<ResponseField name="{comp_theme}" type="plain text">
  The competition theme (alias of `{theme}`).
</ResponseField>

<ResponseField name="{comp_winners}" type="number">
  Configured number of winners (alias of `{winners}`).
</ResponseField>

<ResponseField name="{comp_ends}" type="Discord timestamp">
  End time as an absolute + relative Discord timestamp, e.g. `Jan 1, 2026 12:00 (in 3 hours)`.
</ResponseField>

<ResponseField name="{comp_prize_1} … {comp_prize_10}" type="plain text">
  Prize per winner slot — `{comp_prize_1}` is first place, `{comp_prize_2}` second, and so on. The Variables popup shows only as many as the configured **Number of Winners**. Empty slots resolve to nothing.
</ResponseField>

<ResponseField name="{comp_channel_url}" type="URL">
  The plain `https://discord.com/channels/…` link to the competition channel. Meant for an embed's **title link** field: Discord only renders an embed title blue (clickable) when it has a URL, so the default announcement template puts this token there. Resolves to nothing if no competition channel is set, in which case the title just stays white.
</ResponseField>

<ResponseField name="{comp_id}" type="plain text">
  The competition's per-server running number, zero-padded to three digits (`012`). Every default template footer starts with `[ID:#{comp_id}]`, which is how you tell one competition's messages from another's. The padding matches the tag the bot stamps on its own embeds (logs, standings), so the ID reads identically everywhere.
</ResponseField>

<ResponseField name="{reaction_emoji}" type="emoji">
  The vote reaction emoji. Available in the opening embed.
</ResponseField>

<ResponseField name="{mod_bypass_code}" type="plain text">
  The image-only bypass code. Available in the opening embed.
</ResponseField>

<ResponseField name="{winner_image}" type="image URL">
  The top winner's submitted image. Drop it in the winner editor's image slot; it also works as text. Only valid in the winner announcement.
</ResponseField>

<ResponseField name="{rankings}" type="plain text block">
  A formatted, multi-line medal / vote / submission-link list of every winner. Only valid in the winner announcement.
</ResponseField>

<ResponseField name="{winner_prizes}" type="plain text block">
  A formatted, multi-line list that pairs every winner with their place-based prize — one line per winner: medal, mention, vote count, and `🎁 prize` (the gift part is omitted for a winner whose prize slot is blank). This is what makes "which winner gets which prize" show automatically, so it's in the default winner template. Only valid in the winner announcement.
</ResponseField>

<ResponseField name="{entry_count}" type="number">
  How many entries have been submitted so far. Only valid in the status-update message.
</ResponseField>

<ResponseField name="{entries}" type="plain text block">
  The live standings — one line per entry with the member, their vote count and a link to their submission. Capped at the top 20 entries, followed by an "…and N more" line. Renders `*No participants yet.*` while the competition has no entries. Only valid in the status-update message.
</ResponseField>

## Guess Word placeholders

These render inside the **Guess Word Game** editors — the Game Message (start announcement) and the private Winner Thread Message (Booster+ feature). They do not work in other message templates.

<ResponseField name="{question}" type="plain text">
  The question. In the **Start from Discord** template its line holds the question passed by `/guess_word question:…` (the **Start from Dashboard** template has no `{question}` — you write the question directly into it). In the Winner Thread Message it's the original question text.
</ResponseField>

<ResponseField name="{user}" type="Discord mention (Winner Thread Message)">
  The winner who guessed correctly.
</ResponseField>

<ResponseField name="{host}" type="Discord mention">
  Mention of the game host — the **Game Host** field (dashboard starts, falling back to whoever pressed Start) or the moderator who ran `/guess_word`.
</ResponseField>

<ResponseField name="{host_name}" type="plain text">
  The game host's display name as plain text. For dashboard starts the host is the optional **Game Host** field (else whoever pressed Start Game); `/guess_word` always uses the command's moderator. The `{host_avatar}` media token (footer/author icons, images) resolves to the same user's avatar.
</ResponseField>

<ResponseField name="{prize_name}" type="plain text (Discord template & Winner Thread)">
  The prize supplied when the game was started (the Prize field or `/guess_word prize:…`). A line containing it is removed entirely when no prize is set. The Dashboard template doesn't use it — write the prize there as plain text. The legacy `{prize}` alias keeps working.
</ResponseField>

<ResponseField name="{winner_code}" type="plain text (Winner Thread Message)">
  The optional win-code — delivered privately inside the winner thread; its line is removed when no code is set. The legacy `{code}` alias keeps working.
</ResponseField>

<ResponseField name="{answer}" type="plain text (Winner Thread Message)">
  The correct answer.
</ResponseField>

## Codes Drop Portals

These tokens work in the editors of [Codes Drop Portals](/features/codes-drop-portals). `{user}`, `{user_name}`, and `{server}` resolve as usual.

**Campaign tokens** — resolved in *every* Portal Embed state tab and the winner message:

<ResponseField name="{portal_id}" type="plain text">
  The campaign code (e.g. `88761K7P2`).
</ResponseField>

<ResponseField name="{codes_left}" type="plain text">
  The number of codes still unclaimed — updates live on every drop.
</ResponseField>

<ResponseField name="{codes_per_member}" type="plain text">
  The configured max codes per member (`unlimited` when set to 0).
</ResponseField>

<ResponseField name="{required_role}" type="plain text">
  The name of the Required Role. Greyed out in the Variables popup until a role is selected.
</ResponseField>

**State tokens** — only in the tab that lists them:

<ResponseField name="{activated_by}" type="Portal opened tab">
  The name of the member who activated the portal.
</ResponseField>

<ResponseField name="{closing_in}" type="Portal opened tab">
  A live countdown until the portal closes (Discord relative timestamp).
</ResponseField>

<ResponseField name="{survivor}" type="Winner selection & Portal log tabs">
  The winner's mention — or `Noone made it alive` when nobody won.
</ResponseField>

<ResponseField name="{participants}" type="Winner selection & Portal log tabs">
  Everyone who tried to enter the portal.
</ResponseField>

<ResponseField name="{portal_channel}" type="Portal log tab">
  The channel the portal opened in — a clickable link when the channel is public, otherwise just its name.
</ResponseField>

<ResponseField name="{portal_status}" type="Portal log tab">
  "Draw has been finished. Portal is on cooldown" (with the next-portal time when enabled) — or "…Portal is gone for now" after the last code is claimed.
</ResponseField>

**Winner-message tokens** — only in the Winner Thread editor:

<ResponseField name="{item}" type="plain text">
  The name of the item the member won (e.g. `Sword of Fire`).
</ResponseField>

<ResponseField name="{code}" type="plain text">
  The won code, delivered privately inside the winner thread — **required**; the campaign won't start without it. (The same `{code}` token is also used by Guess Word.)
</ResponseField>

## Roblox Trackers — Game Player Count (CCU)

These render inside a game's player-count report. Each report tracks exactly one game, so the tokens are unsuffixed. They do not work in other message templates.

<ResponseField name="{game_name}" type="plain text">
  The game's name, as Roblox reports it.
</ResponseField>

<ResponseField name="{players}" type="number">
  Players in the game right now (live concurrent players / CCU).
</ResponseField>

<ResponseField name="{max_players}" type="number">
  Server size — the maximum players allowed per server.
</ResponseField>

<ResponseField name="{visits}" type="number">
  All-time visits, thousands-separated (e.g. `4,120,908`).
</ResponseField>

<ResponseField name="{game_link}" type="URL">
  Link to the game on Roblox. Works as a title link (which is what makes an embed title render blue).
</ResponseField>

<ResponseField name="{place_id}" type="plain text">
  The game's place ID — the number in its Roblox URL.
</ResponseField>

<ResponseField name="{universe_id}" type="plain text">
  The game's universe ID, resolved from the place ID when the game is added.
</ResponseField>

<ResponseField name="{game_icon}" type="image URL">
  The game's icon (square). An **image token** — drop it in the editor's thumbnail or image slot. Roblox serves game artwork from a different API than the player count, so the bot fetches it separately and caches it.
</ResponseField>

<ResponseField name="{game_thumbnail}" type="image URL">
  The game's thumbnail (wide 16:9). An **image token**, same as `{game_icon}`.
</ResponseField>

## Unknown placeholders

If you type a placeholder that doesn't match any known token, it stays in the message as literal text (`{foo}` is sent as `{foo}`). There are no errors — if something isn't substituting, check the spelling against this page.

## Placeholder chips

Below most text and textarea fields in the dashboard, the available placeholders are shown as `<code>` chips. Click any chip to insert that token at your cursor — faster and safer than typing by hand.
