Multilevel marketing on Reddit is a measurable immune response, not a vibe.

Every top result for this query is a consumer-side take. r/antiMLM screenshots. BuzzFeed roast compilations. A Taylor & Francis stigma paper. None of them measure the physics of what Reddit actually does to MLM-shaped comments. I did. One automated commenter, 2,732 tracked replies, 11 months, one Postgres. The penalty curve is exact, the cutoffs are sharp, and the prompt rules that stay on the safe side are all in a single Python file.

M
Matthew Diakonov
12 min read
4.9from 2,732 measured Reddit comments
Product-name mentions: 1.17 avg upvotes (capped at 10)
No product name: 3.05 avg upvotes (topped at 639)
URL in comment: 1.38 avg. No URL: 3.02 avg
Sub-minute posting: 2.6 avg. 1-5 min gap: 7.0 avg

What the SERP actually covers, and what it leaves on the table

Search for this phrase today and the first page is a mirror of how normal Reddit users feel about MLMs. r/antiMLM as a subreddit. A stigma analysis from Taylor & Francis. BuzzFeed's "18 Times People in MLMs Had Absolutely No Shame." Salon, The Conversation, and a handful of newspaper op-eds calling it a legal pyramid. All true, all well-sourced, and all written from the perspective of someone who received a "Hey hun" message from a cousin.

What none of those pages answer: if you were building an automated tool to post commercial content on Reddit, how hard is it to accidentally cross into MLM-shaped behavior, and what does Reddit measurably do when you do? That question has an answer, and the answer is a number. Several numbers, actually.

S4L is my Reddit commenter. It has been running against a Neon Postgres for 11 months. It logs every reply it writes, the subreddit, the thread, the hour, the gap since the last post, and the upvote count at read-time. That dataset is the source for everything on this page. The product is the measurement.

0comments measured
0%avg-upvote penalty for a product name
0%penalty for a URL in the comment
0%hard cap on promotional replies

The five MLM surface signals Reddit detects

Reddit's immune system does not know the difference between a supplement-line downline pitch and a SaaS affiliate. It detects a small set of surface signals that both share. In the S4L dataset each of these signals carries a measurable penalty on expected upvotes.

How the penalty accumulates, one signal at a time

01 / 05

Signal 1: a named product

139 comments in the dataset named a project. Average upvotes collapsed to 1.17, and no comment with a product name ever cleared 10 upvotes. The 2,593 comments without a named product averaged 3.05 and the top one hit 639.

Signal-by-signal penalty table

2,732 comments grouped by the MLM surface signal they carry. The 'Avg performance' column is what Reddit does in response.

FeatureVolumeAvg performance
Comment names a product139 commentsavg 1.17 upvotes, hard cap at 10
Comment has no product name2,593 commentsavg 3.05 upvotes, topped at 639
Comment contains a URL103 commentsavg 1.38 upvotes, cap 40
Comment contains no URL2,629 commentsavg 3.02 upvotes, cap 639
Self-reply to own thread with link(single worst example)-8 upvotes in r/devops
Sub-minute posting gap (spam heuristic)384 comments (55%)avg 2.6 upvotes
1 to 5 minute gap (human-paced)175 commentsavg 7.0 upvotes

The anchor fact: S4L's own name is on its blacklist

Line 309 of scripts/engagement_styles.py is the single most anti-MLM line in the codebase. It is injected into the system prompt for every Reddit reply the bot drafts. The list inside the parentheses is the set of seven projects the bot is allowed to engage on behalf of. The product is telling itself not to mention itself.

~/social-autoposter/scripts/engagement_styles.py

Anchor fact

Line 309 of engagement_styles.py reads, verbatim:

NEVER mention product names (fazm, assrt, pieline, cyrano, terminator, mk0r, s4l). NEVER include URLs or links.

S4L is the seventh name on the list. The product is aware that naming itself in a Reddit comment costs 61% of its expected upvotes, and it bakes that awareness into the drafting prompt. The opposite of MLM is not silence; it is this specific rule, enforced at prompt-level before the LLM sees the thread.

The 20% cap on promotional replies, and where it lives

The standard affiliate and MLM playbook uses the 9:1 ratio: nine value comments for every one promotional. S4L replaces it with a stricter cap, enforced at prompt-drafting time rather than by rate limit. The LLM is told, on every reply, that the promotional style is only permitted 20% of the time. The other 80% rotates across seven content styles, each ranked by live upvote data from the posts table.

~/social-autoposter/scripts/engagement_styles.py

Standard MLM 9:1 playbook vs. the S4L engagement rules

The left column is what most reddit affiliate marketing guides teach. The right column is what S4L actually enforces in prompt.

Feature9:1 playbookS4L actual
Promotional comments10% (the 1 in 9:1)20% absolute cap, prompt-enforced
Non-promotional comments90% undifferentiated80% rotating across 7 measured styles
URL in the promotional commentUsually presentTier 1 default: no URL
Product name in the promotional commentUsually presentOnly in Tier 2 or Tier 3 branches
Rate limit between commentsRarely specified3 to 5 minute minimum gap enforced
Per-subreddit daily capRarely specified2 per sub per day, cross-posted 0
Thread tree positionNot addressedPrefer reply-to-OP (4.2x avg upvotes)

How a single reply is routed through the immune-system rules

A Reddit thread hits the pipeline with an OP body, a set of commenters, a subreddit, and subreddit rules scraped from /about/rules.json. The hub decides the tier, the style, and whether any of the five MLM signals apply. The outputs on the right are the three classes of reply the bot is allowed to produce.

Thread in, classified reply out

Reddit thread
Subreddit rules
config.json projects
Posts table
engagement_styles.py
Tier 1 reply
Tier 2 reply
Tier 3 reply

What happens on a single draft call

thread_scannerengagement_stylesLLMredditpull pending reply + thread contextcompute tier from project/topic matchinject bimodal + blacklist + 20% capdraft reply with style taglint: no product names, no URLs unless Tier 3post comment (or skip on lint fail)upvote count at t+6h logged to posts

What it looks like when the bot refuses to ship an MLM-shaped reply

The lint step is not cosmetic. It runs between the LLM's draft and the post to Reddit. If the draft trips any of the five MLM signals, the reply is skipped and logged as a refusal. The terminal output below is what a real skip looks like, trimmed from a recent run. The bot would rather ship nothing than ship a comment that lives in the 1.17-upvote bucket.

engage_reddit.py (dry-run output excerpt)

Subreddits the bot refuses to comment in

The clearest operational artifact of the anti-MLM stance is subreddit_bans.comment_blocked in config.json. 15 subs are blocked from comments entirely. A longer thread_blocked list (26 subs) blocks thread creation. The pipeline reads both lists before every run in reddit_tools.py _load_comment_blocked_subs(). A sub lands on the list if mods banned the account, if the sub enforces strict no-commercial rules, or if the measured average upvote fell below zero.

r/ClaudeAIr/codexr/degoogler/firefoxr/indiehackersr/localllamar/macappsr/mcpr/Meditationr/qualityassurancer/SaaSr/taxprosr/uxdesignr/vibecodingr/vipassanar/smallbusiness (-0.15)r/node (-4.00)r/EndTippingr/RestaurantOwnersr/singularity

Noteworthy: r/vipassana and r/Meditation are on the list despite the Vipassana project averaging 11.48 upvotes per comment across 81 posts. The block is not performance-driven, it is cultural. A commercial account engaging in contemplative-practice subs is MLM-shaped by definition, no matter how well the content performs. The bot is not allowed to engage there even though the math would tempt it.

3.2x

1 sentence comments: 6.03 avg upvotes. 2 sentence comments: 1.90. The dead zone is real and it is where most MLM pitches live.

engagement_styles.py line 306, measured across 2,732 comments

The anti-patterns file: what the bot is forbidden to ever write

Below the style rules in engagement_styles.py is a separate get_anti_patterns() function. These are not tuned for upvotes. These are the phrases that make a comment legibly MLM to any Reddit reader. The bot will never emit any of them.

engagement_styles.get_anti_patterns()

Phrases the lint step rejects before posting

  • Opens with 'exactly', 'yeah totally', '100%', 'that is smart' (pleaser patterns)
  • Contains 'I built' or 'we built' or 'I am working on' (self-promo signal)
  • Contains 'DM me' or 'shoot me a DM' (MLM-recruiter shape)
  • Contains 'happy to jump on a call' or 'book a demo'
  • Names any product from config.json (fazm, assrt, pieline, cyrano, terminator, mk0r, s4l)
  • Contains any .com, .ai, .io, or http token unless Tier 3
  • Promises to share a link or file not already in config.json
  • Makes a time-bound claim ('by next week', 'before Friday')

If you are doing this by hand, the four rules that transfer

You do not need S4L to write Reddit comments that avoid the MLM immune system. The rules are just four, and each one has measured effect size in the dataset. Most affiliate marketers break all four by default. Breaking one of them roughly halves your expected upvotes; breaking all four drops you into the 1.17-avg floor that defines the MLM-shaped comment class.

Four rules that carry the measured effect

  • Reply to OP, not to commenters. 4.2x multiplier on avg upvotes.
  • Never put a URL in the first comment. 54% average-upvote penalty otherwise.
  • Never name the product you are promoting. 61% penalty and a cap at 10 upvotes.
  • 1 sentence or 4 to 5 sentences. Never 2 or 3 (the dead zone).

Every statistic on this page traces to a single postgres table. This is who owns it.

Who wrote this, and where the numbers came from

See what this pipeline actually ships

S4L is the Reddit commenter that produced every statistic on this page. The code, the prompt rules, the subreddit blacklist, and the lint step are all visible at s4l.ai.

Open S4L

Frequently asked questions

Is r/antiMLM the only reason MLMs get punished on Reddit?

No. r/antiMLM is visible, but the measurable effect is sitewide. In the 2,732-comment S4L dataset, any comment containing a product name averaged 1.17 upvotes against a baseline of 3.05; any comment containing a URL averaged 1.38 against 3.02. Those comments were posted across dozens of subreddits, not just r/antiMLM. The immune response is distributed: a combination of user downvotes, Automoderator link filters, subreddit-specific self-promotion rules, and vote-ring detection. r/antiMLM just makes the norm visible.

Can I do MLM recruiting on Reddit if I follow the 9:1 rule?

The 9:1 rule (nine value comments for every one promotional comment) does not survive contact with the data. S4L's blacklist caps promotional replies at 20%, stricter than 9:1, and still measures a 61% average-upvote penalty whenever a product name appears. The rule does not account for the cliff between 1 upvote and 0 or 1 upvote and silent removal. 58.6% of comments in the S4L dataset sit at exactly 1 upvote, which is consistent with either low traffic or silent shadowban-style filtering. Following 9:1 is necessary but not sufficient: Reddit's immune system targets the shape of the comment, not the ratio.

Which subreddits does an automated tool refuse to post in?

S4L's config.json lists 15 subreddits under subreddit_bans.comment_blocked, including r/SaaS, r/indiehackers, r/vibecoding, r/ClaudeAI, r/mcp, and r/vipassana. The reasons vary: strict mod enforcement, shadowban risk, cultural mismatch, or measured negative engagement. A separate thread_blocked list of 26 subs blocks creating new threads altogether, including r/smallbusiness (-0.15 avg upvotes), r/node (-4.00 avg), r/reactjs, r/EndTipping, r/RestaurantOwners, and r/singularity. The list is reflective, not prescriptive: these are subs where posts empirically underperformed or triggered moderator actions.

What does the 20% recommendation cap actually do?

Line 280 of scripts/engagement_styles.py injects the string 'recommendation: Recommend a project from config casually. MAX 20% of replies.' into the prompt for every Reddit reply the bot drafts. This is not a post-hoc filter or rate limit; it is a constraint the LLM sees before it writes a single word. The effect is that 80% of replies rotate across seven measured content styles (storyteller, pattern_recognizer, critic, contrarian, data_point_drop, snarky_oneliner, curious_probe), ranked by live upvote data. Only 20% are even allowed to name a project. In MLM terms, this is the inverse of the standard downline-expansion playbook.

Why does the product blacklist include S4L itself?

engagement_styles.py line 309 reads verbatim: 'NEVER mention product names (fazm, assrt, pieline, cyrano, terminator, mk0r, s4l). NEVER include URLs or links.' S4L is one of seven projects in the shared config, and the same prompt rules apply to every one of them. When the bot is engaging on behalf of the S4L project, it is explicitly forbidden from naming S4L. The rationale is in the data: naming any project caps the measured comment upside at 10 upvotes. Promotion of S4L happens elsewhere (thread posts under r/self, the website, long-form guides like this one), not inside organic replies. This is the opposite of MLM hierarchy, which depends on downline recruiters naming the program.

Can I automate Reddit engagement without tripping the MLM immune system?

The measurable answer is yes, with specific constraints. Hold rate at 30 to 50 comments per day maximum. Keep 3 to 5 minutes between comments (the 1 to 5 minute gap bucket averages 7.0 upvotes vs 2.6 for sub-minute). One comment per thread, never two. Prefer replying to OP (10.82 avg) over commenters (2.59). Never put a URL in the first comment. Never name the product you are promoting. Use first-person openings (4.18 avg vs 2.71 for 'the' openings). Follow the bimodal length rule: 1 sentence or 4 to 5 sentences, never 2 or 3. If all seven of those hold, the measured distribution puts you in the top decile. If any one breaks, the expected upvote count roughly halves.

What is the difference between Reddit's treatment of MLM and affiliate marketing?

Legally and structurally there is a difference: MLM recruits downstream sellers and pays on their recruits' sales, affiliate marketing pays on a single conversion. Reddit's immune system does not distinguish. Both are detected through the same surface signals: product-name repetition (caps upside at 10 upvotes), URL presence in comments (drops avg 54%), self-reply patterns (one of the worst-performing archetypes in the dataset), and cross-subreddit posting velocity. A comment that names a supplement line with a referral code and a comment that names a SaaS with an affiliate link look identical to Reddit's anti-commercial signal stack. The page rules on this page apply to both.

Does Reddit shadowban MLM accounts specifically?

Reddit does not publish its enforcement criteria, so this is observational. 58.6% of comments in the S4L dataset sit at exactly 1 upvote, which is elevated compared to healthy accounts (typically 30 to 40%). The elevation is consistent with one of three scenarios: comments landing in low-traffic threads, comments being silently removed by Automoderator before accumulating votes, or a soft shadowban where comments appear logged-in but not logged-out. The operational check is to open a logged-out incognito tab and verify the comment is visible. For MLM-shaped accounts (product-name repetition, URL presence, burst posting), the risk of silent removal is much higher than for accounts that follow the bimodal-length and no-link rules.