Caps Spam

Flag messages that are mostly uppercase letters. A per-message shouting check that ignores emoji, digits, and punctuation.

Open AutoMod
Per-Message Uppercase Ratio

Caps Spam fires when too high a fraction of a message's alphabetic characters are uppercase. It is the classic "stop shouting" rule — one ratio, one length floor, and the message either trips or it doesn't.

What is this?

A rule that fires when too much of a message is uppercase letters. Defaults to 70% caps over 8 alphabetic characters. Digits, punctuation, spaces, and emoji don't count toward the ratio, so a message like GG!!! won't trip.

Why you might want it

If you're tired of one-line all-caps rants drowning out actual discussion, this is the cheapest fix. No word list to maintain, no false positives on legitimate short caps like acronyms. Most servers pair it with a delete action and a short cooldown so the offender doesn't just keep shouting.

Setup time: under a minuteDifficulty: Easy. Most users get through it first try.
How this rule works
Checks:The alphabetic characters in the message's text content — digits, punctuation, spaces, and emoji are skipped.
Triggers when:The alphabetic-character count is at least min_length and the uppercase share of those letters is strictly greater than max_percent.
Ignores:Exempt roles and exempt channels. Allowlist words do not apply — Caps Spam is a volumetric trigger.
Counts toward spam buffers:No — this trigger is per-message, not volumetric across messages.

Why use this rule?

  • Stops users who shout at the channel with sustained all-caps messages.
  • Catches low-effort attention-grabbers that disrupt a conversation without being overtly hostile.
  • Keeps announcements and help channels scannable — no screaming replies drowning out real questions.
  • Cheap insurance — one ratio threshold covers the entire server without needing a word list.

What it detects

A single message where the uppercase share of alphabetic characters is above your threshold, and the message has enough letters to evaluate fairly. The evaluator counts only c.isalpha() characters, computes (upper / alpha) * 100, and fires when that percentage is strictly greater than max_percent.

Example Match
S
shoutymcshoutfaceToday at 14:07
HEY EVERYONE CHECK THIS OUT NOW!!!
AutoMod: matched — matched_pattern = "100% caps". 26 alpha chars, all uppercase. Action: delete + warn.

What it does NOT detect

  • Messages with fewer alphabetic characters than min_length — short bursts like OK, LOL, or NO!!! are skipped by design.
  • Yelling via repetition (stop stop stop stop) — that is the job of Duplicate Message and Spam Detection.
  • Emphasis inside embeds, bold formatting, or sticker names — only the raw message text is scanned.
  • Non-cased scripts — Arabic, Hebrew, and CJK have no uppercase form, so they never contribute to the caps ratio.
  • A single uppercase word buried in an otherwise-lowercase paragraph. The ratio averages over the whole message; one shouted word in 100 normal ones won't trip the rule.

Configuration

FieldTypeDefaultWhat it means
min_lengthinteger10Minimum alphabetic-character count before the rule evaluates at all. Messages with fewer letters are skipped entirely.
max_percentinteger (0–100)70The rule fires when the uppercase share of alphabetic characters is strictly greater than this percentage.

Recommended starter settings

A balanced baseline for most community servers:

{
  "min_length": 12,
  "max_percent": 75
}

Keep min_length at 10 or above so brief emphatic replies aren't flagged. A max_percent between 70 and 80 is the sweet spot — lower catches more shouting, higher tolerates common acronyms. Run in Log Only mode for a week before flipping to Live.

Common false positives

  • Gamer-tag banter — GG WP EZ MODO is 100% caps and culturally neutral in many communities.
  • Stacked acronyms — AFAIK LOL IDK IMO TBH SMH can push the ratio over the threshold even in normal chat.
  • Celebrating a single long word — CONGRATULATIONS on its own is 15 alpha chars and 100% caps.
  • Emoji-heavy messages — 🔥🔥🔥🔥🔥 FIRE evaluates on FIRE only, and FIRE is 100% caps.
  • Code snippets pasted inline — ENUM_CONSTANTS, SQL keywords, or header filenames can skew a short message's ratio.
  • Brand names and product codes — NASA, NATO, or a model number inside a short sentence drags the caps percent up.
💡
Tip
Exempt your staff and announcement-author roles so loud headline posts don't trip the rule on their own.

How to test this rule safely

1

Set the rule to Log Only

Log Only records matches without deleting messages or issuing warnings. It is the right starting point for every AutoMod rule.

2

Start with the defaults

Leave min_length at 10 and max_percent at 70 so you can confirm the evaluator behaves as documented before tuning.

3

Post an obvious shout

In a private test channel, send THIS IS A LOUD TEST MESSAGE. Check the Event Log dashboard — you should see an entry with matched_pattern ≈ "100% caps".

4

Confirm a calm message does NOT fire

Post This is a normal message. No Event Log entry should appear — the caps ratio is well under 70%.

5

Confirm short shouts are skipped

Post NO! (only 2 alpha chars). No entry — the rule short-circuits below min_length.

6

Flip to Live

Restore your real thresholds and switch the rule from Log Only to Live.

Known current behavior

  • Current behavior: messages below min_length are always skipped. This is intentional — short emphatic replies like OK, LOL, or NO!!! would otherwise register as 100% caps and flood the Event Log.
  • Current behavior: only alphabetic characters count. Digits, punctuation, spaces, and emoji are excluded from both sides of the ratio. A message like 🔥🔥🔥🔥🔥 FIRE evaluates on the four letters of FIRE and trips easily because that substring is 100% caps.
  • Current behavior: acronyms and brand names drag the ratio upward. Words like NASA, NATO, or LOL inside an otherwise-normal sentence are a common false-positive source. Raising min_length or max_percent helps on servers where these are common.
  • Current behavior: unicode casing follows Python's str.isupper() rules. Greek and Cyrillic uppercase count correctly, as do accented Latin letters like ÁÉÍÓÚ. Scripts without case (Arabic, Hebrew, CJK) never contribute, and edge cases like German ß or Turkish dotless ı can behave unexpectedly for non-English servers.
  • Current behavior: the threshold uses a strict greater-than comparison. Setting max_percent = 70 means 71% fires; exactly 70% does not. The cosmetic matched_pattern rounds the percent for display, so a match may show 70% caps even though the real ratio was slightly higher.
  • Current behavior: allowlist words do not apply. Caps Spam is a volumetric trigger, so the rule's allowlist_words list is ignored for caps counting — a user can't neutralise a SHOUTING message by including an allowlisted word.

Action reference

Caps Spam is usually the opening of a light enforcement ladder — a delete with a friendly reason text, or a warn that contributes to the auto-strike threshold if the user keeps shouting. Reserve mute or strike for repeat offenders via Spam Detection or a Strike System rule.

💡
Tip
See: AutoMod Actions → for what each action does, its required Discord permissions, and every action_config field.