| name | linkedin-groups-distribution-module |
| description | LinkedIn Groups discovery + distribution spoke. Phase 1: finds right groups for user's content pillars, scores them, writes approved groups to social-channel-directory.md. Phase 2: treats linkedin_group as a distribution spoke type with 7-day cooldown enforcement and discussion-framing rules.
|
| depends_on | ["linkedin-distribution-module","chrome-devtools MCP (authenticated LinkedIn session, port 9222)","brand-amplification/campaigns/social-channel-directory.md"] |
| triggers | ["discover linkedin groups","find groups for my content","add groups to my distribution","post to linkedin groups","linkedin group distribution"] |
| version | 1.0.0 |
| ships_as | v0.49.0 |
LinkedIn Groups โ Discovery + Spoke Support
Output Format
Always start your response with:
โโโ Brand Amplification: LinkedIn Groups Distribution Module โโโ
Why Groups
LinkedIn Groups are underutilized high-trust surfaces. Group members are self-selected niche
audiences โ a post in a 3,000-member AI Engineering group reaches more qualified readers than
10,000 impressions in the feed. Groups compound: a member who sees you in their group AND feed
trusts you more.
Phase 1 โ Discovery Flow
Trigger
"discover linkedin groups" | "find groups for my content" | "add groups to my distribution"
Brain API (brain-kernel >= 1.0.0)
All reads go through brain.read(path). Writes go through brain.write().
Direct filesystem access is FORBIDDEN.
Step 0 โ Pre-flight (mandatory)
Read brain.read("brand-amplification/identity/professional-brand.md") โ extract content_pillars (list of topics).
If not found โ stop and ask user for 3โ5 topic keywords.
Step 1 โ Search (chrome-devtools MCP)
Requires authenticated LinkedIn session (port 9222 active โ check before proceeding).
For each content pillar (max 3 searches to avoid rate limiting):
Navigate: https://www.linkedin.com/search/results/groups/?keywords={pillar}
Extract: group name, member count, recent activity, description, group URL
Aggregate results, deduplicate, sort by relevance + activity.
Step 2 โ Score each group (0โ100)
| Signal | Points |
|---|
| Member count 500โ5000 | +20 |
| Member count >5000 | +15 |
| Member count <500 | +5 |
| Recent activity >10 posts/mo | +25 |
| Recent activity 1โ10 posts/mo | +10 |
| Recent activity 0 posts/mo | โ20 |
| Direct pillar keyword match | +30 |
| Adjacent topic match | +15 |
| "job postings only" in description | โ30 |
| "promotional" in rules | โ20 |
| Already in social-channel-directory.md | flag as "already tracked" |
Present top 10 candidates (score โฅ 40):
Group: "AI Product Leaders Network" | 4,200 members | Active (23 posts/mo) | Score: 82
Group: "LLM Engineering Community" | 1,800 members | Active (15 posts/mo) | Score: 75
...
Step 3 โ User approval
Show list. User selects which to add (can select all or subset).
Step 4 โ Write to social-channel-directory.md
For each approved group, read the current file first (P15 multi-agent read-before-write),
append under a ## LinkedIn Groups section, then write back:
const current = brain.read("brand-amplification/campaigns/social-channel-directory.md") ?? ""
brain.write("brand-amplification/campaigns/social-channel-directory.md", current + newRow, {
provenance: { who: "brand-amplification", why: "linkedin group added", source: "linkedin-groups-distribution-module" },
engine_id: "brand-amplification"
})
New row format:
| linkedin_group | {Group Name} | {URL} | {member_count} | {activity_summary} | โ
APPROVED | Added {DATE} |
Commit: feat(sde): add N LinkedIn groups to distribution channels
Phase 2 โ Spoke Distribution Rules
Channel type: linkedin_group
Trigger: When a campaign's surface coverage matrix includes linkedin_group spokes.
Mandatory formatting (different from regular feed posts)
| Rule | Reason |
|---|
| Open with a QUESTION or observation | Groups respond to discussion-starters, not broadcast |
| Max 150 words in post body | Groups are conversational โ short = more replies |
| ONE external link allowed in body | Groups are less algorithmically suppressed for links |
| No promotional language ("buy", "sign up", "check out my service") | Groups ban spam; promotional posts get removed |
| Add "What's your take?" or similar discussion CTA | Drives comments = algorithmic visibility |
| No more than 1โ2 hashtags | Groups derank hashtag-stuffed posts |
Timing rules
- Cooldown: 7 days minimum between posts to the same group (enforced by dedup gate)
- Best times: TueโThu 10:00โ12:00 user's local timezone
- Max groups per campaign: 3 (more = spam pattern risk)
Dedup gate (fires before every group post)
python3 "$(ls -v ~/.claude/plugins/cache/xos/brand-amplification/*/rules/linkedin-groups-dedup/HOW.py 2>/dev/null | tail -1)" \
'{"group_url": "<URL>", "lookback_days": 7}'
Exit 0 = PASS. Exit 1 = BLOCK with last-post date and next available date.
Post log schema
After each group post, read-append-write the groups post log:
brain.write("brand-amplification/campaigns/groups-post-log.jsonl", existingContent + newEntry + "\n", {
provenance: { who: "brand-amplification", why: "group post logged", source: "linkedin-groups-distribution-module" },
engine_id: "brand-amplification"
})
Entry format:
{"group_url": "...", "group_name": "...", "posted_at": "2026-05-10T14:00:00Z", "campaign": "...", "post_url": "..."}
Comment monitoring reminder
After a groups post is distributed, add Day+1 reminder in the campaign ledger:
"Reply to any comments in '{group_name}' โ first 24h is the visibility window"
Out of Scope
- Auto-posting to groups without user approval (Irreversible-Action Invariant)
- Private/invite-only group discovery
- Group admin relationships (Phase 3)