← all doctrines
gtmoto

Scrape Leads From Slack Communities

Turn membership in an adjacent tool's community into a staged, segmented outreach campaign — corroborated identity, never a scraped list.

connectors used

SlackSlack1
SerperSerper1
FullEnrichFullEnrich1

Scrape Leads From Slack Communities

When to use it: your list comes from membership in a community for an adjacent tool (a Slack group, a user community, a marketplace). Membership itself proves the person already buys this category — that's the qualification, not firmographics.

              Natural language input in Claude
              "Build a campaign from this Slack community's roster."
                         │
                         ▼
┌─────────────────────────────────────────────────┐
│  1 · Extract the roster                         │
│  A member-only workspace has no API —           │
│  a real scroll repaints it, a jump does not.    │
└────────────────────────┬────────────────────────┘
                         ▼
┌─────────────────────────────────────────────────┐
│  2 · Mine the intro channel first               │   slack_read_history
│  Where members state their own name and         │
│  company, then work the wider roster.           │
└────────────────────────┬────────────────────────┘
                         ▼
┌─────────────────────────────────────────────────┐
│  3 · Resolve identity                           │   serper_search
│  Search each name for a corroborating           │
│  profile — prefer no match to a weak one.       │
└────────────────────────┬────────────────────────┘
                         ▼
┌─────────────────────────────────────────────────┐
│  4 · Enrich, reject mismatches                  │   fullenrich_enrich_linkedin
│  Reject any email whose employer doesn't        │
│  match what the person said about themselves.   │
└────────────────────────┬────────────────────────┘
                         ▼
┌─────────────────────────────────────────────────┐
│  5 · Segment and write                          │
│  Group by role, since founders, operators       │
│  and agencies don't share a problem.            │
└────────────────────────┬────────────────────────┘
                         ▼
┌─────────────────────────────────────────────────┐
│  6 · Load the campaign                          │
│  Dedupe against what's already sending,         │
│  then stop — a person reviews and launches.     │
└─────────────────────────────────────────────────┘

Rule zero: membership is the qualification

Don't filter by your own read of fit — a solo founder, an agency owner and an investor are all in scope; they get different copy, not a smaller list. The only two legitimate gates: can this person be identified and reached, and is there a conflict (competitor, existing customer, already in a live campaign).

1. Extract the roster, and expect it to disappoint

Member lists in chat tools are usually virtualized — only visible rows exist in the DOM, the rest render as you scroll. A script that sets scroll position programmatically often scrolls a list that never redraws, and silently re-reads the same rows forever, while clicks and screenshots keep working — which makes the failure easy to miss. A real scroll event (wheel, not a position jump) is what forces a repaint. This is the workaround for a workspace you can only reach as a plain member — see step 2 for the case where you have real API access instead.

2. Mine the self-introduction channel first

Most communities have an intro channel where members state their own name, company and role in prose — that's both the resolution key and the personalization source. If you already have Slack API access to this workspace (a bot or user token installed as a member, not just your own login), pull the channel's history directly with slack_read_history instead of scrolling it in the browser — it's faster and it doesn't fight virtualization. Otherwise, work it fully in the browser before the wider roster: a bare handle is nearly unfindable, but "hi, I'm X from Y, I do Z" resolves in seconds. Then work the rest of the roster as a second, higher-volume pass with name-only search.

3. Resolve identity — reward corroboration, not confirmation

  • serper_search each name (plus company, when known). Accept a match only when something actually corroborates it — matching company, role, context. Prefer no match to a weak one.

4. Enrich, and reject anything that doesn't corroborate

  • fullenrich_enrich_linkedin — enrichment tools return a person's current employer, which isn't always what they introduced themselves as (a side project, a new venture). Reject any email whose domain doesn't match what the person actually said about themselves.

5. Segment, then write to each group's real problem

Founders, in-house operators, agencies/consultants and investors don't share a problem — a single angle won't land for all of them. Agencies in particular are often a partnership opportunity, not a direct buyer. Write from the person's own words wherever you have them, and check each opener with the stranger test: swap in a different person from the same segment — if the line still reads true, it isn't personalization yet.

One hard rule on the copy: never reference the community the list came from, and never assert what tool the person uses based on their membership in it. A fact about your own product is fine; an inference about their behavior, drawn only from where you found them, reads as surveillance the moment it's noticed.

6. Load the campaign, ready for a person to launch

Check what's already sending first — skip anyone already enrolled elsewhere targeting a similar audience. Load each segment into its own track with its own copy, spot-check a few for the personalization landing correctly, then stop: stage everything for review and never call a send or launch action yourself.

fork this doctrine into your oto space.

add to oto