Prospecting

Prospecting search

Write the exact Crustdata Person Search filter tree or Blitz Find People query for an outbound campaign's audience, so Outreach Hub can count the market before anyone is pulled. Use when a campaign plan needs its search, when a market is being sized, or when a search is changed. Defines the query; the hub's typed code runs it.

DraftNot used in a campaign yetVersion 2026.10.01.1

prospecting-search/SKILL.md9.0 KB146 lines

When asked which version of this skill is active, report metadata.version exactly.

What this skill does

search brief (from campaign-planner) -> choose a source -> one exact query + readable filters (this skill)
  -> the hub counts the market -> a person approves -> the hub pulls the test batch

You return one search as JSON matching schemas/search.schema.json, and nothing else. You do not call Crustdata or Blitz, do not see a key, and do not estimate the market size: the hub counts it and shows the number with the query. The query must be exact, because the same query is what gets pulled after approval.

Read the references before writing a query:

  • references/crustdata-person-search.md: Crustdata Person Search fields and operators.
  • references/blitz-find-people.md: Blitz Find People filters and the case-sensitive values it accepts.
  • references/blitz-industries.txt: every industry value Blitz accepts, one per line.
  • references/house-targeting.md: the house targeting rules for direct sellers, as exact Crustdata and Blitz conditions.

Choosing the source

Use the plan's source when it is crustdata or blitz. When it is auto:

  • Crustdata when the audience is defined by what people call themselves: a title, a certification, a niche role, words in a headline ("EOS Implementer", "Fractional COO"). Crustdata matches exact phrases across current titles and headlines.
  • Blitz when the audience is defined by the company: an industry, a headcount band, a country, plus a seniority or function ("owners of HVAC companies with 20+ employees"). Blitz filters those on normalised company data.

Say which and why in notes, in one sentence.

Direct sellers and partners

The brief's audience_kind says who the campaign reaches.

  • direct_seller: companies that would sell their own data. Use Crustdata unless the plan names Blitz, because only Crustdata holds every rule. Every direct-seller query applies the house targeting rules in references/house-targeting.md, whatever the brief says:

    • employer headquarters in the US;
    • headcount 30 to 750, or the brief's range when it is narrower;
    • no nonprofit, government or educational company type;
    • none of the regulated industries listed there.

    Copy them exactly, at the top level of the tree beside the title group. A brief that asks for something the rules forbid, such as a law firm or a team of 2,000, keeps the rule; say in notes what was left out and why.

  • partner: people who introduce many sellers. Apply none of these rules. Partners are often in regulated fields, and that is fine.

  • Missing: a campaign planned before plans said. Write the query from the brief alone, as before.

Each house rule gets its own readable line. Write the industries as "Regulated industries left out" followed by every name, and the company types as "Company types left out".

Crustdata rules

The query is a filter tree two levels deep: a top group {"op": "and" | "or", "conditions": [...]} whose conditions are either {"field": ..., "type": ..., "value": ...} or one more group of such conditions. No deeper nesting: an outbound audience is an and of or groups.

  • Titles. One [.] condition per title variant on experience.employment_details.current.title, joined in an or group. [.] is an exact, case-insensitive phrase: [.] "EOS Implementer" also matches "Certified EOS Implementer". Add the same phrases on basic_profile.headline inside the same or group when people in this market often describe themselves in the headline rather than the title.
  • Never use (.) (every word, any order; too easily read as OR) and never put |-separated alternatives in one value.
  • Exclusions. A (!) condition per excluded phrase, at the top level of the tree, never inside an or group.
  • Current employer only. Use experience.employment_details.current.* fields; a past role does not make someone reachable for this offer.
  • Company size. Numeric bounds on experience.employment_details.current.company_headcount_latest, written as >= and <=; the hub translates them to Crustdata's => and =<.
  • Industry. experience.employment_details.current.company_industries with in and the exact indexed strings, only when the brief names an industry the titles do not already imply.
  • Person geography. basic_profile.location with one [.] condition per country or region, as a full name ("United States", "Canada"), joined in an or group. Employer headquarters country is a different field and uses ISO-3 codes; use it only when the brief is about where the company is, not where the person is.

Blitz rules

The query is the Find People body: {"company": {...}, "people": {...}}. All filters combine with AND; values inside one list combine with OR.

  • Values are case-sensitive. Industry, employee range, job level and job function must be copied exactly from the references. A value that is not listed returns zero people without an error, so if you cannot find an exact match, leave the filter out and say so in notes.
  • Titles. people.job_title.include, wrapping a value in square brackets for an exact title ("[Owner]" matches Owner, not Co-owner) and leaving it bare for keyword matching. Exclusions in people.job_title.exclude.
  • Seniority. people.job_level from: C-Team, VP, Director, Manager, Staff, Other. Owners and founders of small companies are usually C-Team; pair it with titles rather than rely on it alone.
  • Company size. company.employee_range from: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+. Pick every band the brief's size touches, and say in notes when a band only partly overlaps it.
  • Person geography. people.location.country_code with 2-letter ISO codes (US, CA). company.hq.country_code is where the company is based, a different question.

Readable filters

readable lists every filter the query applies, one line each, as a reviewer reads it: {"label": "Current title", "value": "\"EOS Implementer\" OR \"Certified EOS\" OR \"Professional EOS\""}. It must describe the query exactly, with nothing added and nothing left out, because the reviewer approves the query through it.

Example (Crustdata)

Brief: EOS Implementers who run their own practice, owners or partners, United States and Canada, excluding assistants and coordinators.

{
  "source": "crustdata",
  "crustdata": {
    "filters": {
      "op": "and",
      "conditions": [
        {
          "op": "or",
          "conditions": [
            { "field": "experience.employment_details.current.title", "type": "[.]", "value": "EOS Implementer" },
            { "field": "experience.employment_details.current.title", "type": "[.]", "value": "Certified EOS" },
            { "field": "experience.employment_details.current.title", "type": "[.]", "value": "Professional EOS" }
          ]
        },
        {
          "op": "or",
          "conditions": [
            { "field": "basic_profile.location", "type": "[.]", "value": "United States" },
            { "field": "basic_profile.location", "type": "[.]", "value": "Canada" }
          ]
        },
        { "field": "experience.employment_details.current.title", "type": "(!)", "value": "Assistant" },
        { "field": "experience.employment_details.current.title", "type": "(!)", "value": "Coordinator" }
      ]
    }
  },
  "blitz": null,
  "readable": [
    { "label": "Current title", "value": "\"EOS Implementer\" OR \"Certified EOS\" OR \"Professional EOS\"" },
    { "label": "Location", "value": "United States OR Canada" },
    { "label": "Exclude titles containing", "value": "Assistant, Coordinator" }
  ],
  "notes": "Crustdata: the audience is defined by a certification in the title."
}

Verified against live counts

On 2026-10-01, the planner and this skill wrote two searches through Launch's own code, and Crustdata counted both:

  • "Owners and CEOs of US software and IT services companies with 30 to 750 employees", planned as direct sellers, counted 33,658. The query held every house rule.
  • "Solo fractional CFOs in the United States", planned as partners, counted 8,082. The query held none of the house rules.

On 2026-09-28 the example search counted 509 people in Crustdata. Its pieces behaved as written: the title and headline phrases alone matched 965, adding basic_profile.location with "United States" OR "Canada" narrowed that to 831, and the headcount ceiling and exclusions to 509. A person's country as a full name on basic_profile.location works.