When Classifications Conflict

Promotional classification and spam scoring are two different things. The promotional classifier asks: "Is this bulk marketing mail from a legitimate sender?" The spam scorer asks: "Does this message exhibit characteristics of unwanted mail — suspicious URLs, excessive caps, manipulative language, hidden text, dangerous attachments?"

Most of the time these two systems agree. A newsletter from a SaaS vendor passes auth, has a List-Unsubscribe header, and uses normal language — it's classified as [PROMOTION] and the spam score is low. A phishing email fails auth, has no List-Unsubscribe, and is full of urgency language — it's tagged as [SPAM] and never gets considered for promotional classification.

But sometimes they disagree. A retailer might be sending a perfectly legitimate flash-sale email from a properly-configured marketing platform that passes every authentication check and includes proper unsubscribe headers — and yet the email itself is screaming, all-caps, three exclamation points, suspicious tracking URLs, and the word "FREE" repeated six times. The promotional classifier says "yes, this is a marketing email." The spam scorer says "this looks like spam."

The Old Behavior: Promotional Wins

Through v1.9.0 and v2.6.0, the promotional classification took priority. If a message was classified as promotional, the spam score was effectively ignored — the message was tagged [PROMOTION] and forwarded with X-Spam-Classification: promotional.

This worked well for genuinely benign marketing mail. But it created a gap for the aggressive-but-technically-compliant variety. Users would find their [PROMOTION] folder cluttered with mail that they would have rather seen tagged as spam — particularly affiliate marketing, dropshipping promos, and grey-area newsletters from companies they didn't quite remember signing up for.

The New Behavior: Double-Tag

v1.9.1 and v2.6.1 introduce configurable double-tagging. When a message is classified as promotional and its spam score exceeds a configurable threshold, it is tagged with both: [SPAM][PROMOTION]. The X-Spam-Classification header value is set to spam-promotional.

This gives users routing flexibility. You can:

  • Match on subject containing [SPAM] → route both spam and double-tagged mail to the same spam folder.
  • Match on subject containing [PROMOTION] → route both promotional and double-tagged mail to your promo folder.
  • Match on X-Spam-Classification: spam-promotional specifically → route the aggressive marketing into a separate "Junk Marketing" folder distinct from both regular spam and regular promotions.

The third option is the most useful for high-volume inboxes. Aggressive marketing mail tends to come from senders you do business with (which is why it passes auth), so you don't want to delete it outright — but you don't want it cluttering your normal promo folder either. A separate folder you scan once a week is the right home for it.

Configuration

Two settings control double-tagging, both in the classification.promotional section:

classification:
  promotional:
    spam_tag: true        # enable double-tagging
    spam_threshold: 0.6   # only double-tag above this score

spam_tag (default true) — set to false to restore the old behavior of promotional classification always winning. This might be appropriate if you have very strict promotional rules and trust the classifier completely.

spam_threshold (default 0.6, or whatever your global spam_threshold is) — the score above which a promotional message gets the additional [SPAM] tag. You can set this higher than your global spam threshold to be more conservative about double-tagging. For example, with a global spam_threshold: 0.5 and a promotional.spam_threshold: 0.8, a message has to be both promotional and clearly egregious to get double-tagged.

Why might you want a higher threshold for promotional than for general spam? Because authentication-passing bulk mail is, on average, less risky than spam. Even a pushy marketing email from a real company is rarely actually malicious — it's just annoying. Raising the threshold reduces the chance of double-tagging mail that you'd actually want to keep in the promotional folder.

For most users, the defaults work well. Start with spam_tag: true and spam_threshold: 0.6. After two weeks, look at your X-Spam-Classification: spam-promotional mail and see if the classification matches your expectations.

If you find legitimate promotional mail being double-tagged, raise spam_threshold to 0.7 or 0.8. If you find aggressive marketing landing in your [PROMOTION] folder when it should be in spam, lower it to 0.5.

If you want to disable double-tagging entirely (so promotional always wins), set spam_tag: false. Some users prefer this because it keeps the classification logic simple and predictable — every message has exactly one classification, never two.

The full set of values for X-Spam-Classification as of v1.9.1 / v2.6.1:

  • ham — normal mail, below spam threshold, no special classification
  • social — social platform notification
  • promotional — marketing mail, below spam threshold
  • spam-promotional — marketing mail that also exceeds spam threshold (double-tagged)
  • spam — high-scoring mail not classified as social or promotional

Build your mail rules to match on this header where possible — it's more reliable than parsing subject-line tags, which can be inadvertently stripped or modified by intermediate forwarding rules.