---
name: build-target-list
description: Use this skill when the user wants to build a complete, enriched prospect list from scratch — defining an ICP and ending up with names, companies, LinkedIn profiles, and contact data ready for outreach.
---

# Build Target List

End-to-end: define ICP → search → enrich → export ready-to-use contact list.

## Triggers

"build me a prospect list", "create a target list", "I need [role] at [type of company] with emails", "generate outbound list", "find and enrich prospects matching [criteria]". Full end-to-end ICP-to-contact-list workflow.

## Chain

```
ICP criteria
  → search_business_profiles  (find matching people)
  → enrich_email              (batch — business emails)
  → enrich_phone              (batch — mobile, optional)
```

## Set Expectations

Before firing any calls, give the user a brief, dry heads-up. Deadpan over enthusiastic — no filler, no corporate speak.

Facts to work with:
- 2 phases: search (paginated at 25/call) then batch enrich
- 50 prospects: ~30–60 seconds total; 100+ prospects: ~60–120+ seconds
- If paginating: search phase = X pages × ~3–5 seconds, then enrichment on top
- Include the target count and which data types will be fetched

## Step 0 — Input Quality Gate

Before proceeding, assess how much the user has provided. If the request is vague (fewer than 3 of the 6 ICP fields below are specified), **pause and ask before searching**.

### Minimum viable input (need at least 3)
| Field | Example |
|---|---|
| Role / title | "VP of Marketing", "Head of Growth", "RevOps Manager" |
| Seniority | "Director+", "C-suite", "Senior IC" |
| Industry | "SaaS", "eCommerce", "Financial Services" |
| Department | "Marketing", "Sales", "Engineering" |
| Country / region | "United States", "UK + Germany", "APAC" |
| Target count | "50 contacts", "100 records" |

### Vague input triggers
Trigger this gate if the user says something like:
- "build me a list of marketers"
- "find me some SaaS prospects"
- "I need leads" (no role, industry, or location)
- Only one ICP field provided

### Response when input is vague

Say something like:

> "To build a high-quality list I need a bit more info. Which of these can you fill in?
>
> - **Role/title keywords** — e.g. "VP Marketing", "Head of Demand Gen", "Growth Manager"
> - **Seniority level** — e.g. Director+, C-suite, Senior IC, Any
> - **Industry** — e.g. SaaS, eCommerce, FinTech, Healthcare
> - **Department** — e.g. Marketing, Sales, RevOps, Engineering
> - **Location** — e.g. United States, UK, Global
> - **How many contacts** — e.g. 50, 100, 250
>
> More fields = tighter targeting = less wasted credits. At minimum, role + industry + location gives good results."

Wait for user response before proceeding to Step 1.

### Tips to share if user asks what makes a good search
- **Role + seniority + industry** is the strongest combo — filters to a specific persona
- **Location** dramatically narrows results — omit only if global list is intentional
- **Department** helps when titles vary widely (e.g. "growth" could be Marketing or Product)
- **Company size** (if supported) useful for enterprise vs. SMB targeting
- Vague title like "manager" without industry/department → broad, low-quality results

## Step 1 — Define ICP

Gather from user (confirm or fill any still missing after Step 0):
- Role / title keywords
- Seniority level
- Industry
- Department
- Country / location
- Target count (how many records needed)

## Step 2 — Credit check (required)

Call `MoltSets:get_billing` and `MoltSets:get_usage` with `period: billing_cycle` in parallel (free).

Estimate:
```
N prospects × enrich_email cost    = email cost
N prospects × enrich_phone cost    = phone cost (if requested)
Total:                             = ~XXX credits
Current balance:                   = XXX credits
```

If estimated cost > balance: stop. Report shortfall, how many records the balance covers, ask whether to proceed partially or top up.

## Step 3 — Search

Probe first: run `search_business_profiles` with `limit: 1`. Check top result quality.
- Good match → scale to desired limit (max 25 per call)
- Poor match → adjust `query` / filters before scaling

For N > 25: paginate with `offset` (25, 50, 75...) until target count reached.

## Step 4 — Deduplicate

Remove duplicate LinkedIn URLs before enrichment.

## Step 5 — Bulk enrich

Pass LinkedIn URLs to:
- `enrich_email` with `linkedin_urls` array
- `enrich_phone` with `linkedin_urls` array (if requested)

Run in parallel. Chunk at 100 if needed.

## Step 6 — Output

| Name | Title | Company | Country | LinkedIn | Business Email | Mobile |
|---|---|---|---|---|---|---|

**Summary:**
```
Prospects found:   X
Business emails:   X/N (XX%)
Mobile numbers:    X/N (XX%)
Credits used:      ~XXX
```

Offer to format as a copyable CSV-style table for export.

## Edge cases

- Low email/phone hit rates are normal — credits only charged on hits
- `search_business_profiles` max 25/call — loop with `offset` for larger lists
- If filters produce < target count, suggest broadening one constraint at a time
- Stop immediately if credits run out mid-enrichment — output completed rows, report resume point
