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
Grapheme-Aware Emoji Counting

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.

Setup time: under a minuteDifficulty: Easy. Most users get through it first try.
How this rule works
Checks:The message's text content only — custom Discord emoji tokens plus Unicode emoji graphemes.
Triggers when:Total emoji count is strictly greater than max_emojis (so max_emojis=10 fires at 11+).
Ignores:Exempt roles and exempt channels. Allowlist words do not apply to this trigger.
Counts toward spam buffers:No — evaluated per-message, not across a sliding window.

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.

Example Match
H
hypeposterToday at 20:14
PARTY TIME 🔥🔥🔥 🎉🎉 🇺🇸 🇬🇧 👨‍👩‍👧‍👦 <:arkanis:1234567890> <a:sparkle:9876543210> 🔥 🎉 🎊
Count: 2 custom + 10 unicode graphemes (5×🔥, 3×🎉, 1×🎊, 1×🇺🇸, 1×🇬🇧, 1×👨‍👩‍👧‍👦) = 12 emoji.
AutoMod: matched — 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, or xD — 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

FieldTypeDefaultWhat it means
max_emojisint10Maximum 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

1

Set the rule to Log Only

Log Only records matches without taking any action. It is the right starting point for every AutoMod rule.

2

Lower the threshold for the test

Temporarily set max_emojis to 5 so you can trigger the rule with a short message.

3

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".

4

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️⃣).

5

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.)

6

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 by U+FE0F and U+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=10 means 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_spam is 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.

💡
Tip
See: AutoMod Actions → for the canonical reference on what delete, warn, mute, strike, and ban actually do, plus every action_config field and required Discord permission.