Variables let a Better Tickets message change depending on who it's about. Type {{author.username}} in a ticket welcome message and each member sees their own name. This page covers the template syntax (output tags, if conditions and the random tag) and lists every variable available in ticket, application and leveling messages.

Output tags: {{ }}
Wrap a variable name in double braces to insert its value.
{{author.username}} opened this ticket.
Renders as alex opened this ticket. if author.username is alex. Nest with dots ({{author.username}}, {{server.name}}), spacing inside braces doesn't matter. An unknown variable renders as empty, not an error.
{{now}} is always available and holds the current time as a Unix timestamp. Use it inside a Discord timestamp tag, such as Opened <t:{{now}}:R>, to show a time in each reader's own time zone. The Discord timestamp generator explains every timestamp format.
Conditional tags: {% if %}
{% if fruit %}You picked {{fruit}}.{% else %}No fruit picked yet.{% endif %}A condition is either:
- Truthy:
{% if fruit %}, true if set at all. - Equality:
{% if fruit == "apple" %}or!=. Quotes optional for single words, required if the value has spaces. The right side can be another dotted variable too, e.g.{% if author.userId == server.ownerId %}.
Chain more branches with {% elsif %}:
{% if status == "accepted" %}Accepted{% elsif status == "denied" %}Denied{% else %}Pending{% endif %}Both % symbols matter, {% if claimer} (missing one) is left as broken literal text.
A broken {% if %} (missing {% endif %} or an unparseable condition) makes everything from that point to the end of the message render as raw text. Everything before it still works.
The random tag: {{random: ...}}
Picks one option at random each render, comma-separated:
{{random: A staff member will be with you shortly., Please wait for a staff member., Hello\, we'll be right with you.}}This is what the default welcome message uses. Escape a literal comma with \,.
Common variables
Available in both ticket and application messages, only author's meaning changes.
nownumberauthor.userIdstringauthor.usernamestringauthor.globalNamestringauthor.createdAtnumberauthor.joinedAtnumber{% if author.joinedAt %} first.reasonstringlevelnumberauthor's current level, available even if Leveling is off.totalXpnumberauthor's lifetime total XP.currentXpnumberrequiredXpnumberserver.idstringserver.namestringserver.ownerIdstringserver.memberCountnumberWhere you can use variables
Tickets
Every ticket message field gets the common variables plus ticketId (the category's identifier). What else each one adds:
| Field | Also gets |
|---|---|
| Channel name template (Premium) | Everything below; this field gets every ticket variable |
| Welcome message / Footer text | author.joinedAt, reason, level variables, claimer.* |
| Claimed / Unclaimed message | claimer.*, user.*, ticketNumber, guildTicketNumber |
| Escalated message | claimer.*, user.*, fromCategory, toCategory, ticketNumber, guildTicketNumber |
| Member added / removed message | claimer.*, user.*, target.*, ticketNumber, guildTicketNumber |
| Close message (kept open) | claimer.*, user.*, reason, ticketNumber, guildTicketNumber |
claimer.userIdstring{% if claimer %}.claimer.usernamestringclaimer.globalNamestringuser.userIdstringuser.usernamestringuser.globalNamestringtarget.userIdstringtarget.usernamestringtarget.globalNamestringticketNumbernumberguildTicketNumbernumberfromCategorystringtoCategorystringDefault channel name, used unless you set a template with Premium:
{% if claimer %}✅{{author.username}}-{{claimer.username}}{% else %}{{ticketId}}-{{author.username}}{% endif %}Default footer:
{% if claimer %}Opened by {{claimer.username}} for {{author.username}}.{% else %}Opened by {{author.username}}.{% endif %}Applications
Every application field gets the common variables, except Title/Description which only gets server (there's no applicant yet). What each field adds:
| Field | Also gets |
|---|---|
| Submission message (Premium) | reviewer.*, decision, decidedAt, qa, applicationNumber, guildApplicationNumber |
| Accepted / Denied DM | reviewer.*, reason, level variables, applicationNumber, guildApplicationNumber |
| Reapply cooldown message | readyAt |
| Application timeout DM | applicationName, applicationNumber, guildApplicationNumber |
| Review thread name | applicationNumber, guildApplicationNumber |
reviewer.userIdstringreviewer.usernamestringreviewer.globalNamestringqastringdecisionstring"Accepted" or "Denied", once decided.decidedAtstringapplicationNumbernumberguildApplicationNumbernumberreadyAtstringapplicationNamestringDefault submission message:
**New application**
Author: <@{{author.userId}}>.
Username: {{author.username}}.
Nickname: {{author.globalName}}
{{qa}}A decided-by footer is added automatically and can't be edited.
Leveling
Message template (Announcements tab). Common variables plus {{level}}.
Default: 🎉 {{author.username}} just reached level **{{level}}**!
Roleplay
Message template and Footer text (Premium). Does not use common variables, server isn't available and author/target only expose id/username.
author.idstringauthor.usernamestringtarget.idstring{% if target.id %}.target.usernamestringtarget.id.verbstringis hugging you.gerundstringhugging.paststringhave hugged.isBackbooleantrue for a reciprocation via the back button.mutualCountnumber0 if not tracked.receivedCountnumbertarget has had this done to them by anyone. 0 if not tracked.givenCountnumberauthor has performed this action on anyone.rp.animeNamestring{% if rp.animeName %}.rp.artistNamestringrp.artistHrefstringrp.sourceUrlstringrp.urlstringrp.widthnumberrp.heightnumberDefault message (handles with/without target in one template):
{% if target.id %}<@{{target.id}}>! {{author.username}} {{verb}}{% if isBack %} back{% endif %}.
{% if mutualCount %}-# {{author.username}} and {{target.username}} {{past}} {{mutualCount}} time(s).{% elsif receivedCount %}-# {{target.username}} {{past}} {{receivedCount}} time(s).{% endif %}{% else %}{{author.username}} is {{gerund}}.{% endif %}Default footer: {% if rp.animeName %}-# Anime name: {{rp.animeName}}.{% endif %}
Per-command reference, what {{verb}}/{{gerund}}/{{past}} resolve to ({{past}} only shows on actions that track a count):
| Command | {{verb}} | {{gerund}} | {{past}} |
|---|---|---|---|
/hug | is hugging you | hugging | have hugged |
/kiss | is kissing you | kissing | have kissed |
/pat | is patting you | patting | has been patted |
/cuddle | is cuddling you | cuddling | have cuddled |
/slap | is slapping you | slapping | has been slapped |
/poke | is poking you | poking | has been poked |
/tickle | is tickling you | tickling | has been tickled |
/bite | is biting you | biting | has been bitten |
/kick | is kicking you | kicking | has been kicked |
/punch | is punching you | punching | has been punched |
/feed | is feeding you | feeding | has been fed |
/wave | is waving at you | waving at | has been waved at |
/peck | is pecking you | pecking | have pecked |
/carry | is carrying you | carrying | has been carried |
/bonk | is bonking you | bonking | has been bonked |
/handhold | is holding hands with you | holding hands with | have held hands |
/highfive | is high-fiving you | high-fiving | has been high-fived |
/shake | is shaking you | shaking | has been shaken |
/handshake | is shaking hands with you | shaking hands with | have shaken hands |
/nom | is nomming on you | nomming on | has been nommed on |
/blowkiss | is blowing a kiss to you | blowing a kiss to | has been blew a kiss to |
/yeet | is yeeting you | yeeting | has been yeeted |
/shoot | is shooting you | shooting | has been shot |
/lick | is licking you | licking | has been licked |
/cry | is crying with you | crying | has cried |
/laugh | is laughing with you | laughing | has laughed |
/angry | is angry at you | angry | has been angry |
/bleh | is sticking their tongue out at you | being bleh | has been bleh |
/blush | is blushing at you | blushing | has blushed |
/bored | is bored around you | bored | has been bored |
/clap | is clapping for you | clapping | has clapped |
/confused | is confused about you | confused | has been confused |
/dance | is dancing with you | dancing | has danced |
/facepalm | is facepalming at you | facepalming | has facepalmed |
/happy | is happy around you | happy | has been happy |
/lurk | is lurking near you | lurking | has lurked |
/nod | is nodding at you | nodding | has nodded |
/nope | nopes at you | noping out | has noped out |
/nya | nyas at you | being nya | has been nya |
/pout | is pouting at you | pouting | has pouted |
/shocked | is shocked by you | shocked | has been shocked |
/shrug | is shrugging at you | shrugging | has shrugged |
/sip | is sipping tea at you | sipping tea | has sipped tea |
/sleep | is sleeping near you | sleeping | has slept |
/smile | is smiling at you | smiling | has smiled |
/smug | is smug around you | smug | has been smug |
/spin | is spinning with you | spinning | has spun |
/tableflip | is flipping a table for you | flipping a table | has flipped a table |
/teehee | is giggling at you | giggling | has giggled |
/think | is thinking about you | thinking | has thought |
/thumbsup | is giving you a thumbs up | giving a thumbs up | has given a thumbs up |
/wag | is wagging their tail at you | wagging their tail | has wagged their tail |
/wink | is winking at you | winking | has winked |
/yawn | is yawning near you | yawning | has yawned |
/run | is running with you | running away | has run |
/salute | is saluting you | saluting | has saluted |
/stare | is staring at you | staring | has stared |
/baka | is calling you baka | calling baka | has been called baka |