---
name: slack-list-builder-agent
description: "Request prospect lists in Slack in plain English: an AI agent parses filters, estimates Clay credits, gets approval, dedupes against your CRM, and replies. Use when reps and marketers wait days for RevOps to build a prospect list, or pull their own from Apollo with inconsistent filters, no CRM dedupe, and no check on how many credits the pull will burn."
---

# Build Prospect Lists from Plain-English Requests in Slack

Reps and marketers wait days for RevOps to build a prospect list, or pull their own from Apollo with inconsistent filters, no CRM dedupe, and no check on how many credits the pull will burn.

## When to use this skill

- The user wants to set up or run this workflow: "Build Prospect Lists from Plain-English Requests in Slack".
- The user describes this problem: Reps and marketers wait days for RevOps to build a prospect list, or pull their own from Apollo with inconsistent filters, no CRM dedupe, and no check on how many credits the pull will burn.

## At a glance

- Category: Outbound
- Difficulty: Advanced
- Time saved: 4 hours per week. This figure is an estimate, not a measured result.

## Tools

Options separated by "or" are alternatives; use whichever the user already has.

- Slack
- Zapier or Make
- OpenAI API
- Clay
- Apollo
- HubSpot or Salesforce
- Instantly or Smartlead

## Steps

1. Create a #list-requests channel with a pinned request format (who, where, company size, signal, titles, how many), and have a Zapier or Make scenario trigger on new top-level messages there and pass the text, requester, and message timestamp to the next step
2. Parse the request with an AI step into a fixed JSON filter set: industries, keywords, hq_countries, employee_min, employee_max, latest_funding (round or amount), hiring_titles, technologies, target_titles, seniority, max_contacts, and unmapped_terms; reply in the thread with the filters as understood and list any term it could not map instead of guessing
3. Estimate before spending: get the number of matching companies from the search, apply the max rows cap you set for the channel, multiply by the per-row credits you measured from Clay's run estimate on a 10-row test of your enrichment and email columns, and post "N companies match, capped at X contacts, about Y credits" in the thread
4. Require approval: below your credit threshold the requester confirms in the thread; above it, or past the monthly budget, a named approver such as the RevOps lead must approve in the thread, and nothing is pulled without a confirmation
5. Source and enrich in a Clay table: Find Companies with the industry, headcount, location, keyword, and technographic filters, or Apollo's search with its job postings and funding filters for hiring and funding signals, using Find Companies' exclude companies option with your customer and open-opportunity domains; then find people by target title, cap contacts per company, and run a work email waterfall with validation only on rows inside the cap
6. Dedupe against the CRM and active sequences by normalized email and domain: drop do-not-contact records and contacts already in an Instantly or Smartlead campaign, and flag accounts with an owner or an open opportunity instead of dropping them so the requester sees who to ask
7. Reply in the thread with the result: accounts found, contacts with a valid email, rows removed (customers, open opportunities, already sequenced, invalid email), credits used against the estimate, and a link to the Clay table view or a CSV; the agent never enrolls anyone, so the requester reviews the list and adds it to a sequence

## Template outline

Field names, thresholds, and message text are starting points to adapt.

~~~text
Slack intake (#list-requests, Zapier or Make on new top-level messages):
Request: "Series B fintechs in the US hiring RevOps, 200 to 1000 employees, VP Sales and Head of RevOps, 150 contacts"

AI parse to JSON:
{ industries, keywords, hq_countries, employee_min, employee_max, latest_funding,
  hiring_titles, technologies, target_titles, seniority, max_contacts, unmapped_terms }
Thread reply: "Filters: {{filters}}. Could not map: {{unmapped_terms}}. Reply 'confirm' or correct me."

Estimate and approval:
- Matches: company count from the search
- Cap: min(max_contacts, {{channel_cap}})
- Credits: cap x {{credits_per_row}} (from Clay's estimate on a 10-row test)
- Thread: "{{matches}} companies match, capped at {{cap}} contacts, about {{credits}} credits"
- Over {{approval_threshold}} credits or monthly budget: approver must confirm

Clay Table: Accounts
- Company Name | Domain (normalized) | Industry | Employee Count | HQ Country | Latest Funding | Hiring Signal (Apollo job postings) | CRM Status (customer, open opp, owner) | Keep (formula)
- Source: Find Companies (filters + exclude companies = customers and open opps) or Apollo search

Clay Table: Contacts
- Full Name | Title | LinkedIn URL | Row Number | Work Email (waterfall, Only run if Keep AND Row Number <= cap) | Email Valid | In CRM | In Sequencer | Final (formula)

Thread result:
"{{accounts}} accounts, {{valid_contacts}} contacts with valid emails. Removed: {{customers}} customers, {{open_opps}} open opps, {{sequenced}} already sequenced, {{invalid}} invalid. Credits: {{used}} of {{estimate}} estimated. List: {{clay_view_or_csv_link}}"
Output: self-serve prospect lists with consistent filters, CRM and sequence dedupe, and a credit check before every pull
~~~

## Guardrails

- Work only in the user's own accounts and workspaces, with their credentials.
- Confirm with the user before any step that writes to a CRM, sends email or messages, spends credits, or moves money.
- Treat every hours, cost, and threshold figure as a starting assumption and replace it with the user's numbers.
- Do not invent data, prices, or results. If a vendor price matters, check the vendor's current pricing page.

## Source

https://gtmplaybooks.io/playbooks/slack-list-builder-agent/
