Discord Welcome Message Templates: 6 Copy-Paste Embeds
Six Discord welcome message templates as complete webhook JSON: classic embed, minimal, gaming, business, rules checklist and Components V2. Copy, tweak, send.
On this page
- How to send any template below
- Template 1: Classic welcome embed
- Template 2: Minimal
- Template 3: Gaming community
- Template 4: Business or support server
- Template 5: Welcome with a rules checklist
- Template 6: Components V2 container with a link button
- Personalising a template
- Colour
- Thumbnail and banner
- Timestamp
- Placeholders and mentions
- Name and avatar
- Loading a template in the builder
- Common errors
- FAQ
- Can a webhook send a welcome message automatically when someone joins?
- Can I mention the new member in the welcome embed?
- Should I use a classic embed or Components V2 for a welcome message?
- Does the welcome embed count towards the 2000-character content limit?
- Next steps
A welcome message is the first thing a new member reads. Servers post it in one of two ways: once, through a webhook into #welcome, and pin it; or every time someone joins, from a bot or an automation. The payload is the same JSON either way, and that is what you get below: six Discord welcome message templates you can POST to a webhook URL as they are, plus the handful of settings worth changing to make them yours.
Each template is a complete request body, not a fragment. Replace the placeholders (server name, image URLs, channel IDs), send it with curl or import it into the builder, and you have a welcome embed in a minute.
How to send any template below
Save the JSON as welcome.json and post it:
curl -H "Content-Type: application/json" \
-d @welcome.json \
"https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN"
A 204 No Content response means the message landed. Three things to know before you paste:
- Channel mentions like
<#111111111111111111>render as clickable links with no extra setup (copy the ID from the channel’s context menu with Developer Mode on). Whether users, roles or@everyoneactually get pinged is controlled byallowed_mentions, see the mentions guide. - Placeholders such as
{member}are not filled in by Discord. A webhook is a plain HTTP endpoint; your bot or script substitutes real values before sending. - Images need public HTTPS URLs or
attachment://file.pngwith a file uploaded in the same request. A private Google Drive link will not render.
Template 1: Classic welcome embed
How it looks: a blurple stripe on the left, the server icon as a small thumbnail top-right, a bold title, a one-line description, three inline fields pointing at rules, roles and introductions, and a footer with the member number next to a timestamp.
{
"embeds": [
{
"title": "Welcome to Nightshift Studio 👋",
"description": "Glad you're here! Grab a role, say hi and make yourself at home.",
"color": 5793266,
"thumbnail": { "url": "https://example.com/server-icon.png" },
"fields": [
{ "name": "📜 Rules", "value": "<#111111111111111111>", "inline": true },
{ "name": "🎭 Roles", "value": "<#222222222222222222>", "inline": true },
{ "name": "💬 Introduce yourself", "value": "<#333333333333333333>", "inline": true }
],
"footer": { "text": "Member #1,248" },
"timestamp": "2026-09-17T12:00:00.000Z"
}
]
}
footer.text is the natural place for whatever your script knows at send time: the member count, the invite that was used, or nothing at all.
Template 2: Minimal
How it looks: one line of plain text with the newcomer’s mention, then a thin green card with a single sentence. It reads like a system notice and does not bury the conversation under a big embed.
{
"username": "Welcome",
"content": "👋 Welcome, {member}!",
"allowed_mentions": { "parse": ["users"] },
"embeds": [
{
"description": "Say hello in <#333333333333333333> and grab a role in <#222222222222222222>.",
"color": 3066993
}
]
}
Replace {member} with <@userId> from your join handler. The mention lives in content on purpose: a mention inside an embed renders as a link but notifies nobody, while allowed_mentions.parse: ["users"] lets the one in content ping the newcomer.
Template 3: Gaming community
How it looks: purple accent, a custom name and avatar on the message, a banner image at the bottom, two inline fields for platform roles and LFG, and a full-width “next event” field with a live Discord timestamp that shows in every member’s local time.
{
"username": "Raid Lobby",
"avatar_url": "https://example.com/raid-lobby.png",
"embeds": [
{
"title": "GG, welcome to Raid Lobby 🎮",
"description": "We run co-op nights, ranked scrims and the occasional speedrun race.\n\nPick your platform role first, otherwise you won't see the LFG channels.",
"color": 10181046,
"fields": [
{ "name": "🕹️ Pick a platform", "value": "<#444444444444444444>", "inline": true },
{ "name": "🔍 Find a squad", "value": "<#555555555555555555>", "inline": true },
{ "name": "📅 Next event", "value": "<t:1789844400:F> (<t:1789844400:R>)", "inline": false }
],
"image": { "url": "https://example.com/welcome-banner.png" },
"footer": { "text": "Keep it friendly. Rage in voice, not in text." }
}
]
}
<t:1789844400:F> renders a full date and <t:1789844400:R> renders “in 2 days”. Generate the Unix timestamp from your event calendar and the field never goes stale.
Template 4: Business or support server
How it looks: a muted blue accent, the company logo as the thumbnail, no emoji in the title, two inline fields (ticket channel and a masked link to the status page), a full-width support-hours field and a footer with the response target.
{
"embeds": [
{
"title": "Welcome to Acme Cloud Support",
"description": "This server is the fastest way to reach our engineers. Before you post, check the pinned FAQ. For billing questions open a ticket instead of sharing account details in public channels.",
"color": 3447003,
"thumbnail": { "url": "https://example.com/acme-logo.png" },
"fields": [
{ "name": "Open a ticket", "value": "<#666666666666666666>", "inline": true },
{
"name": "Status page",
"value": "[status.acme.example](https://status.acme.example)",
"inline": true
},
{
"name": "Support hours",
"value": "Mon–Fri, 09:00–18:00 CET\nOutages: 24/7",
"inline": false
}
],
"footer": { "text": "Acme Cloud · Response target: 1 business day" },
"timestamp": "2026-09-17T09:00:00.000Z"
}
]
}
Masked links [text](https://…) work inside embed fields, so the status page shows as one clean word instead of a raw URL.
Template 5: Welcome with a rules checklist
How it looks: gold accent, a checkbox list at the top of the description, then a four-line short version of the rules, a “Need help?” field and a footer that states the implicit agreement. The full rules belong in their own message; see the server rules embed template.
{
"allowed_mentions": { "parse": [] },
"embeds": [
{
"title": "Welcome! Three things before you start ✅",
"description": "☑️ **Read the rules** in <#111111111111111111>\n☑️ **Pick your roles** in <#222222222222222222>\n☑️ **Introduce yourself** in <#333333333333333333>\n\nThe short version of our rules:\n1. Be respectful. No harassment, no slurs.\n2. No spam, no unsolicited DMs, no self-promo outside <#777777777777777777>.\n3. Keep content in the right channel and use spoiler tags.\n4. Mods have the final say. Appeal in a ticket, not in public.",
"color": 15844367,
"fields": [
{
"name": "Need help?",
"value": "Mention <@&888888888888888888> in any channel.",
"inline": false
}
],
"footer": { "text": "By staying in the server you agree to the rules above." }
}
]
}
allowed_mentions.parse: [] guarantees that nothing in this message pings anyone, whatever ends up in the text, which is what you want for a message sent hundreds of times.
Template 6: Components V2 container with a link button
How it looks: a single rounded card with an accent stripe, a heading and intro text, a thin separator, a numbered checklist and a button at the bottom that opens a link. There is no title/field grid; layout comes from the components. This is the Components V2 format, so flags must be 32768 and content/embeds must stay empty.
{
"flags": 32768,
"components": [
{
"type": 17,
"accent_color": 5793266,
"components": [
{
"type": 10,
"content": "## Welcome to Nightshift Studio 👋\nYou're member **#1,248**. Two minutes of setup and you're in."
},
{ "type": 14 },
{
"type": 10,
"content": "**1.** Read the rules\n**2.** Pick roles in <#222222222222222222>\n**3.** Say hi in <#333333333333333333>"
},
{
"type": 1,
"components": [
{ "type": 2, "style": 5, "label": "Read the rules", "url": "https://example.com/rules" }
]
}
]
}
]
}
Send it with ?with_components=true on the URL, otherwise Discord ignores the components field:
curl -H "Content-Type: application/json" \
-d @welcome-v2.json \
"https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN?with_components=true"
Link buttons (style: 5) are the only buttons a plain webhook can send; add more of them to the same action row if you need a “Community guide” next to “Read the rules”. A “Get roles” button that actually assigns a role is interactive and needs a bot; the interactive buttons guide explains how that works through the site’s bot integration.
Personalising a template
Colour
color is a decimal integer, not a hex string. 5793266 is Discord blurple #5865F2; convert any hex with parseInt("5865F2", 16) in JavaScript or int("5865F2", 16) in Python. In the Components V2 template the same value goes into accent_color on the container. The embed colours guide has a ready palette.
Thumbnail and banner
thumbnail.url is the small image top-right, image.url the large one below the fields. Both need public HTTPS URLs. If the banner lives on your disk, upload it as files[0] in a multipart request and reference it as attachment://banner.png, see sending files. The new member’s avatar makes a good thumbnail: pass its URL from the join event.
Timestamp
timestamp is ISO 8601 (2026-09-17T12:00:00.000Z) and Discord renders it next to the footer in the viewer’s local time zone. Generate it at send time: new Date().toISOString() in JavaScript, datetime.now(timezone.utc).isoformat() in Python. For dates inside the text use <t:UNIX:R> instead; it stays relative (“3 minutes ago”) without re-sending.
Placeholders and mentions
Substitute placeholders in code, then send. A minimal discord.js handler that fires Template 2 on every join (enable the Server Members intent for your bot in the Developer Portal):
import { readFileSync } from 'node:fs';
import { Client, GatewayIntentBits } from 'discord.js';
const template = readFileSync('./welcome.json', 'utf8');
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
});
client.on('guildMemberAdd', async (member) => {
const body = JSON.parse(template.replaceAll('{member}', `<@${member.id}>`));
body.embeds[0].thumbnail = { url: member.displayAvatarURL({ size: 256 }) };
await fetch(process.env.WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
});
client.login(process.env.DISCORD_TOKEN);
Without a bot, the same JSON can be sent from an automation platform on whatever trigger it offers, see Zapier, Make and n8n.
Name and avatar
username and avatar_url override the webhook’s defaults per message (max 80 characters, must not contain “discord” or “clyde”). Use them so the welcome comes from a “Welcome” persona instead of “Deploy Bot”. Details in webhook username and avatar.
Loading a template in the builder
If you would rather see it before you send it:
- Open the Discord Webhook builder and choose JSON import.
- Paste one of the templates above. The preview renders the embed the way Discord will, including colour, thumbnail and timestamp.
- Edit the text, swap the image URLs, change the colour with the picker. For the Components V2 template the builder shows the container, separator and button as editable blocks.
- Paste your webhook URL and send, or export the result as JSON, discord.js or discord.py code for your join handler.
The builder also ships with its own templates if you only want a starting point to tweak.
Common errors
- 400 with
embeds.0.color: you sent"#5865F2"or"5865F2".colormust be a decimal integer. - 400 with
embeds.0.descriptionexceeds limit: the description is capped at 4096 characters and all embeds together at 6000. Move long rules into a second message. - Components V2 template returns 400 or arrives without the button: check all three:
flags: 32768,?with_components=trueon the URL, and nocontent/embedsin the body. - Thumbnail or banner is blank: the URL is not a direct, public image link. Open it in a private browser window; if it does not show the raw image, Discord cannot fetch it either.
- Mention renders but nobody gets pinged: the mention sits inside an embed, or
allowed_mentionsdoes not allow it (for exampleparse: []). Put<@userId>incontentand allow it withallowed_mentions. - 404
{"message":"Unknown Webhook","code":10015}: the URL is wrong or the webhook was deleted. Create a new one in Server Settings → Integrations → Webhooks. - 429 Too Many Requests during a join wave: read
retry_afterfrom the body and wait; see rate limits.
FAQ
Can a webhook send a welcome message automatically when someone joins?
Not by itself. A webhook has no events; it only receives POST requests. Something has to detect the join, a bot listening for the member-join event or an automation platform, and send the template through the webhook. For a static welcome post you send once and pin, the webhook alone is enough.
Can I mention the new member in the welcome embed?
<@userId> renders as a clickable mention inside an embed, but embed mentions never notify. To ping the newcomer put the mention in content and allow it with "allowed_mentions": { "parse": ["users"] } or { "users": ["userId"] }. Role and channel mentions use <@&roleId> and <#channelId>.
Should I use a classic embed or Components V2 for a welcome message?
Use an embed when you want the familiar title/fields/thumbnail layout and maximum compatibility with existing tooling. Use Components V2 when you want link buttons, separators or a media gallery in the same card. Both are sent by any webhook without a bot.
Does the welcome embed count towards the 2000-character content limit?
No. content has its own 2000-character limit; embeds are limited separately (4096 for a description, 6000 across all embeds in one message).
Next steps
Pick the template closest to your server, change the colour and the channel IDs, and send it. To preview the result and export it as code, open the free Discord Webhook builder. For a field-by-field walkthrough read the embed builder guide, for the container format the Components V2 guide, and when you are ready for buttons that assign roles, the interactive buttons guide.