🎉 Launch offer: the next 5 servers get 30 days free. Claim a spot →
All topics & search

Guide/Community features/Embeds A–Z: building, variables, mentions, buttons

Discord Embed Builder: Custom Embeds & Buttons

How every card-style message is built: parts and limits, the builder and the dashboard editor, variables, pings, images, buttons, conditions, branding.

Ask the guide

Step by step

An embed is the card-style message Discord shows with a coloured left border. Sweet uses the same embed system everywhere: welcome, goodbye and boost messages, rules and verification panels, level-up and giveaway announcements, autoresponders, and anything you post manually. Build one once, attach it to as many events as you like.

1. The parts of an embed

PartWhere it showsLimit
Text messagePlain text above the card. The only place a mention actually pings.2,000 chars
ColourThe left border. Hex like #b388ff. Empty = your branding colour.—
AuthorSmall line at the very top with an optional round icon and link.256 chars
TitleBold heading. Optional "title link" makes it clickable.256 chars
DescriptionMain body. Markdown works: **bold**, *italic*, `code`, [links](https://…), > quotes, line breaks.4,096 chars
FieldsUp to 25 small titled blocks. "Inline" puts up to three side by side; non-inline takes the full width.256 / 1,024 chars each
ThumbnailSmall square image top-right. Great for {user.avatar}.https URL
ImageLarge image or GIF under the text. Great for banners or {server.icon}.https URL
FooterSmall grey text at the bottom, optional icon, optional timestamp.2,048 chars
ButtonsUp to 25 buttons (5 per row): link buttons or action buttons.80-char labels
Whole embed: at most 6,000 characters across title, description, fields, footer and author. The dashboard editor and the builder both refuse to save beyond Discord's limits and tell you which part is too long.

2. Three ways to build one

  • Dashboard (easiest). Community → Greetings for welcome/goodbye/boost, with a live preview, colour picker, presets and a "Save & send test" button. Every change is saved as a normal embed you can reuse.
  • Builder in Discord. !embed create member.join welcome opens an interactive builder with buttons for each part (title, description, images, fields, footer, colour, buttons). Save when done; !embed edit welcome reopens it.
  • Templates. !embed templates lists ready-made designs; !embed template welcome-basic welcome creates one you can then edit. Built in: welcome-basic, goodbye-basic, boost-thanks, rules-standard, verification-basic.
!embed create member.boost boost
!embed edit boost
!embed preview boost
!embed list
!embed send rules #rules
!embed delete old-welcome

Names are per server, 2–64 characters (letters, numbers, spaces, _, -). Quote a name with spaces when using the prefix: !embed edit "vip welcome".

3. Attaching an embed to an event

Creating an embed does not send it anywhere. It has to be bound to an event, or posted manually.

GoalHow
Welcome / goodbye / boostDashboard → Greetings, or !greeting set join embed:welcome. The greeting owns the channel, the optional text line, DM and delete-after settings.
Post once (rules, info, FAQ)!embed send <name> #channel — posts it right now. Edit later and send again.
Verification panel!embed template verification-basic verify role:@Member then !embed send verify #verify. The Verify button hands out the role.
Level up, giveaways, counters…Create the embed with that event (!embed create level.up levelup), enable it (!embed enable levelup) and set a channel in the builder. It posts every time the event fires.
Autoresponder replyIn the autoresponder action list pick "send embed" and the embed name.

Events you can bind: member.join, member.leave, member.boost, rules, verification, level.up, giveaway.start, giveaway.end, counter.updated, custom.

4. Variables (placeholders)

Write a variable anywhere in text, title, description, fields, footer or image URLs. It is replaced when the message is sent. On the dashboard, click a chip to insert one; the preview shows sample values.

VariableGives you
{user.mention}Clickable @mention of the member. Pings only in the text message, never inside the embed.
{user} / {user.name}Display name as plain text (no @, no ping).
{user.username}Account username.
{user.tag}Username with discriminator when one exists.
{user.id}Discord id.
{user.avatar}Avatar image URL — use in thumbnail, image or author icon.
{user.created}Account creation date (Discord timestamp, shows in the reader's timezone).
{user.createdRelative}"2 years ago" style account age.
{member.joined} / {member.joinedRelative}When they joined this server.
{member.roles}Their roles.
{member.topRole}Highest role.
{member.nickname}Server nickname.
{member.isBooster} / {member.boostingSince}Boost status and since when.
{server.name}Server name.
{server.icon}Server icon URL.
{server.memberCount}Members right now — "You are member #{server.memberCount}".
{server.boostCount} / {server.boostLevel}Boosts and boost tier.
{server.owner}Owner mention.
{server.created}Server creation date.
{server.roleCount} / {server.channelCount}Counts.
{channel.name} / {channel.mention}Channel the event happened in.
{event.*}Event data, e.g. {event.level} on level.up, {event.prize} on giveaway.end, {event.winnerMentions} after the draw.
{counter.members}Live counters, also {counter.members:online}, {counter.boosters}, {counter.clock:Europe/Madrid}.

Modifiers wrap a value: {upper:{user.name}}, {lower:…}, {length:…}, {default:{member.nickname}|no nickname}, {random:1-100}, {choose:hi|hello|hey}, {math:{server.memberCount}+1}, {number:1234567} (thousands separators).

5. Mentions and pings: the rules

  • A mention inside the embed (title, description, field, footer) shows as a clickable @Name but never sends a notification. That is Discord, not the bot.
  • Put {user.mention} in the text message above the embed when the member should be pinged. Dashboard: the "Text message" box. Discord: !greeting set join message:"Welcome {user.mention}!".
  • Only the member the event is about can be pinged. @everyone, @here and role mentions are neutralised in greetings so a template can never mass-ping.
  • Use {user} or {user.name} when you want the name as plain text.
  • Channel links: {channel.mention}, or type <#channelId> for a fixed channel such as rules.

6. Images and GIFs

  • URLs must start with https:// and point straight at an image (.png .jpg .gif .webp). A page that contains an image will not render.
  • Upload the picture to Discord, right-click → Copy link, and paste that. Tenor/Giphy GIFs need the direct media link.
  • {user.avatar} and {server.icon} work in thumbnail, image, author icon and footer icon.
  • Thumbnail is small and square; Image is the wide one under the text. Use one banner image for a clean look.

7. Buttons

KindWhat it doesNotes
LinkOpens a URL (rules page, website, invite, support server).Grey with an arrow. No login needed.
ActionRuns actions when clicked: give/remove a role, send a message or DM, add coins, open a ticket…Styles: primary, secondary, success, danger. Optional emoji.

Action buttons carry an action list edited in the builder (Buttons → add → pick actions). The Verify template is an action button that grants a role. Buttons are dropped when a greeting is sent as a DM, because actions need the server context.

8. Conditions (show only when…)

Each embed can have conditions; if they fail the embed is skipped for that event. Available: hasRole, notRole, isBooster, newMember, accountAge, channel, permission, time, chance, textEquals, argCount, plus any / not to combine. Example: two welcome embeds bound to member.join, one with accountAge < 7 days that adds a "new account" warning field for staff.

9. Branding (server-wide defaults)

!branding color #b388ff
!branding footer "Sweet • getsweetbot.com"
!branding footericon https://…/icon.png
!branding name "Sweet"
!branding status · !branding reset

Branding fills in the colour and footer of every embed that leaves them empty, including the bot's own replies. An embed's own colour or footer always wins.

10. Greeting-specific options

OptionMeaning
channelWhere the message is posted. The bot needs View, Send Messages and Embed Links there.
messageOptional text line above the embed. "none" clears it.
embedName of the embed to attach. "none" detaches it.
dmAlso send a private copy (join and boost only). Text + embed, no buttons.
delete_afterSeconds until the channel message is removed. 0 keeps it.
enabledNothing is sent while disabled. Enabling requires a channel (or DM) and a message or an embed.
!greeting setup join #welcome
!greeting set join embed:welcome message:"Welcome {user.mention}!" dm:true delete_after:0
!greeting preview join
!greeting test join
!greeting disable leave · !greeting status

Named arguments (option:value) work on every prefix command; quote values with spaces. Positional order for greeting set is channel, message, embed, dm, delete_after.

11. Copy, backup and reuse

!embed export welcome            → JSON you can save
!embed import welcome-v2 {…json…}   → recreate it (here or in another server)
!embed enable welcome · !embed disable welcome

Export includes every part, buttons and conditions (12 KB max). Import validates the JSON and rejects unsafe URLs or actions your plan does not allow.

12. Troubleshooting

  • Only text arrives, no card. The greeting has no embed attached. !greeting status shows "no embed"; attach one with embed:<name> or on the dashboard.
  • Nothing arrives. Greeting disabled, wrong channel, or the bot lacks Embed Links there. !greeting test join reports which.
  • Name instead of a mention. You used {user} or {user.name}; use {user.mention}. If you want a ping, it must be in the text message, not the embed.
  • Image does not show. Not a direct https image link, or the host blocks Discord. Upload to Discord and copy the link.
  • Variable printed literally. Typo in the name, or that variable has no value for this event (for example {event.level} outside level.up). {default:{…}|fallback} hides empties.
  • Two welcome messages. A greeting and a separate enabled embed are both bound to member.join. Keep one: disable the embed (!embed disable name) or attach it to the greeting instead.
  • Buttons missing in DMs. By design; actions need the server.

Good to know

  • Link buttons (label, URL, emoji) are edited on the dashboard; action buttons and conditions made with /embed edit are kept untouched.
  • Fields are built with name/value/inline rows on the dashboard (reorder, remove, up to 25); "Edit as JSON" is still there for pasting.
  • Image URLs must be direct https links to the file.
  • Whole embed at most 6,000 characters across all parts.

Still stuck? Ask in the support server.

Discord Embed Builder: Custom Embeds & Buttons · Sweet