Build the Champion List
Outcome: one tracked table holding three deduplicated populations, each row carrying the LinkedIn profile URL that detection depends on.
- Surface
- App and MCP server
- Level
- Intermediate
- Uses
- Import · linkedin_profile_enrich
- Credits
- ~1 per champion
- Prerequisite
- CRM access with closed-won and closed-lost history
What to export
Three exports, from data you already have.
Past customers
Closed-won accounts, last three years. Every named contact who used or bought the product — not just the signatory.
Fields: name, email, company, title at the time, close date.
Past champions who lost
Closed-lost opportunities, same period. For each, the one individual who advocated internally — not the whole contact list on the opportunity.
Fields: same, plus the loss reason. The reason matters in lesson 06.
Past evaluators
Demo attendees, trial signups, opportunities that stalled without a decision.
Fields: same, plus what they evaluated and when.
The lost-champion list is usually several times larger than the customer list and converts well enough to justify the same weekly check. Teams that track only past customers leave most of this play’s value unclaimed.
Resolve the profile URL
Detection keys on the LinkedIn profile URL. Without it, a row cannot be checked.
| You have | Route |
|---|---|
| Profile URL already | Normalize it — lowercase, strip query and trailing slash |
| Work email at the old company | find_linkedin_from_work_email |
| Name + old company | Profile lookup by name and company |
| Only a personal email | find_linkedin_from_personal_email |
Expect 60–80% resolution from a work email. Rows that will not resolve cannot be tracked — record them as untrackable rather than leaving them to fail silently every week.
One table, three populations
Do not build three tables. Build one, with a population column.
population past_customer | blocked_champion | past_evaluator
linkedin_url the match key
name, old_company, old_title
relationship_date the close, loss or demo date
loss_reason for blocked champions
tracked true | false — untrackable rows excluded from the weekly runOne table means one weekly check, one dedupe, one cost line. The population column is what routes the message in lesson 06.
Deduplicate across populations
People appear in more than one list — a past evaluator who later became a customer, a champion at two different companies.
- Dedupe on normalized LinkedIn URL, never on name.
- Where someone appears twice, keep the strongest population: customer beats blocked champion beats evaluator.
- Keep the earlier relationship date as context; the strongest relationship is what decides the message.
Enrich the current state once
Before tracking begins, establish the baseline: run linkedin_profile_enrich across the list to capture where everyone is now.
This matters because some of them have already moved, and you will not know which unless you have a baseline. Expect to find movers immediately — those are your first batch of leads, and they justify the enrichment cost on their own.
Do this now
Export the three lists from your CRM
Named individuals, not accounts.
Identify the single advocate per lost opportunity
Not the whole contact list.
Resolve profile URLs
Record unresolvable rows as untrackable.
Merge into one table with a population column
Deduplicate on normalized profile URL
Strongest population wins.
Enrich current state as the baseline
Count the movers you already have
Those are workable today.
Count the trackable population
That number is your weekly detection cost.
Check your work
- One table, three populations, one row per person
- Every tracked row has a normalized LinkedIn URL
- Untrackable rows are flagged rather than silently failing
- Deduplication used profile URL, not name
- You have a baseline of current company and title for everyone
Where this breaks
Exporting every contact on a closed-lost opportunity rather than the one advocate inflates the list with people who never cared — assistants, procurement, someone copied on a thread. They dilute your conversion rate, cost the same to track weekly, and receiving a warm “we worked together” message will confuse them. One named advocate per opportunity, chosen deliberately.
Further automation
Keep the list growing automatically: every new closed-won, closed-lost and completed demo should add its advocate to the tracked table. A champion list built once and never appended is worth less every quarter, and the append is a small CRM sync rather than a project.
Next lesson
03 — Detect the move, running the weekly check across the population you just built.
Reference for this lesson: linkedin_profile_enrich, find_linkedin_from_work_email, CRM integrations, Import.