Two independent messages: one when someone joins, one when someone leaves. Each has its own channel and its own content, and either can be left unconfigured.
| License | Free — no premium needed |
| Tabs | Welcome · Goodbye |
| Needs | Send Messages and Embed Links in the target channels, plus the Server Members intent |
Optional
Where the greeting is posted. The channel must allow Cloudy to Send Messages. Leave it empty and no welcome message is posted at all, whatever the text says.
Up to 2000 characters
Posted when a member joins. Empty falls back to the built-in greeting in your server's language. Supports Markdown and these placeholders:
| Placeholder | Becomes |
|---|---|
{user} / {user.mention} | A mention — pings the new member |
{user.name} | Display name, no ping |
{username} | Discord username |
{user.tag} | Full tag |
{user.id} | Numeric user id |
{server} / {server.name} | Server name |
{server.memberCount} | Current member count |
Welcome {user} — you are member #{server.memberCount}!
Read #rules, then say hi in #general.
Above the editor is a switch between Plain text and Embed. Embed mode gives you the full embed builder with a live preview; switching to it seeds the embed from your plain text so you never start empty. In embed mode the bot mentions the new member above the embed, so they are still pinged.
Switching back to plain text keeps your text. Internally an empty embed is text mode — there is no third state.
Up to 10 roles handed to every new member on join. This runs independently of the welcome message — a server can hand out roles without posting anything, and it is not switched off by the plugin's master switch: as long as roles are listed, they are applied.
Cloudy needs Manage Roles, and each role must sit below Cloudy's own highest role. Roles managed by an integration (bots, boosters) can never be granted and are not offered in the picker. A role that fails these checks is skipped and the rest are still applied.
With Discord's rules screening on, a new member gets the auto roles only after accepting the rules — a role granted earlier would let them skip the screening.
Optional
Where the goodbye message is posted. Often a staff-only channel — a public "X has left" line every time someone quits gets old fast.
Up to 2000 characters
Same placeholders as the welcome text, with one important difference:
{user} renders as the plain username, not a mention. The member has already left the server,
so a mention would point at nobody and Discord would render a raw id.{user} left the server. We are now {server.memberCount} members.
Goodbye also supports embed mode, with its own independent design.
A card is a rendered image — avatar, name, an accent and an optional background — attached to the greeting. Join and leave each have their own, configured independently.
The card is orthogonal to the message mode: it attaches to plain text and to an embed alike. You are not choosing between a card and a message, you are adding a picture to whichever one you use.
| Setting | Effect |
|---|---|
| Enabled | Off keeps the design but stops attaching it |
| Title | The tracked uppercase label above the name, up to 24 characters. Empty = Welcome / Goodbye in your server language |
| Subtitle | The line under the name, up to 80 characters. Supports the same placeholders as the message; {user} is the plain name, since an image cannot mention anyone. Empty = You are member #n of … / Thanks for being part of … |
| Accent colour | Corner ticks and label on the welcome card. Empty = Cloudy violet. The goodbye card is deliberately drawn without an accent |
| Background image | An http(s) image URL, drawn desaturated and heavily dimmed inside the frame |
Leaving a card unconfigured is not the same as switching it off. An unconfigured card means the greeting behaves exactly as it did before; switching an existing one off keeps your title, subtitle and background so a toggle does not discard the setup.
If you need to tell kicks from voluntary leaves, enable the Mod actions category in Moderation logging.
Without it, Discord never tells the bot about joins and leaves. The hosted Cloudy bot has it enabled. If you run a custom bot, you must switch it on yourself — this plugin is the first thing that breaks when you forget.
Cloudy needs Send Messages and, for embeds, Embed Links in the target channel. A channel the bot cannot post in produces no message and no error anywhere visible.
Both messages are gated by the plugin's master switch. Configured but disabled posts nothing — auto roles are the one exception and keep running.