The short version
Almost every place that accepts variables runs the same resolver: it takes your text, finds every{variable} in it and swaps it for data from whatever set the message off (the member who joined, the giveaway that ended, the message that matched an autoresponder). The data it has depends on that event, the rules don’t.
The order of the steps
Pictures and reactions are taken out
{imgcard:name} is removed from the text and turns into the image card of the message. {reactreply:emoji} is removed and becomes a reaction on the sent message.
In Discord: {imgcard:welcome} became the card of the embed and {reactreply:👋} a reaction.
Functions run
{choose:a|b|c}, {timestamp:<when>|<style>}, {range:1-100}, {arg1} … {arg10} and {args_from:N} are worked out, fresh every time. The same saved message gives a different {choose:…} or {range:…} each time it is sent.
In Discord: the same command twice: {range} and {choose} are picked again each time.
Everything else is looked up in one pass
{name} is matched, ignoring case and spaces inside the braces, against Petto’s list and then against the names other bots use. What a variable gives is never read again, so a member who writes {server_owner} in a message doesn’t make {message_content} ping the owner.
In Discord: {server_owner} written by a member stays text inside {message_content}.
{choose:Hi {user}|Hey} the first } closes the function early. Write {choose:Hi|Hey} {user} instead.
Known, unknown and empty

In Discord: a known variable, a known one without data here, and an unknown one.
{gw.*} only in giveaway messages. Using them elsewhere is harmless, they just give nothing.
Two naming styles, same result
{user_name} and {user.name} resolve identically. The underscore style is the original set, the dot style was added for readability and matches {guild.*}, {channel.*} and the rest. Neither is going away, use whichever reads better.
Words and dates follow the server’s language
The words Petto itself writes into a variable (Yes, Never, Level 2, Not boosting), dates like {user.joined_at} and the ordinal endings (1st, 1.º, 1º) follow the server’s language. Your own text, names and the server’s data are never translated. {date} uses Colombia time (GMT-5); for a time that shows in each reader’s own time zone use the {timestamp…} variables.

In Discord: the words, dates and ordinal endings that Petto writes, in the server's language.
Silent mentions
Put a! right before a mention and it shows as the normal blue mention, but nobody is notified. Without the !, the mention works as always. It works in any message Petto sends, so you can write who a message is about without waking them.

In Discord: the message was written with !@everyone and !@Moderators. Both show as mentions and nobody gets a notification.
The forms
The rules
- The
!goes at the start of the text or after a space, a new line or punctuation.Hello !@hereand(!@here)are silent,hello!@hereis not. - To show the characters
!@everyoneas plain text, write\!@everyone. - It matters in plain messages and in Components V2 text, which are where a mention can notify. In the title, description, fields and footer of a classic embed a mention never notifies, so the
!is only removed there. - A message with silent and normal mentions notifies only the normal ones.
- The one limit: a silent
@everyonenext to a normal@everyonein the same message does notify, because Discord decides it once per message. Use one kind in a message. - The
!only ever removes notifications. A feature that never pings (timers and feeds, for example) does not ping with or without it. - The previews of the dashboard draw a silent mention as a normal mention, without the
!.
When to use it
Use it when a message should show who it is about or who to ask, without waking anyone: an announcement that names!@everyone or !@Moderators as text, a welcome that says Ask !@Moderators if you need help, or a giveaway message that names the winners’ role. For a real ping, write the mention as always.
Testing a message
You don’t need a real event to see the result:!welcome test,!leave test,!boost testand!dmonjoin testsend the message with your own account as the member.!embed preview <name>builds a saved embed with you as the member and the current channel, so variables are filled in.- The dashboard previews fill variables with sample data (a member called Liam, a server with 1,204 members), and a test message sent from the dashboard uses your real account and server.

In Discord: a welcome text tested with !welcome test, every variable filled in.