Outreach based on Slack membership
Membership in a Slack community is the qualification, so everyone in it is in scope, resolved by name and corroborated against their own words.
- Starts
- Weekly schedule
- Steps
- 6
- Checks and gates
- 0
- A person decides
- Never, runs alone
Trigger · Schedule
Weekly schedule
A weekly pass, so members who joined since the last run are picked up without anyone re-running it by hand.
Claude runs the rest autonomously
- 1
AI collects the member list.
SlackSlack
The community's member list comes out in full, and it is expected to be thin, since most profiles carry a handle and nothing more.
- 2
AI gathers members' own introductions.
SlackSlack
Members who introduced themselves in the #introduction channel come first, with their name, company and role in their own words.
- 3
AI matches each member to a profile.
SerperSerper
A member is matched to a profile only when company, role or context backs it up, and is left unmatched rather than matched weakly.
- 4
AI finds emails, rejects mismatches.
FullEnrichFullEnrich
Each matched person gets a work email, and any address at an employer other than the one they described is thrown out.
- 5
AI writes openers for each role group.
Founders, operators, agencies and investors each get their own angle, written from the person's own words and never naming the community.
- 6
AI stages the campaign for review.
Each group sits in its own track, anyone already in a live campaign is left out, and a person reviews and launches it.
A community roster looks like a ready-made prospect list and almost never is. Most profiles carry a handle and nothing else, and pulling the list at all usually means scripting around a virtualized member panel that quietly stops rendering new rows.
The real list is smaller and takes work to build: mining the members who introduced themselves, resolving the rest by name, and rejecting every match and every email that doesn't corroborate who the person said they were. What's left is a campaign where membership itself is the qualification. Nobody gets filtered out for being the "wrong" kind of member; they get written to differently.
What you get
A staged, segmented campaign built from a community's own roster, every match corroborated and every email checked against what the person actually said about themselves, ready for a person to launch.
How AI turns a Slack community into prospects
The run is weekly, so members who joined since the last pass are picked up without anyone repeating the work by hand.
The member list comes out of Slack first. Member panels in chat tools are usually virtualized: only the visible rows exist in the page, and the rest render as you scroll. A script that sets the scroll position directly often scrolls a list that never redraws, especially in a background browser tab, and re-reads the same few rows forever while clicks and screenshots keep working. A real wheel event is what forces the repaint, so the agent loops: scroll, read what rendered, repeat.
The #introduction channel comes next, read in full before anything else. Members there state their name, company and what they do in their own words, which is both the key that resolves them and the detail an opener is written from. A bare handle is nearly unfindable; "I'm [name] from [company], I do [role]" resolves in seconds. It is a small fraction of the community and by far its highest-quality part. The rest of the roster follows as a second pass with name-only search, which resolves fewer people per hour and still grows the list well beyond the introductions.
Matching members and finding emails without guessing
Each name, with the company the person gave where there is one, is searched through Serper for a professional profile. For roster-only members with no stated company, the search result's own headline (name, role, employer) often becomes the whole personalization source, so it is captured.
A match counts only when something corroborates it: the same company, the same role, the same context. Two plausible profiles for one name, with neither corroborating, stay unresolved. No match is better than a weak one.
Resolved people are enriched for a work email through FullEnrich, email only, since phone lookups cost far more credits per hit. Enrichment returns the domain of a person's current employer, which is not always the company they introduced themselves as: someone who described a side project or a new venture may still get an address at their day job. Any email whose domain doesn't match what the person said about themselves is rejected. A meaningful share fail this check, and sending to the wrong address at the wrong company reads as sloppy in a way a missed contact never does.
Writing to community members without naming the community
Membership is the qualification, so the list is never trimmed by a read of fit. A solo founder, an agency owner and an investor are all in scope. The only legitimate gates are whether the person can be identified and reached, and whether there is a conflict: they work for a competitor, they are already a customer, or they are already in a live campaign.
People are grouped by role type (founders, in-house operators, agencies and consultants, investors) because they don't share a problem, and a single angle won't land for all of them. Agencies are often a partnership opportunity more than a direct buyer, and get a different message. Each opener is two short sentences built from the person's own words, and each passes one test: swap in someone else from the same segment, and if the line still reads true, it is still a segment description.
The copy never mentions the community the list came from, and never asserts what tool someone uses based on their membership in it. A fact about your own product is fine to state. An inference about their behavior drawn only from where you found them has no innocent explanation, and one sentence that implies it costs the whole message its credibility.
A staged campaign, launched by a person
Before anything is created, the agent lists live campaigns and their enrolled people, and skips anyone already enrolled elsewhere for a similar audience. Each segment loads into its own track with its own copy, and a few loaded rows are spot-checked against what was meant to be sent. Then it stops. A person reviews the drafts by segment and launches them; the agent never calls a send.
Each run reports how many members came off the roster, how many resolved through the introductions and how many through the wider roster, how many passed identity resolution, how many emails were rejected for not corroborating the person, the segment breakdown, and the campaign staged for review.
The prompt
The real prompt behind the steps above, detailed enough that an agent with the same tools can run it as written. The Run buttons copy the full version, which also carries the steps for connecting those tools.
# Turn a community's member list into a campaign
You have access to web search and an email-enrichment tool, plus
browser access to the community itself (a Slack workspace, a forum, a
user group — anywhere members post in their own words). Run this
against **[the community you're a member of, and the segment it maps
to]**.
## 1. Collect the member list, and expect it to disappoint
Membership lists in chat tools are usually virtualized — only the
visible rows exist in the page at any moment, and the rest render in as
you scroll. **A script that sets scroll position programmatically often
scrolls a list that never actually redraws**, especially in a
browser-automated background tab, and silently re-reads the same
handful of rows forever. Clicks and screenshots keep working, which
makes the failure easy to miss. A real scroll event (a wheel event, not
a position jump) is what forces the list to repaint — loop: scroll,
read what's rendered, repeat.
Expect the raw roster to be thin: most member profiles carry a handle,
not a full name, and no company or title at all. That's expected — the
next step is where the real signal comes from.
## 2. Gather members' own introductions first
Most communities like this have an #introduction Slack channel, or a
thread serving the same purpose, where members state their own name, company, and what they do in plain prose.
That text is both the resolution key and the personalization source —
a bare handle is nearly unfindable, but "hi, I'm [name] from [company],
I do [role]" resolves in seconds and gives you a real detail to write
from.
Work the #introduction channel first, in full, before touching the rest of the
roster — it's a small fraction of the community but by far the highest
quality. Then work the rest of the roster as a second, higher-volume
pass with name-only search; it resolves far fewer people per hour, but
meaningfully grows the list beyond the #introduction channel alone.
## 3. Match each member to a profile — reward corroboration, not confirmation
Search each name (with their stated company, where you have one) for a
professional profile match. For roster-only people with no stated
company, the search result's own headline (name, role, employer) often
becomes the entire personalization source — capture it.
Accept a match only when something about it actually corroborates the
person — matching company, matching role, matching context — not just a
name that happens to match. Where two plausible profiles exist for the
same name and neither one corroborates, treat it as unresolved rather
than guessing. **Prefer no match to a weak one.**
## 4. Find emails, reject mismatches
Enrich the resolved profile for a work email. Ask for email only, not
phone, unless you specifically need it — phone lookups typically cost
far more credits per hit.
Enrichment tools return the person's **current** employer's domain,
which isn't always the company they introduced themselves as. Someone
who described a side project or a new venture in the community may
still get an email at their day job. **Reject any email whose domain
doesn't match what the person actually said about themselves** — a
meaningful share of matches fail this check, and sending to the wrong
address at the wrong company is worse than not sending at all.
## 5. Write openers for each role group's real problem
Group resolved people by role type — founders, in-house operators,
agencies/consultants, investors are common splits — since they don't
share a problem and a single angle won't land for all of them. Agencies
in particular are often a partnership opportunity rather than a direct
buyer; treat that as a different message, not a smaller version of the
same one.
Write two short sentences per opener, using the person's own words from
step 2 or 3 wherever you have them. Check each one with a simple test:
swap in a different person from the same segment — if the line still
reads true, it isn't personalization yet, it's a segment description.
**One hard constraint on the copy itself: 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 to
state; an inference about their behavior, drawn only from where you
found them, isn't — there's no innocent way to know it, and naming the
source erodes trust in one line.
## 6. Stage the campaign for a person to launch
Before creating anything, check what's already sending — list live
campaigns and their enrolled people, and skip anyone already enrolled
elsewhere targeting a similar audience rather than adding them again.
Load each segment into its own track with its own copy. Verify the
personalization landed — spot-check a few loaded rows against what you
intended to send. Then stop: stage everything for review, and never
call a send or launch action. A person reviews drafts by segment and
launches from there.
## Output
Report: how many members extracted from the roster, how many resolved
through the #introduction channel vs. the wider roster, how many passed
identity resolution, how many emails were rejected for not corroborating
the person, the segment breakdown, and the campaign staged for review.
Why run it with Tulina
A prompt helps one person. A process moves a team.
Pasted into a chat, the prompt above works once, for whoever pasted it. In Tulina, "Outreach based on Slack membership" becomes a process the team shares, that keeps its history, runs on its own, and stays inside the same security perimeter as the tools it calls.
The whole team works on the same one
PersonalTeamOrganisation
A process lives where it belongs: yours, your team's or the whole organisation's. Whoever runs it can improve it, and everyone starts from the best version instead of explaining the job again.
Every edit is a version
v1v2v3
Each change is a new version with the previous one kept, so a bad edit is undone by restoring an earlier one. Every run records the version it followed, and what a run teaches goes back into the process.
It runs without you
schedulewebhookon demand
A hosted agent runs the process on Tulina's own infrastructure, on a schedule or when an event arrives, and keeps going when you close the chat. Nothing to host. Every run is tracked to its outcome.
Inside the same security perimeter
vaultrolesrun log
Credentials stay in the vault, never in the prompt. Roles decide who may run what, every call is logged, and a step a person has to approve waits for that person.
Questions about prospecting in Slack communities
Related processes
Processes that share tools with this one. The shared tools are lit.
Keep your knowledge base current
An AI knowledge base kept current each morning: yesterday's activity in your tools is read, stale pages are rewritten in place, and a missed day sends an alert.
- Shares
- Slack
Daily schedule7 steps →
Outbound from buying signals
Each morning, companies with a new stack or hiring signal are scored on your rubric, checked against the CRM and live sequences, and given one opener per buyer.
- Shares
- Serper
Daily schedule7 steps →
Social listening to qualified leads
Every morning, competitor-post engagers and companies reading your site are matched to the CRM, qualified on your ICP, ranked by intent and handed to their rep.
- Shares
- FullEnrich, Slack
Daily schedule7 steps →