Emoji Spam
Catch messages stuffed with emoji walls — mixed Unicode, flags, ZWJ families, keycaps, and custom Discord emoji — counted the way Discord renders them.
Open AutoMod →Emoji Spam fires when a single message contains more than max_emojis emoji. Counting matches how Discord renders them — a family ZWJ emoji is one emoji, a flag is one emoji, a keycap digit is one emoji, and custom Discord emoji each count once.
What is this?
A rule that fires when a single message contains more than your emoji threshold (default 10). Custom Discord emoji and Unicode emoji both count, and the counter is grapheme-aware so a family-of-four ZWJ emoji counts as one, not four.
Why you might want it
For the react-spam-as-message users who paste twenty :partying_face:after every announcement, and the kids who treat the text box like a sticker board. Setting the threshold higher than your normal celebratory burst (10 is comfortable) keeps the rule quiet for real users and loud for emoji walls.
max_emojis (so max_emojis=10 fires at 11+).Why use this rule?
- Shuts down emoji-wall raids — posts with dozens of flags, fireworks, or custom stickers used to flood a channel.
- Reins in users who reply entirely in emoji, drowning real conversation under decorative noise.
- Complements Caps Spam and Mention Spam as a per-message noise filter, so one rude message is enough to catch.
- Works the same way Discord renders emoji, so your threshold corresponds to what moderators actually see in the client.
What it detects
Messages whose total emoji count exceeds max_emojis. The total is custom_emoji_count + unicode_emoji_count, where custom Discord emoji shortcodes (<:name:id> and animated <a:name:id>) are stripped first, and the remaining content is walked grapheme-by-grapheme and classified as emoji or not.
matched_pattern = "12 emojis" > max_emojis = 10. Action: delete.What it does NOT detect
- Reactions on a message — only the message content is scanned.
- Emoji inside embeds, attachment filenames, or sticker names.
- Text emoticons like
:),<3, orxD— those are plain ASCII, not emoji graphemes. - Volumetric emoji use across messages (posting 3 emoji per message in quick succession). This trigger is per-message.
Configuration
| Field | Type | Default | What it means |
|---|---|---|---|
| max_emojis | int | 10 | Maximum emoji allowed in a single message. Operator is strict >, so max_emojis=10 permits 10 and triggers at 11+. |
Recommended starter settings
A balanced baseline for most community servers:
{
"max_emojis": 10
}Start in Mode: Log Only and watch a week of Event Log entries. If your community posts a lot of custom emoji (gaming, k-pop, art servers), raise max_emojis to 15 or 20. For stricter text channels, drop to 6. Add emoji-celebration channels (birthdays, announcements, reactions-only rooms) to exempt_channels rather than raising the global threshold.
Common false positives
- Legitimate celebration messages — birthdays, event wins, release announcements often lead with
🎉🎉🎉 happy bday 🎉🎉🎉. - Custom-emoji-heavy servers (gaming, k-pop, art) where users reply with 10-20 stickers as a normal conversational style.
- Copy-pasted status messages or ASCII-art made from emoji graphemes.
- Flag-heavy posts — introducing yourself by listing languages you speak (🇺🇸 🇬🇧 🇫🇷 🇩🇪 🇯🇵 ...) adds up fast.
- Reaction-style replies typed inline when the user means to pile on —
👏👏👏👏👏👏👏👏👏👏👏👏.
How to test this rule safely
Set the rule to Log Only
Log Only records matches without taking any action. It is the right starting point for every AutoMod rule.
Lower the threshold for the test
Temporarily set max_emojis to 5 so you can trigger the rule with a short message.
Send a test message
In a private channel, post 🎉🎉🎉🎉🎉🎉 (6 emoji). Check the Event Log dashboard — you should see an entry with matched_pattern = "6 emojis".
Confirm grapheme-aware counting
Post a single family ZWJ emoji 👨👩👧👦 six times. It should still fire with matched_pattern = "6 emojis", not 24 — each ZWJ family counts as one emoji, exactly as Discord renders it. Repeat with flags (🇺🇸🇬🇧🇫🇷🇩🇪🇯🇵🇨🇦) and keycaps (1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣).
Confirm exempt channels and roles work
Add a role to Exempt Roles, post as that role — no Event Log entry. Add a channel to Exempt Channels, post there — no Event Log entry. (Allowlist words do not apply here, so do not rely on them.)
Raise the threshold and flip to Live
Set max_emojis back to your production value and switch the rule from Log Only to Live.
Known current behavior
- Current behavior: counting is grapheme-aware. The evaluator walks the message with a Unicode grapheme regex (
\X) and classifies each grapheme. Compound emoji like👨👩👧👦count as one emoji, not four — matching how Discord renders them. - Current behavior: flag emoji count as one. Flags are regional-indicator pairs (two code points), but a single flag is a single grapheme and counts once.
- Current behavior: keycap sequences count as one. Digits or
#followed byU+FE0FandU+20E3(e.g.1️⃣,#️⃣) are single emoji. - Current behavior: custom Discord emoji count as one each, and are stripped before the grapheme walk so there is no double-counting. Animated
<a:name:id>counts the same as static<:name:id>. - Current behavior: the operator is strict greater-than.
max_emojis=10means 10 is allowed and the rule fires at 11 or more. Tune with this in mind. - Current behavior: reactions are not counted. Only message content is scanned. A raid that reacts with dozens of emoji on a single message will not trigger this rule.
- Current behavior: exempt roles and exempt channels apply; the allowlist does not.
emoji_spamis a volumetric trigger and is excluded from the content-match allowlist short-circuit. Use exempt channels for emoji-celebration rooms instead. - Current behavior: there is a single combined threshold. Custom emoji and Unicode emoji are summed before comparison; you cannot set separate limits like "20 custom but only 5 Unicode".
Action reference
Pair this trigger with any of the five AutoMod actions. delete is the most common choice for an emoji flood; mute is the usual next step for repeat offenders.
delete, warn, mute, strike, and ban actually do, plus every action_config field and required Discord permission.