← SalesQLCONTENT HISTORY
WHAT CHANGED
Update to SalesQL
Snapshot Oct 31, 2026 · 01:16 UTC · version 1.0.2
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save SalesQL and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "End-to-end lead prospecting with SalesQL. Research a business's ideal customer profile (ICP), translate it into SalesQL search filters, find matching people, and reveal emails (with verification status) and phone numbers. Use this whenever the user wants to find leads, prospects, potential customers, or contacts for a business — even if they only give a company description, a website URL, or a vague ask like \"who should I sell this to?\". Also use it when the user mentions ICP research, building a lead list, or filling a pipeline.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 211
}
],
"name": "find-leads",
"skill_md_contents": "---\nname: find-leads\ndescription: 'End-to-end lead prospecting with SalesQL. Research a business''s ideal customer profile (ICP), translate it into SalesQL search filters, find matching people, and reveal emails (with verification status) and phone numbers. Use this whenever the user wants to find leads, prospects, potential customers, or contacts for a business — even if they only give a company description, a website URL, or a vague ask like \"who should I sell this to?\". Also use it when the user mentions ICP research, building a lead list, or filling a pipeline.'\n---\n\n# Find Leads\n\nTurn a business description or website URL into a list of qualified leads with contact data, using the SalesQL MCP tools.\n\nThe input is the user's request: either a description of their business (\"we sell payroll software for restaurants in the US\") or a URL to research. If the request names no business, product, or URL, ask what business or product they want to find leads for before doing anything else.\n\nExplicit instructions from the user take priority over the defaults in this workflow. For example, a user who already gives exact titles, locations, and company sizes can skip the ICP draft, and a user who asks for a different output format gets that format. Consent to spend credits is the one thing never to assume: only call `enrich_person` or `enrich_person_bulk` for leads the user has approved. A request that names the specific people to reveal, or explicitly asks you to reveal results without showing a shortlist first, counts as that approval.\n\n## Why this order matters\n\nIn this workflow, SalesQL charges credits only when revealing real contact data (`enrich_person` or `enrich_person_bulk`). Everything before that — resolving filters, searching, browsing obfuscated results — is free. So the workflow front-loads all the free research and iteration, and only spends credits at the very end, on leads the user has approved. Never invert this: enriching before the user confirms the list wastes their credits on contacts they may not want.\n\n## Step 1 — Understand the business\n\nIf the request contains a URL and you can browse the web, open it (and, if needed, one or two obvious subpages like /pricing or /customers) to understand what the company sells, to whom, and at what price point. If you cannot browse, ask the user to describe the business in a sentence or two. If it's a description, work from that, supplementing with web research (when available) only when the description is too thin to infer a customer profile.\n\nFrom this, draft an ideal customer profile (ICP):\n\n- **Job titles** of the buyer and/or decision maker (include synonyms and seniority variants — \"Head of Sales\", \"VP Sales\", \"Sales Director\")\n- **Industries** of the target companies\n- **Geography**: where the target companies are based (countries, and states/cities if the business is regional) and, only if it also matters, where the people must live\n- **Company size** (employee ranges) and, when relevant, **company type** (private, public, nonprofit…)\n\nPresent the ICP to the user in a short summary and ask them to confirm or adjust it before searching. This checkpoint is cheap and prevents an entire search built on a wrong assumption.\n\n## Step 2 — Resolve filter values with `lookup`\n\n`search_people` rejects guessed identifiers. Industry values are slugs, and country/region values are opaque UUIDs — they cannot be invented or translated. Resolve every non-free-text filter through `lookup` first:\n\n| ICP dimension | `lookup` type | `search_people` field(s) |\n| --- | --- | --- |\n| Industry | `industry` | `industries`, `organization_industries` |\n| Country | `country` | `countries`, `organization_countries` |\n| State / city | `region` | `states_or_cities`, `organization_states_or_cities` |\n| Company size | `company_size` | `organization_employee_ranges` |\n| Company type | `company_type` | `organization_company_types` |\n\nPass the `q` parameter for the fuzzy-searched types (`industry`, `country`, `region`); it is required for them and ignored for `company_size` and `company_type`. Always pass the returned `value` to search filters — never the `label`. Job titles are free text and need no lookup; pass the title variants directly to `job_titles`.\n\n`lookup` consumes no credits, so resolve everything you need without worrying about cost.\n\n## Step 3 — Search with `search_people`\n\nBuild the search from the resolved values. Sensible defaults:\n\n- Filter on the **person's** attributes (`job_titles`) for who they are, and the **organization's** attributes (`organization_industries`, `organization_employee_ranges`) for where they work.\n- Put geography on the side the ICP restricts. `organization_countries` / `organization_states_or_cities` are where the company is; `countries` / `states_or_cities` are where the person lives. Filters combine with AND, so passing both requires both to match.\n - Company geography (\"software companies in Spain\", \"companies based in Spain\", \"Spanish companies\") → `organization_countries` only. A sales leader working from Portugal for a Spanish company still fits.\n - Person location, when the place describes the people themselves (\"sales leaders based in Spain\", \"engineers located in Spain\", \"people who live in Spain\") → `countries` only.\n - Both only when the ICP restricts both (e.g. Spanish companies, and the contacts must live in Spain too).\n - If the phrasing doesn't make it clear, default to `organization_countries` and say so when you present the shortlist, offering to narrow to people who also live there or to switch to people located there regardless of where their company is.\n- Add `has_emails: true` (or `has_emails_verified: true` when the user cares about deliverability) so results are actually contactable.\n- Start with `page: 1` and the default `page_size` of 20.\n\nResults come back with **obfuscated** contact data (e.g. `...@acme.com`) — this is expected and free. `is_total_accurate` is only reliable on page 1.\n\nKnow the `organization_*` filter semantics: they match people holding **any current position** at a qualifying organization, and people often hold several open positions at once — so the primary organization shown in a result may not be the one that matched. Never trust the filter alone: verify the `organization` fields each result includes (e.g. `number_of_employees`, and `location` when present) against the ICP and discard mismatches before presenting the shortlist. A result's top-level `location` is where the person lives, not where the company is: when you filtered by `organization_countries`, a person who lives in another country is not a mismatch.\n\nIterate on the filters, not on pages — if page 1 is off-target, page 2 will be too; fix the query instead:\n\n- **Too few results** (or zero): broaden — drop the narrowest filter, add title synonyms, widen the employee range.\n- **Too many / off-target results**: tighten — add industry or size filters, use the `{include, exclude}` form to exclude noise (e.g. exclude \"Assistant\" titles).\n- Spot-check a handful of names and companies against the ICP before accepting the search as good.\n\n## Step 4 — Present the shortlist and get approval\n\nShow the user the candidate leads in a table: name, title, company, location (where the person lives), LinkedIn URL, and what contact data exists (obfuscated). State clearly how many they asked for versus how many the search found.\n\nThen ask which leads to reveal. This is the credit-spending gate — wait for an explicit answer. If the user wants many leads revealed, check `get_account_status` first and tell them how many credits they have before proceeding.\n\n## Step 5 — Reveal contacts with `enrich_person`\n\nFor each approved lead, call `enrich_person` with the person's `linkedin_url` from the search result. This is the reliable join key between search and enrichment — fall back to `full_name` + `organization_name` (or `organization_domain`) only when a result has no LinkedIn URL.\n\nDeliver the final list as a table: name, title, company, verified emails (with status), phones, LinkedIn URL. If the user wants a file, offer the list as CSV (as a downloadable file when the environment supports it, otherwise as a CSV block they can copy).\n\n## Example\n\n**Input:** \"Find leads for my business: we sell an AI code-review tool for mid-size software companies in Spain\"\n\n1. ICP: CTOs, VPs of Engineering, Heads of Engineering; industry \"software development\"; companies based in Spain (contacts may live elsewhere); 51–200 employees. User confirms.\n2. `lookup` industry q=\"software\" → slug; `lookup` country q=\"spain\" → UUID; `lookup` company_size → \"51-200\" range value.\n3. `search_people` with `job_titles: [\"CTO\", \"VP of Engineering\", \"Head of Engineering\"]`, resolved `organization_industries`, `organization_countries`, `organization_employee_ranges`, `has_emails: true`.\n4. Present 20 obfuscated matches; user picks 10.\n5. `enrich_person` by `linkedin_url` for each; deliver the table with verified emails and phones.\n"
}SHA-256 of public snapshot: a65d078cc1797c65466e0bf6360fa41ccab0bc4748c25ebd762f146d6c8a936e