Using placeholders
Dynamic placeholders and parsers for messages
Use placeholders to render live values inside embeds, buttons, panel messages, and automated replies. The catalog below is organized by scope so you can quickly see what is always available and what only appears in a specific context.
Quick reference
The most common placeholders are member.*, guild.*, panel.*, and ticket.*. If a placeholder is blank, first confirm the message context actually provides that data.
Featured placeholders
| Placeholder | Purpose |
|---|---|
member.mention | Ping the current member |
member.displayName | Use the member nickname or display name |
member.username | Use the member username |
guild.name | Show the server name |
ticket.creator.mention | Ping the ticket creator |
ticket.number | Show the ticket number |
ticket.closeReason | Show the close reason |
panel.name | Show the panel name |
Base placeholders
These are available in most message contexts.
| Placeholder | Description |
|---|---|
currentTime | Current timestamp in Unix format |
member.id | Member ID |
member.mention | Mention for the current member |
member.displayName | Member display name or nickname |
member.username | Member username |
member.avatarUrl | Member avatar URL |
member.joinedAt | When the member joined, in Unix format |
member.createdAt | When the member account was created, in Unix format |
member.roles | List of member role IDs |
member.roles.0 | First role ID from the member role list |
guild.id | Server ID |
guild.name | Server name |
guild.memberCount | Total member count |
guild.createdAt | Server creation timestamp in Unix format |
All timestamps are provided in Unix format. Learn how to parse them.
Statistics placeholders
These placeholders resolve to numbers and fall back to 0 when the data is unavailable.
| Placeholder | Description |
|---|---|
statistics.tickets.averageRating | Average ticket rating |
statistics.tickets.created | Total tickets created |
statistics.tickets.closed | Total tickets closed |
statistics.tickets.open | Total tickets currently open |
statistics.tickets.claimed | Total tickets claimed |
statistics.tickets.expectedResponseTime | Expected first response time as a readable duration. Premium only, and resolves to Unknown when unavailable |
statistics.applications.total | Total applications submitted |
statistics.applications.pending | Total applications pending |
statistics.applications.accepted | Total applications accepted |
statistics.applications.denied | Total applications denied |
statistics.giveaways.total | Total giveaways created |
statistics.giveaways.totalParticipants | Total giveaway participants |
statistics.giveaways.averageParticipants | Average participants per giveaway |
statistics.verifications.total | Total verifications processed |
statistics.verifications.failed | Total failed verifications |
statistics.verifications.passed | Total passed verifications |
statistics.tickets.expectedResponseTime is the exception to the numeric rule above: it resolves to a formatted duration such as 5m, requires premium, and falls back to Unknown when there is not enough data.
Context-specific placeholders
The sections below contain placeholders that only exist in a specific message scope.
Ticket-related placeholders are merged with the base placeholders for ticket messages.
| Placeholder | Description |
|---|---|
ticket.number | Ticket numeric identifier |
ticket.creator.id | Ticket creator member ID |
ticket.creator.mention | Ping the ticket creator |
ticket.creator.displayName | Ticket creator display name |
ticket.creator.username | Ticket creator username |
ticket.creator.avatarUrl | Ticket creator avatar URL |
ticket.creator.joinedAt | When the ticket creator joined, in Unix format |
ticket.creator.createdAt | When the ticket creator account was created, in Unix format |
ticket.creator.roles | Ticket creator role IDs |
ticket.creator.roles.0 | First role ID from the ticket creator role list |
ticket.closeReason | Close reason |
ticket.openedAt | Ticket open timestamp in Unix format |
ticket.users | List of user IDs in the ticket |
ticket.users.0 | First user ID in the ticket user list |
ticket.channelName | Ticket channel name |
ticket.priority | Ticket priority value |
ticket.claimer.id | Ticket claimer member ID |
ticket.claimer.mention | Ping the ticket claimer |
ticket.claimer.username | Ticket claimer username |
ticket.claimer.avatarUrl | Ticket claimer avatar URL |
ticket.claimer.createdAt | When the ticket claimer account was created, in Unix format |
ticket.form | Ticket form entries |
ticket.form.0.question | First ticket form question |
ticket.form.0.answer | First ticket form answer. Image Upload questions render [Image] instead of a link |
ticket.form.0.required | Whether the first ticket form field was required |
ticket.createdAt | Ticket creation timestamp in Unix format |
ticket.closedAt | Ticket close timestamp in Unix format |
ticket.closer.id | Ticket closer member ID |
ticket.closer.mention | Ping the ticket closer |
ticket.closer.username | Ticket closer username |
ticket.closer.avatarUrl | Ticket closer avatar URL |
ticket.closer.createdAt | When the ticket closer account was created, in Unix format |
ticket.channelMention | Link to the ticket channel |
remainingTime | How long is left before an autoclose reminder closes the ticket |
waitingSince | How long the ticket has been waiting for a reply |
Use the ticket creator placeholders for welcome messages, the claimer and closer placeholders for assignment and closure flows, and ticket.form.* when rendering user-submitted answers.
The last three are tied to one message each. remainingTime belongs to the autoclose reminder. waitingSince and ticket.channelMention belong to the inactivity notification, which is posted outside the ticket and needs the link to send staff back to it.
Answers to Image Upload questions render as [Image] rather than a link. Uploaded
images are stored privately, and anything a placeholder renders into a message can be read
by everyone who can see that message. Use the View Uploads button on the ticket to view
them, or the Uploads API to fetch them from your own systems.
Application placeholders are available in application panel and application workflow messages.
| Placeholder | Description |
|---|---|
application.number | Application numeric identifier |
application.creator.id | Application creator member ID |
application.creator.mention | Ping the application creator |
application.creator.displayName | Application creator display name |
application.creator.username | Application creator username |
application.creator.avatarUrl | Application creator avatar URL |
application.creator.joinedAt | When the application creator joined, in Unix format |
application.creator.createdAt | When the application creator account was created, in Unix format |
application.creator.roles | Application creator role IDs |
application.creator.roles.0 | First role ID from the application creator role list |
application.reviewMessage | Link to the submission's review message, so a reviewer jumps straight to the accept and deny buttons |
These values are useful in submit, accept, deny, and finish messages.
application.reviewMessage is meant for the inactivity notification, which is posted away from the submission itself.
Panel placeholders are exposed on panel views and panel messages.
| Placeholder | Description |
|---|---|
panel.name | Panel display name |
panel.supportRoles | Role IDs that can support this ticket panel |
panel.supportRoles.0 | First support role ID |
panel.openTickets | Number of currently open tickets for this panel |
panel.reviewRole | Application review role ID |
panel.pendingApplications | Number of pending applications |
panel.openApplications | Number of open applications on this application panel |
panel.statistics.open | Open tickets on a ticket panel, or open applications on an application panel |
panel.emoji | Panel emoji |
Panel values are especially useful when you want the message to reflect the exact configuration the user is interacting with. Ticket panels resolve panel.supportRoles and panel.openTickets, application panels resolve panel.reviewRole, panel.pendingApplications and panel.openApplications, and panel.name, panel.emoji and panel.statistics.open resolve on both.
Support hours placeholders are available where support-hours are configured.
| Placeholder | Description |
|---|---|
supportHours.status | Current support status |
supportHours.nextOpen | Timestamp of the next open time in Unix format |
supportHours.closesAt | Timestamp of when support closes in Unix format |
Status board placeholders resolve in the board message on the Status Board page, and nowhere else.
| Placeholder | Description |
|---|---|
board.openTickets | Tickets open across the server right now |
board.unansweredTickets | Open tickets nobody has replied to yet |
board.unclaimedTickets | Open tickets nobody has claimed |
board.ticketsOpenedToday | Tickets opened today |
board.ticketsClosedToday | Tickets closed today |
board.ticketsOpenedLastHour | Tickets opened in the last hour |
board.avgResponseTime | Average time to a first reply, as a readable duration |
board.rating | Average ticket rating |
board.updated | When the board last refreshed |
Each panel you put on the board adds its own set, written as {board.panel.<panel>.openTickets} and the same for the other figures. The placeholder picker on the Status Board page lists them by panel name, so pick them from there rather than typing the panel part yourself.
The board message also accepts {emoji.<name>} for Tickety's own icons, listed in the picker under Emojis.
The board message is the one place where the base placeholders do not work. {member.mention}, {guild.name} and the statistics placeholders are left as written, because a board message is not sent to anyone in particular. Use the board.* set instead.
Welcome messages, welcome DMs and leave messages use the base placeholders, where member.* is the member who just joined or left. Welcome messages and welcome DMs also carry the milestone placeholders.
| Placeholder | Description |
|---|---|
milestone.count | The member count this join reached |
milestone.next | The next milestone the server is heading for |
milestone.remaining | How many members are still needed to reach it |
milestone.count only has a value on the join that lands exactly on a milestone, so a line built around it shows up for the celebration and disappears on every other join. milestone.next and milestone.remaining resolve on every join. See Member Milestones.
Leave messages do not resolve member.joinedAt, because the member has already left by the time the message goes out. Welcome messages and DMs do not resolve member.roles.
Request placeholders are available in the DM Tickety sends when a staff member runs /request ticket or /request application.
| Placeholder | Description |
|---|---|
request.reason | The reason the staff member typed, if they gave one |
request.staff.id | Requesting staff member ID |
request.staff.mention | Ping the requesting staff member |
request.staff.username | Requesting staff member username |
request.staff.displayName | Requesting staff member display name or nickname |
The DM is read by the member being asked, so member.* is that member and the staff member who sent the request is under request.staff.*. See Ticket Request Command and Application Request Command.
Support routing placeholders are available in the messages Tickety posts when its AI ticket features point a member somewhere better.
| Placeholder | Description |
|---|---|
supportRouting.targetChannelMention | Mention of the channel the member is being pointed to |
supportRouting.targetChannelId | ID of that channel |
supportRouting.canonicalUrl | Link to the message or ticket that already covers the question |
The two channel placeholders belong to the wrong channel message. supportRouting.canonicalUrl belongs to the duplicate question and duplicate ticket messages.
Rating placeholders are available in the Rating Embed posted to your rating log channel. See Ticket Ratings.
| Placeholder | Description |
|---|---|
rating.score | The score the member gave, from 1 to 5 |
rating.stars | The same score drawn as stars |
rating.feedback | The written feedback the member left |
The ticket close placeholders resolve here too, so a log entry can name the panel, the closer and the close reason alongside the score.
The dashboard placeholder picker does not offer the rating.* entries yet. Type them into the embed by hand and they work.
Roblox placeholders come from the Bloxlink integration. Connect Bloxlink under Server > Integrations and turn it on first, or every one of them resolves to nothing. See Integrations.
| Placeholder | Description |
|---|---|
roblox.bloxlink.id | Roblox account ID |
roblox.bloxlink.url | Link to the Roblox profile |
roblox.bloxlink.name | Roblox username |
roblox.bloxlink.displayName | Roblox display name |
roblox.bloxlink.about | Roblox profile about text |
roblox.bloxlink.createdAt | Roblox account creation timestamp in Unix format |
Once the integration is on, these resolve wherever member placeholders resolve.
A Roblox placeholder comes out empty when the integration is off, when no token is saved, or when the member has never linked a Roblox account through Bloxlink in your server. If Bloxlink cannot be reached at that moment, the placeholder renders the literal text {unavailable} instead, so that word appearing in one of your messages is not a typo on your side.
Resolution behavior
Use these rules when deciding which placeholders to include in a message:
- Base placeholders such as
member.*andguild.*are available in most message contexts. - Context-specific placeholders such as
ticket.*,panel.*, andsupportHours.*only resolve when that context exists. - Statistics placeholders resolve to a number and fall back to
0when data is unavailable. - If a context-specific placeholder is used where that context does not exist, it may resolve to an empty value or remain unresolved depending on the message type.
- The status board message is the one scope that carries no base placeholders. Only
board.*andemoji.*resolve there. - Roblox placeholders need the Bloxlink integration connected before they return anything.
When combining placeholders with parsers, place the placeholder inside the parser payload, for example: {timestamp(relative):{member.joinedAt}}.
Parser reference
Use these parser pages for formatting, logic, and text manipulation:
| Parser | Purpose |
|---|---|
| Date | Format timestamps using custom date and time patterns |
| Timestamp | Convert timestamps into readable formats |
| String Format | Change casing, escape text, and format ordinals |
| Replace | Replace characters or substrings |
| If | Return one of two values from a condition |
| Includes | Check whether text contains a value |
| Join | Join values into a single string |
| Slice | Extract part of a string by range |
| Truncate | Shorten text to a fixed length |
| Padding | Pad text to a target length |
| Number | Add thousands separators or shorten a number |
| Math | Run arithmetic expressions |
| Logical | Evaluate boolean-style expressions |
| Union | Return one of two messages when any of several conditions is true |
| Stop | Prevent further processing when a condition is met |
Practical examples
Ticket notification
Ticket #{ticket.number} opened by {member.displayName} at {date(MM/DD/YYYY HH24:MI):{currentTime}}.Support-hours status message
Support status: {upper:{supportHours.status}}
Next open: {timestamp(relative):{supportHours.nextOpen}}Conditional message output
{if({contains(1234567890):{member.roles}}):Welcome back, staff member.|Welcome!}Common mistakes
- Verify context before using context-specific placeholders.
- Keep parser syntax exact. Missing separators such as
:or|can cause unexpected output. - Confirm timestamp format expectations before parsing. Use
dateortimestampparsers when you need readable output. - If a value appears blank, test with a known base placeholder first, for example
{member.username}, to confirm the message context is correct.