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
| Part | Where it shows | Limit |
|---|---|---|
Text message | Plain text above the card. The only place a mention actually pings. | 2,000 chars |
Colour | The left border. Hex like #b388ff. Empty = your branding colour. | — |
Author | Small line at the very top with an optional round icon and link. | 256 chars |
Title | Bold heading. Optional "title link" makes it clickable. | 256 chars |
Description | Main body. Markdown works: **bold**, *italic*, `code`, [links](https://…), > quotes, line breaks. | 4,096 chars |
Fields | Up to 25 small titled blocks. "Inline" puts up to three side by side; non-inline takes the full width. | 256 / 1,024 chars each |
Thumbnail | Small square image top-right. Great for {user.avatar}. | https URL |
Image | Large image or GIF under the text. Great for banners or {server.icon}. | https URL |
Footer | Small grey text at the bottom, optional icon, optional timestamp. | 2,048 chars |
Buttons | Up to 25 buttons (5 per row): link buttons or action buttons. | 80-char labels |
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 welcomeopens an interactive builder with buttons for each part (title, description, images, fields, footer, colour, buttons). Save when done;!embed edit welcomereopens it. - Templates.
!embed templateslists ready-made designs;!embed template welcome-basic welcomecreates 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-welcomeNames 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.
| Goal | How |
|---|---|
Welcome / goodbye / boost | Dashboard → 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 reply | In 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.
| Variable | Gives 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,@hereand 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
| Kind | What it does | Notes |
|---|---|---|
Link | Opens a URL (rules page, website, invite, support server). | Grey with an arrow. No login needed. |
Action | Runs 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 resetBranding 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
| Option | Meaning |
|---|---|
channel | Where the message is posted. The bot needs View, Send Messages and Embed Links there. |
message | Optional text line above the embed. "none" clears it. |
embed | Name of the embed to attach. "none" detaches it. |
dm | Also send a private copy (join and boost only). Text + embed, no buttons. |
delete_after | Seconds until the channel message is removed. 0 keeps it. |
enabled | Nothing 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 statusNamed 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 welcomeExport 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 statusshows "no embed"; attach one withembed:<name>or on the dashboard. - Nothing arrives. Greeting disabled, wrong channel, or the bot lacks Embed Links there.
!greeting test joinreports 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.