Skip to content
Marketing
Skill

/company-contact-finder

Find decision-makers at a specific company using Fiber, Crustdata and PDL people search inside the GooseWorks coworker. Given a company name and target titles, returns a list of contacts with name, title, LinkedIn URL, and location.

From plugin
goose-skills
1.3k181 skills

Claude Code

$ npx -y skills add gooseworks-ai/goose-skills --skill company-contact-finder --agent claude-code

SKILL.md

company-contact-finder.SKILL.md
name: company-contact-finder
description: >
  Find decision-makers at a specific company using Fiber, Crustdata and PDL
  people search inside the GooseWorks coworker. Given a company name and target
  titles, returns a list of contacts with name, title, LinkedIn URL, and location.

company-contact-finder

Find decision-makers at a specific company by name and target titles. Uses the GooseWorks coworker's people-search tools (Fiber, Crustdata, PDL) with a layered fallback, so you only pay for the next source when the last one came up short.

Where this runs

**This skill runs only inside the GooseWorks coworker** (the coworker in the GooseWorks app). The people-search tools it uses exist only there. They are not on the GooseWorks server that Claude, ChatGPT and other outside agents connect to.

If `fiber_person_search`, `crustdata_person_search` and `pdl_person_search` are not in your tool list, you are outside the coworker. Tell the user that this contact search runs only inside the GooseWorks coworker, and stop. Do not try other tools in their place.

Spend rule

Every search in this skill is paid. **Before each paid search or page, tell the customer what it costs and wait for their yes.**

  • Take the price from the tool's own description, for the page size you are about to ask for. Do not quote a price from memory or from this file.
  • Ask again before every next page or next source. A yes covers one search, not the whole fallback chain.
  • If they say no, stop and show what you have so far.

Inputs

| Input | Required | Default | Description | |-------|----------|---------|-------------| | company_name | Yes | -- | The company to search (e.g., "EisnerAmper") | | company_linkedin_url | No | -- | Company LinkedIn URL for disambiguation | | target_titles | Yes | -- | List of titles to find (e.g., ["Partner", "Controller", "VP Finance"]) | | num_results | No | 10 | How many contacts to return |

Procedure

Step 1: Understand the Request

Parse the user's request to extract:

  • **company_name** (required) -- the company to search at
  • **company_linkedin_url** (optional) -- helps disambiguate common names
  • **target_titles** (required) -- list of job titles or roles to find (e.g., ["Partner", "Controller", "VP Finance", "CFO"])
  • **num_results** (optional, default 10) -- how many contacts to return

If the user does not provide target titles, ask for them. Suggest common senior titles based on context:

  • For accounting/CPA firms: Partner, Managing Director, Controller, CFO, VP Finance
  • For tech companies: VP Engineering, CTO, Head of Product, Director of Engineering
  • For general B2B: VP, Director, C-Level, Head of

Step 2: Fiber Search (Primary)

Fiber takes a natural-language query and charges per record returned, so ask only for as many records as you need.

Quote the price for this page size and get the customer's yes. Then use `fiber_person_search`:

fiber_person_search(
  query: "[title1] OR [title2] OR [title3] at [company_name]",
  page_size: 10
)

Set `page_size` to `num_results` (at most 100). For a next page, pass the `cursor` from the previous response, after a new yes.

You can pass structured filters in `search_params` instead of `query` (for example `{"job_titles": ["CFO"], "locations": ["New York"]}`). If you pass both, `query` wins.

**Parse the response:** Extract name, title, company, LinkedIn URL and location from each result into a working list.

Step 3: Evaluate Results

Check how many results so far match the target titles at the target company.

**Quality checks:** 1. Filter out results where the company name does not match (fuzzy match is fine -- "EisnerAmper LLP" matches "EisnerAmper") 2. Filter out results where the title does not reasonably match any target title 3. Count remaining high-quality matches

**Decision:**

  • If 3+ quality matches found: skip to Step 6 (Output)
  • If fewer than 3 quality matches: proceed to Step 4

Step 4: Crustdata Structured Search (Fallback 1)

Crustdata's filter search matches company and title more precisely. It charges per page, whatever the page size, so set `limit` to the most results you would use (at most 100).

Quote the price for one page and get the customer's yes. Then use `crustdata_person_search`:

crustdata_person_search(
  conditions: [
    {"column": "current_employers.name", "type": "=", "value": "[company_name]"},
    {"column": "current_employers.title", "type": "(.)", "value": "[title1]|[title2]|[title3]"}
  ],
  filter_op: "and",
  limit: 25
)

`(.)` is a contains / pattern match, so one search can cover several titles joined with `|`. If that finds nothing, run one search per title instead; each is its own paid page, so quote and ask for each. Use `(.)` on the company name too if the exact name finds nothing (e.g. "EisnerAmper LLP").

**Example for Partners and Controllers at EisnerAmper:**

crustdata_person_search(
  conditions: [
    {"column": "current_employers.name", "type": "=", "value": "EisnerAmper"},
    {"column": "current_employers.title", "type": "(.)", "value": "Partner|Controller"}
  ],
  filter_op: "and",
  limit: 25
)

**Senior leaders broadly:** if the user wants senior decision-makers rather than specific titles, match on the title instead of a seniority field:

{"column": "current_employers.title", "type": "(.)", "value": "Chief|VP|Vice President|Director|Head of|Partner"}

For a next page, pass the `cursor` from the previous response, after a new yes.

**After results return:** 1. Merge with all previous results 2. Deduplicate by LinkedIn URL (keep the first occurrence)

**Decision:**

  • If 3+ total unique quality matches: skip to Step 6 (Output)
  • If still fewer than 3: proceed to Step 5

Step 5: PDL Search (Fallback 2, last resort)

PeopleDataLabs costs the most per record of the three. Use it only when the other sources came up short, and ask for only the records still missing.

Quote the price for this number of records an

Read more
@gooseworks-ai
Ships withgoose-skills

Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.

1.3k181 skills
Get the whole plugin

Stars on GitHub

Momentum

stars in total
1.3k
Star history of gooseworks-ai/goose-skills on GitHub, a chart by star-history.com

Other skills on goose-skills.

goose-ads

goose-ads

Edit, resize, animate and study image ads with GooseWorks in this chat. New static or image ads go to the make-static-ads skill…

goose-video

goose-video

Make a video ad in this chat from a real reference ad, found or theirs; styles are the fallback. Follow every answer's next_step.

gooseworks

gooseworks

GooseWorks growth coworker and router for markets, competitors, audiences, creators, campaigns, ads, photos, graphics, video,…

More skills from other plugins.

seo

seo

Comprehensive SEO analysis for any website or business type. Full site audits, single-page analysis, technical SEO (crawlability,…

@agricidaniel@agricidanielInstall Skill
brag

brag

Turn the current project website into a short, polished, shareable launch video using Hyperframes. Use when someone says "/brag",…

brag2w21k
@latent-spaces@latent-spacesInstall Skill
geo-audit

geo-audit

Full website GEO+SEO audit with parallel subagent delegation. Orchestrates a comprehensive Generative Engine Optimization audit…

Questions about company-contact-finder.

Which coding agents can use company-contact-finder?
company-contact-finder installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.