Skip to main content
A variable is a word in braces, like {user} or {server_name}, that Petto swaps for real data when it sends a message. Write Welcome {user} to {server_name}! and the new member reads Welcome @Liam to Cozy Corner! This page lists every variable Petto knows, grouped by where its data comes from. The examples use a member called Liam (username liam) joining a server called Cozy Corner with 1,204 members.
You don’t have to remember any of this. The dashboard has a searchable variable list with a copy button next to every field that takes variables, and !embed vars shows the list inside Discord.

How variables resolve

The rules behind the scenes: order, empty values, testing.

Need logic or loops?

Petto Code ({{ }}) adds if, loops, data and buttons. Full docs on code.petto.sbs.
A variable written with other capitals, dots or underscores than the real one ({user.displayname}, {server_member_count}) still works when it can only mean one variable. Anything doubtful is left as typed, and the card and embed editors of the dashboard point out the variables Petto does not know.

Writing variables

  • Case and spaces don’t matter. {user.mention}, {User.Mention} and { user.mention } all work.
  • Names from other bots work too. {mention}, {member}, {username}, {server}, {level.xp} and others are read as their Petto equivalent (full list below).
  • A variable Petto doesn’t know stays as you wrote it. {usr} shows up as {usr}, so a typo is easy to spot.
  • A variable with no data in that message is empty. {level} in a welcome message has no level to show, so it disappears. A few say so instead: N/A, Unknown, Never, Not boosting.
  • Values are never read again. If a member’s message contains {server_owner}, {message_content} shows that text as it is, it doesn’t turn into a mention.
  • There are no filters or conditions. Things like {user.name|upper} or “if boosting, say X” are not part of variables. For that, write a custom command in Petto Code.
  • Functions can’t hold other variables. {choose:Hi {user}|Hey} breaks. Put the variable outside: {choose:Hi|Hey} {user}!
  • There is no escape character. A variable Petto knows is replaced even inside code formatting. To show one as text, for example in a help message, describe it in words instead.
  • Discord’s limits still apply. The text after replacing must fit in the message: 2,000 characters for a message, 4,096 for an embed description, 256 for a title, 100 for a channel or thread name.
Because case doesn’t matter, {USER_MENTION} and {Server} work as well.
A ! right before a mention, even before {user.mention}, makes it a silent mention: it shows as a mention and notifies nobody.

Where each group works

The groups under Every message work everywhere variables are accepted. The others only have data in the message of their feature. Some features also have their own placeholders that are not part of this engine, such as {count} in counter names or {number} in ticket names. They are listed in Placeholders of one feature. Timers send their text exactly as written, with no variables.

Every message

User

The member the message is about: who joined, who wrote the trigger, who leveled up, who used the command.
chu creates an embed with {user.*} variables and Petto shows it filled: chu's mention, username, ID, join date and position, top role, color, roles and No for boosting

In Discord: a saved embed made from a code with the User variables, filled with chu.

Turn the _timestamp numbers into a date that shows in each reader’s own time zone: <t:{user.created_at_timestamp}:R> gives “6 years ago”, <t:{user.joined_at_timestamp}:D> gives “October 19, 2026”.

User (legacy)

The original names. They still work and give the same as their dot version.
chu creates an embed with {user_name}, {user_nick} and the other legacy names, and Petto fills them, with Not boosting at the end

In Discord: the legacy names give the same data.

Server

Petto fills the owner, the creation date, 1840 members with people and bots counted apart, the boosts and a random member

In Discord: the Server variables with the numbers of Petto Land.

The counts without bots, the bot count, the join position and the random member are worked out from the members Petto has loaded. On very large servers they can be a little off.

Guild

Dot versions of the server data, plus a few extras.
Petto fills the member count, boost level, roles, channels, emojis, creation date, vanity and member limit of Petto Land

In Discord: the Guild variables, with Level 2 in words and N/A for a vanity the server does not have.

Channel

The channel the message is sent in (for a DM on join, the DM).
chu creates the embed in general and Petto fills the mention, name, ID and topic of general

In Discord: the Channel variables for the channel the message is in.

Invites

Only in welcome messages and DM on join: the invite the new member used. Petto needs Manage Server to see invites.
Petto welcomes Mia in the welcome channel, invited by kira who now has 12 invites, with the code of the invite

In Discord: a welcome with the Invites variables.

Date and time

Petto fills today's date, the current time and how long ago, a time in 2 hours and the New Year party on December 31

In Discord: {date}, {timestamp} and two written moments; the timestamps show in each reader's time zone.

{timestamp:…} reads the moment the way you would say it: in 2h, 3d 4h, tomorrow 8pm, today 18:30, 2026-12-31 23:59, a unix number or a Discord timestamp. Times are read in Colombia time (GMT-5), unless they end in utc (2026-12-31 23:59 utc). After | comes the style: short_time, long_time, short_date, long_date, full, full_long, short_datetime, medium_datetime or relative (or Discord’s letters t T d D f F s S R). Without a style it is full. A moment Petto can’t read gives nothing.
Examples
Discord timestamps (all the {timestamp…} variables) are drawn in the message text, embed descriptions and fields. In embed titles, footers and author names Discord shows the raw <t:…> code instead, so use {date} there.

Functions

Petto shows a dice result, a divider line and one of three games chosen at random

In Discord: {range}, {separator}, {choose} and {newline}.

{choose1:…}, {choose2:…} and so on work the same, if you like to number them. Each one is picked on its own.

Actions and pictures

A pizza or tacos vote by Petto in general with the reactions 🍕 and 🌮 under it

In Discord: a saved embed with two {reactreply:...}: Petto reacts to its own message.


Names from other bots

These names, used by other bots, also work and give the same as the Petto variable they point to. They are read in any case.
chu uses {mention}, {username}, {server}, {server.members} and {boost.*} and Petto fills them

In Discord: names from other bots work like their Petto variable.

Variables for one event

Triggering message

The message that set the reply off. Works in autoresponders, custom commands, auto-thread and text level-ups.
nova says good morning and Petto answers quoting {message_content} with the link of the message

In Discord: an autoresponder that quotes the message that set it off.

Command arguments

What the member typed after the command name in a custom command, or after the trigger in an autoresponder. Text in quotes counts as one argument. Mentions typed by the member never ping anyone through these. The examples are for !hug Mia "big world" now:
kira types !hug with Mia, a quoted text and a word, and Petto fills {arg1}, {arg_count}, {args}, {args_from:2} and the command

In Discord: a custom command with its arguments.

Leveling

In the level-up message, its saved embed, and rank cards.
Petto says chu reached level 12, with a bar of 10 segments, the XP missing, the rank 3 of 120 and the Regular role

In Discord: a level-up message with its progress bar and reward role.

In the level-up text (not in saved embeds), {EMOJI} is replaced by Petto’s star icon.

Giveaways

In giveaway messages and their saved embeds.
Petto announces that Luna won Discord Nitro out of 87 entries, hosted by liam, 1 lucky winner, Ended

In Discord: a winner message made from a saved embed with {gw.*}.

The winner message is used when there is no claim time; with one, the claim message is sent instead. In winner, claim, accept and deny messages {user} is the winner. In the giveaway message itself there is no member, so use {gw.host}.

Bump reminder

Petto thanks chu for the bump and says the next one is in 2 hours

In Discord: the bump thank-you with {nextBump}.

Sanctions

In sanction messages: the DM, the reply and the log entry.
In a DM Petto tells Bruno he was temporarily banned from Petto Land: case 42, the reason, 7 days, the moderator and the appeal link

In Discord: a ban DM made from a saved embed with {case.*}.

Starboard

In the starboard repost design.
Petto reposts nova's meme with 7 stars, the channel, the text, the link and when it was sent

In Discord: a starboard repost made from a saved embed with {star.*}.

Monkeyboard

The same as the starboard, for the monkeyboard: {monkey.count}, {monkey.emoji}, {monkey.channel}, {monkey.channel_name}, {monkey.link}, {monkey.message_id}, {monkey.author}, {monkey.author_name}, {monkey.author_id}, {monkey.author_avatar}, {monkey.content}, {monkey.image}, {monkey.attachments} and {monkey.time}.
The monkeyboard repost of nova's message with 5 monkeys

In Discord: the same design with {monkey.*}.

Clownboard

The same as the starboard, for the clownboard: {clown.count}, {clown.emoji}, {clown.channel}, {clown.channel_name}, {clown.link}, {clown.message_id}, {clown.author}, {clown.author_name}, {clown.author_id}, {clown.author_avatar}, {clown.content}, {clown.image}, {clown.attachments} and {clown.time}.
The clownboard repost of nova's message with 9 clowns

In Discord: the same design with {clown.*}.

Suggestions

In the design of a suggestion.
Suggestion 12 by Mia, approved, with the votes, the percent and kira's answer

In Discord: a suggestion design with {suggestion.*}.

Confessions

In the design of a confession.
Confession 12 with its text, its ID and when it was sent

In Discord: a confession design with {confession.*}.

Polls

In the design of a poll. The vote buttons are added under it.
A poll with two options and their bars, 6 votes, single choice, open, closing in 2 hours, started by liam

In Discord: a poll design with {poll.*}.

Partners

In the replies of Partners.
Petto announces the partner Cozy Club with 1,240 members and thanks Chillet, with this week's count and rank

In Discord: a partner reply with {partner.*}.

Requests

In the answer to who makes a request.
Petto tells Mia that her request 12 for a banner is open and where the staff sees it

In Discord: the answer to a request with {request.*}.

Forms

In the saved embed of a form message (sent, accepted, denied).
In a DM Petto tells Mia that her staff application 12 was accepted, with the reason

In Discord: a form answer by DM with {form.*}.

Honeypot

In the message of a honeypot channel.
Petto warns not to write in the bait channel, that writing there gets a softban, and that 17 were caught

In Discord: the message of a honeypot channel with {honeypot.*}.

Counter milestones

In the saved embed of a counter milestone. The plain text of the announcement uses the short forms.
Petto celebrates that Petto Land reached 1,800 members and has 1,840 now

In Discord: a milestone embed with {counter.*}.

Verification

In a DM Petto asks Mia to verify with the link to enter Petto Land

In Discord: the verification DM with {verify.link}.

Vanity and Server Tag

In the thank-you messages and the log of Vanity and Server Tag rules.
Petto thanks chu for having cinnamochi in the status, gives the Rep role and shows the status, the rule and the action

In Discord: a Vanity thank-you made from a saved embed with {rule.} and {vanity.}.

Rollouts

In Rollout alerts about Discord experiments.
Petto says an experiment went from 37.5% to 50%, with its kind, status, platforms and ID

In Discord: a Rollout alert made from a saved embed with {rollout.*}.

Quests

In the saved embeds of Quest alerts. There are many, so they’re folded.
Petto announces a new quest: the game, the publisher, 200 Orbs for watching a video of 2 minutes, the platforms, when it ends and the link

In Discord: a Quest alert made from a saved embed with {quest.*}.


Feeds

In the words above each notice of a feed (!feed message). They only work there.
Petto says there is a new YouTube video, with its title, the account and the link

In Discord: the words above a feed notice with {feed.*}.

Placeholders of one feature

These short placeholders are filled by the feature itself, not by the engine above. They only work in the place listed. Where the table says yes under “Variables too”, the regular variables also work in that same text.

Counters

A counter name is any text with {count}. Discord allows 100 characters in a channel name and 1,024 in a topic.
Examples
The milestone text takes {count} (members now), {goal} or {milestone} (the number reached) and {server}, with numbers grouped (1,000):
Example

Tickets

Channel names are made lowercase, accents and symbols become -, and they are cut at 90 characters: {category}-{username} gives support-liam. A saved embed as the ticket welcome uses the regular variables instead (the member is the opener, the channel is the ticket).
Examples

Forms and appeals

Form messages (the DM after sending, accepting or denying, set with !form message) take {form} (the title), {number}, {server}, {status} and {reason}, and the regular variables too, so {user} mentions the member. A saved embed for those messages uses the Forms group instead. Appeal messages (set in the dashboard) take {username}, {server}, {reason}, {form} and {link} (the status page of the appeal). The “sent” message and the staff reply notice only fill {server}, and the thread name only {username}. The line about appeals in a sanction DM takes {server} and {link}; if it has no {link}, the link is added at the end.

Recipes

Copy-paste ready. Each one says where it goes and what the member sees.
Command
Result
Command
Result
With --milestone 10 --message "{user} is level 10 and unlocked {level_role}!" that level gets its own text.
Command
Result
Command
Result
Command
Result
Command
Result
Command
Result
Command
Result
Each reader sees the time in their own time zone. The time you write is read in Colombia time (GMT-5); add utc to write it in UTC.