Champion tracker
Track product champions for job changes and qualify their new companies against ICP.
How to use it
- Hit Copy SKILL.md — or use the Claude Code line below to get every file.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/sales/capabilities/champion-tracker#main ~/.claude/skills/champion-trackerFor one project only, change the path to .claude/skills/champion-tracker. This skill also uses champion_tracker.py, baseline.json — copying SKILL.md alone won't be enough. See the folder on GitHub.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text126 lines
Champion Tracker
Detect when product champions change jobs and qualify their new companies against ICP.
When to Use
- You have a list of known product users/champions (from reviews, LinkedIn posts, CRM exports)
- You want to detect when they change companies (high-intent re-sell signal)
- You want each job change scored against ICP before reaching out
Two Phases
Phase A: Discover Champions (agent-driven, one-time)
Build the initial champion list from public sources. This is done by the agent, not the script.
- Scrape reviews — Use
review-site-scraperskill to pull G2/Trustpilot reviews. Extract reviewer names + companies. - Search LinkedIn posts — Use the
linkedin-post-researchskill (Apify-based) to find people who posted about the product. - Resolve LinkedIn URLs — Use Fiber
/v1/kitchen-sink/person(name + company → profile URL) or ContactOut via Orthogonal. - Compile CSV — Merge all sources into
champions.csvwith required columns.
Phase B: Track Job Changes (script-driven, repeatable)
Use champion_tracker.py for ongoing tracking.
Script Usage
Prerequisites
APIFY_API_TOKENin.env(for LinkedIn profile enrichment)- Champion CSV with columns:
name,linkedin_url(required);original_company,original_title,email,source,notes(optional)
Commands
Initialize baseline (first run):
# Dry run — see cost estimate
python3 skills/champion-tracker/scripts/champion_tracker.py init -i champions.csv --dry-run
# Create baseline
python3 skills/champion-tracker/scripts/champion_tracker.py init -i champions.csv
Check for job changes (subsequent runs):
# Dry run
python3 skills/champion-tracker/scripts/champion_tracker.py check --dry-run
# Detect changes and output CSV
python3 skills/champion-tracker/scripts/champion_tracker.py check -o changes.csv
View status:
python3 skills/champion-tracker/scripts/champion_tracker.py status
Output CSV Columns
| Column | Description |
|---|---|
| champion_name | Full name |
| linkedin_url | LinkedIn profile URL |
| previous_company | Company at baseline |
| previous_title | Title at baseline |
| new_company | Current company (changed) |
| new_title | Current title |
| change_detected_date | Date this check was run |
| position_start_date | When they started the new role |
| days_since_change | Days since new position started |
| icp_score | 0-4 ICP qualification score |
| icp_verdict | Strong Fit / Good Fit / Possible Fit / Weak Fit |
| icp_notes | Scoring breakdown |
| Email if available | |
| notes | Original notes from champion CSV |
ICP Scoring (0-4)
| Signal | Points | What it checks |
|---|---|---|
| B2B signal | 1.0 | Title contains sales/SDR/revenue/growth keywords |
| Outbound motion | 1.0 | Sales leadership title (VP Sales, Head of Growth, etc.) |
| Company size | 1.0 / 0.5 | SMB/mid-market = 1.0; unknown = 0.5 benefit-of-doubt |
| Seniority | 1.0 | VP, Director, Head of, C-level, Founder |
Verdicts: Strong Fit (>=3) / Good Fit (>=2) / Possible Fit (>=1.5) / Weak Fit (<1.5)
Cost
- ~$3 per 1,000 LinkedIn profiles enriched
- 50-80 champions ≈ $0.15-0.25 per run
--dry-runalways shows cost before any API calls
File Structure
skills/champion-tracker/
SKILL.md # This file
scripts/
champion_tracker.py # Main CLI script
input/
champions_template.csv # Template for manual additions
snapshots/ # Created at runtime
baseline.json # Latest full snapshot
archive/ # Timestamped copies
output/ # Created at runtime
changes-YYYY-MM-DD.csv # Generated output
Dependencies
- Reuses
LinkedInEnricherfromskills/lead-qualification/scripts/enrich_leads.py - Falls back to inline implementation if import fails
- Requires:
requests(Python package),APIFY_API_TOKEN(env var)
| 1 | |
| 2 | name champion-tracker |
| 3 | description > |
| 4 | Track product champions for job changes and qualify their new companies against ICP. |
| 5 | Takes a CSV of known champions (with LinkedIn URLs), creates a baseline snapshot via |
| 6 | Apify enrichment, then detects when champions move to new companies. Scores new |
| 7 | companies on a 0-4 ICP fit scale. Outputs a downloadable CSV of movers with |
| 8 | qualification verdicts. |
| 9 | tags [lead-generation] |
| 10 | |
| 11 | |
| 12 | # Champion Tracker |
| 13 | |
| 14 | Detect when product champions change jobs and qualify their new companies against ICP. |
| 15 | |
| 16 | ## When to Use |
| 17 | |
| 18 | You have a list of known product users/champions (from reviews, LinkedIn posts, CRM exports) |
| 19 | You want to detect when they change companies (high-intent re-sell signal) |
| 20 | You want each job change scored against ICP before reaching out |
| 21 | |
| 22 | ## Two Phases |
| 23 | |
| 24 | ### Phase A: Discover Champions (agent-driven, one-time) |
| 25 | |
| 26 | Build the initial champion list from public sources. This is done by the agent, not the script. |
| 27 | |
| 28 | **Scrape reviews** — Use `review-site-scraper` skill to pull G2/Trustpilot reviews. Extract reviewer names + companies. |
| 29 | **Search LinkedIn posts** — Use the `linkedin-post-research` skill (Apify-based) to find people who posted about the product. |
| 30 | **Resolve LinkedIn URLs** — Use Fiber `/v1/kitchen-sink/person` (name + company → profile URL) or ContactOut via Orthogonal. |
| 31 | **Compile CSV** — Merge all sources into `champions.csv` with required columns. |
| 32 | |
| 33 | ### Phase B: Track Job Changes (script-driven, repeatable) |
| 34 | |
| 35 | Use `champion_tracker.py` for ongoing tracking. |
| 36 | |
| 37 | ## Script Usage |
| 38 | |
| 39 | ### Prerequisites |
| 40 | |
| 41 | `APIFY_API_TOKEN` in `.env` (for LinkedIn profile enrichment) |
| 42 | Champion CSV with columns: `name`, `linkedin_url` (required); `original_company`, `original_title`, `email`, `source`, `notes` (optional) |
| 43 | |
| 44 | ### Commands |
| 45 | |
| 46 | **Initialize baseline** (first run): |
| 47 | |
| 48 | # Dry run — see cost estimate |
| 49 | python3 skills/champion-tracker/scripts/champion_tracker.py init -i champions.csv --dry-run |
| 50 | |
| 51 | # Create baseline |
| 52 | python3 skills/champion-tracker/scripts/champion_tracker.py init -i champions.csv |
| 53 | |
| 54 | |
| 55 | **Check for job changes** (subsequent runs): |
| 56 | |
| 57 | # Dry run |
| 58 | python3 skills/champion-tracker/scripts/champion_tracker.py check --dry-run |
| 59 | |
| 60 | # Detect changes and output CSV |
| 61 | python3 skills/champion-tracker/scripts/champion_tracker.py check -o changes.csv |
| 62 | |
| 63 | |
| 64 | **View status**: |
| 65 | |
| 66 | python3 skills/champion-tracker/scripts/champion_tracker.py status |
| 67 | |
| 68 | |
| 69 | ## Output CSV Columns |
| 70 | |
| 71 | | Column | Description | |
| 72 | |--------|-------------| |
| 73 | | champion_name | Full name | |
| 74 | | linkedin_url | LinkedIn profile URL | |
| 75 | | previous_company | Company at baseline | |
| 76 | | previous_title | Title at baseline | |
| 77 | | new_company | Current company (changed) | |
| 78 | | new_title | Current title | |
| 79 | | change_detected_date | Date this check was run | |
| 80 | | position_start_date | When they started the new role | |
| 81 | | days_since_change | Days since new position started | |
| 82 | | icp_score | 0-4 ICP qualification score | |
| 83 | | icp_verdict | Strong Fit / Good Fit / Possible Fit / Weak Fit | |
| 84 | | icp_notes | Scoring breakdown | |
| 85 | | email | Email if available | |
| 86 | | notes | Original notes from champion CSV | |
| 87 | |
| 88 | ## ICP Scoring (0-4) |
| 89 | |
| 90 | | Signal | Points | What it checks | |
| 91 | |--------|--------|----------------| |
| 92 | | B2B signal | 1.0 | Title contains sales/SDR/revenue/growth keywords | |
| 93 | | Outbound motion | 1.0 | Sales leadership title (VP Sales, Head of Growth, etc.) | |
| 94 | | Company size | 1.0 / 0.5 | SMB/mid-market = 1.0; unknown = 0.5 benefit-of-doubt | |
| 95 | | Seniority | 1.0 | VP, Director, Head of, C-level, Founder | |
| 96 | |
| 97 | **Verdicts**: Strong Fit (>=3) / Good Fit (>=2) / Possible Fit (>=1.5) / Weak Fit (<1.5) |
| 98 | |
| 99 | ## Cost |
| 100 | |
| 101 | ~$3 per 1,000 LinkedIn profiles enriched |
| 102 | 50-80 champions ≈ $0.15-0.25 per run |
| 103 | `--dry-run` always shows cost before any API calls |
| 104 | |
| 105 | ## File Structure |
| 106 | |
| 107 | |
| 108 | skills/champion-tracker/ |
| 109 | SKILL.md # This file |
| 110 | scripts/ |
| 111 | champion_tracker.py # Main CLI script |
| 112 | input/ |
| 113 | champions_template.csv # Template for manual additions |
| 114 | snapshots/ # Created at runtime |
| 115 | baseline.json # Latest full snapshot |
| 116 | archive/ # Timestamped copies |
| 117 | output/ # Created at runtime |
| 118 | changes-YYYY-MM-DD.csv # Generated output |
| 119 | |
| 120 | |
| 121 | ## Dependencies |
| 122 | |
| 123 | Reuses `LinkedInEnricher` from `skills/lead-qualification/scripts/enrich_leads.py` |
| 124 | Falls back to inline implementation if import fails |
| 125 | Requires: `requests` (Python package), `APIFY_API_TOKEN` (env var) |
| 126 |
Discussion
Alternatives
Also in Lead listsBuild a system for handling sales leadsTell us how leads reach your team today and you get back a written playbook for scoring, routing, and following up on every lead fast.Linkedin engager analyticsPull the people who liked or commented on any LinkedIn post and segment them by ICP fit (peer / aspirational / prospect / other). Produces an engager roster, tier breakdown, and outbound action lists (follow back, comment-drop, DM-able with one-line openers). Powered by Apify, no LinkedIn login. Triggers on "who liked my post", "who engaged", "engagers report", "audience analytics". Not for tracking author replies to your comments (use linkedin-thread-monitor).Event prospecting pipelineFind attendees at conferences/events, research their companies, qualify against ICP, and launch outreachGet Qualified Leads from Luma EventsEnd-to-end lead prospecting from Luma events. Searches Luma for events by topic and location, extracts all attendees/hosts, qualifies them against a qualification prompt, outputs results to a Google Sheet, and sends a Slack alert with top leads. Use this skill whenever someone wants to find qualified leads from events, prospect event attendees, or run an event-based lead gen workflow. Also triggers for "find people at events and qualify them" or who's attending X events that matches our ICP.