Track champion job changes
A champion who moves is the warmest pipeline you will ever get — someone who already bought
or used your product, now sitting inside a new account with fresh budget authority and a
honeymoon window in which tooling decisions are open. And every move is TWO plays, not one:
the new company becomes a target (FOLLOW), and the vacated seat at your existing customer
becomes a relationship risk (BACKFILL). Most teams run neither because nobody is watching.
This skill builds the watcher: a scheduled Clay workflow that checks each champion's
current employer, flags real moves, and produces a play-ready digest.
Clay workflows are an Alpha product — say so to the user before building, so they can
calibrate expectations.
Step 0 — Verify Clay is working
Run clay whoami; echo "exit_code=$?". If it fails, or the Clay workflow MCP tools
(read, edit_node, validate_workflow, execute_clay_action) are missing, run the Clay
plugin's setup skill (or follow
https://raw.githubusercontent.com/clay-run/agent-plugins/main/GETTING_STARTED.md), then
restart the agent if setup says to and re-run this skill. Confirm which workspace you are
signed into and tell the user before touching anything.
Step 1 — Collect the inputs (interview the user; do not guess)
- The champion list. Where do champions live today? A CRM export (CSV), an existing Clay
table, or a Clay Audience segment. Minimum viable row: name + LinkedIn URL + the account
(domain) you know them from. If there's no LinkedIn URL, ask for email instead — the
workflow will resolve it. If champions aren't in an Audience yet, help the user get the
list into one — an Audience segment is what lets the workflow re-check everyone on a
schedule.
- What counts as a champion. Past buyer? Power user? Deal contact on closed-won?
This defines the list; don't expand it silently.
- The ICP filter for the FOLLOW play. Industry, size, region — a mover whose new company
is outside ICP gets logged, not pursued.
- Cadence. Weekly is the sensible default; monthly for lists under ~200.
- Where the digest goes. A summary table the user reads, a CSV, or a Slack/webhook
destination the user owns.
Step 2 — Plan the workflow and get approval
Present this plan, mapped to the user's inputs, and wait for approval before building
(follow the workflows skill's build protocol throughout):
TRIGGER: audience-scheduled over the "Champions" segment (weekly tick)
+ a manual trigger for testing
1. [tool] Resolve current employment. Resolution order matters:
(a) LinkedIn URL on file → person enrichment (cpj-enrich-person);
(b) no URL → people-index search by name + last-known company;
(c) reverse email→LinkedIn lookup LAST (weakest coverage; fails often).
→ current employer name, domain, title, current-role start date
2. [code] Extract + compare, deterministically — never an LLM. Pin the tool
node's whole $.result (deep paths fail the run when empty), find the
is_current experience entry, normalize both domains, and emit flat
string fields: verdict (current / moved / unverified), evidence with
dates, new-company domain/name/title/start. Use non-empty sentinels
("none") — a pinned value that resolves empty fails the run.
3. [conditional] Rules mode, routing on the verdict string (rules cannot compare two
dynamic fields — that is why the code node computes the verdict).
→ current: deterministic digest leaf (code node), end
→ unverified: "could not verify" digest leaf (code node), end
→ moved: continue. Genuinely ambiguous cases (rebrand/acquisition
suspicion) belong in the digest flagged for human review.
4a. FOLLOW branch (real move):
[tool] Enrich the NEW company (industry, headcount, region)
[conditional] ICP gate — outside ICP: log "moved, out of ICP" and end THIS
branch only. 4b still runs and still reaches the digest: the
champion leaving is what vacates the seat, and that is true
whether or not their new employer is worth chasing.
[agent] Compose the play: champion-arrival note anchored on the shared
history (which product, which account, when), plus 2-3 suggested
buying-committee titles to source at the new account
4b. BACKFILL branch (real move, runs in parallel — never gated on the new
employer's ICP fit):
[tool] Find people at the OLD account matching the vacated title/persona
[agent] Pick the most likely successor + note why; flag "seat vacated"
5. [leaf] Append one digest row per champion: verdict, evidence, plays
Build node-by-node with edit_node, confirm every action's real shape with
execute_clay_action before wiring it, run validate_workflow with prettier, and show the
user the graph. Where more than one Clay action can do a step (several person-enrichment or
people-finding functions usually exist), list the options by human-readable name with costs
and let the user choose.
Build gotchas verified against the Alpha at time of writing — re-verify node shapes with
execute_clay_action before trusting them:
- Code nodes are
def handler(context): returning a dict; read inputs with
context.get_input("name"). Top-level return is a syntax error.
- Pin inputs via the flat
inputSchema shorthand ({"x": {"type":"string","sourceNodeId": "wfn_...","sourcePath":"$.field"}}). Pins that resolve to undefined OR empty string fail
the whole run — pin container objects, not deep paths, and emit sentinels.
- Prompt
{{vars}} on agent nodes fill reliably from flat string/object pins; a raw array
pin can leave the model claiming it got nothing. Flatten arrays in a code node first.
- Tool-node parameters wire via
tools[].inputMappingConfig references, and the referenced
value must ALSO be pinned on that tool node's inputSchema when it comes from 2+ hops back.
- Keep agents on a cheap model while wiring, then graduate only the nodes that write prose;
comparisons and routing stay in code — an LLM asked to compare domains may wander off to
the web instead.
Step 3 — Test small, then scale
- Run 3–5 champions through with
clay workflows runs test — include at least one you
know has NOT moved (the no-change path must terminate cheaply) and, if possible, one
known mover.
- Walk the user through each run's path. Fix, re-test.
- Before the first full run: estimate cost (roughly 1–3 credits per champion per check —
verify against the actual actions chosen with
execute_clay_action / clay credits),
state the total, and get explicit approval.
- Publishing the draft as live automation is the user's click in the editor — prompt them,
don't attempt it yourself.
What good looks like
- Join and compare on domains, never company-name strings. Names differ across sources
("Initech Ltd" vs "Initech"); domains don't. If the enriched employer has no domain,
validate one before deciding anything.
- A move verdict must trace to evidence in the enrichment payload — quote the old and
new employer with dates in the digest. Never infer a move from a name mismatch alone, and
never fabricate a change to have something to report. Empty or errored enrichment = "could
not verify", not "no change" and not "moved" — and watch for the sneaky version: an
enrichment can return status SUCCESS with an empty payload. Gate on the presence of an
actual employer value, never on the run status.
- Use the current-role start date. A mover who started < 12 months ago is in the
honeymoon window — tooling decisions are open. Rank the FOLLOW digest by recency.
- Both plays evaluated for every real move. A digest that only follows movers and never
flags vacated seats is half the value. The out-of-ICP exit in 4a ends the FOLLOW branch,
not the run — an out-of-ICP mover still produces a vacated-seat row.
- The FOLLOW note leans on the shared history — which product, at which account, roughly
when. "Congrats on the new role" with no history is generic outbound wearing a costume.
- The common mistake: treating every domain mismatch as a move. Acquisitions and rebrands
produce mismatches constantly; the verdict step exists because of them.
Rules
- MUST get explicit user approval before the first full run, any CRM write, and any
publish/schedule — and NEVER send outreach automatically; the digest ends at play-ready.
- MUST re-check credits before scaling a run to the full list.
- NEVER drop a champion silently: every input row lands in the digest as verified-current,
moved (with plays), out-of-ICP, or could-not-verify.
Output
Per scheduled run, one digest with a row per champion:
champion · old account · verdict (current / moved / could-not-verify) · evidence · new company · new title · ICP fit · FOLLOW note draft · suggested committee titles · BACKFILL successor · seat-vacated flag
plus a summary line: champions checked, moves found, plays generated, rows needing human review.
Worked example
Input: 120 champions in an Audience segment "Champions — Closed Won", weekly cadence,
ICP = B2B software 100–5,000 employees, digest to a summary table.
First test run of 5: 4 verified current, 1 real move — Jordan Lee, former Head of RevOps at
longtime customer acme.com, now VP RevOps at northfield.io (2,300-person B2B software firm,
in ICP). Digest row: verdict MOVED with LinkedIn evidence; FOLLOW note referencing the
three years Jordan ran your product at Acme; suggested committee: CFO, Director of Sales Ops;
BACKFILL: Priya Shah, current Director of RevOps at Acme, flagged as likely successor;
seat-vacated alert on the Acme account. Weekly cost at 120 champions ≈ 150–350 credits;
user approved before the first full run.
1---2name: track-champion-job-changes3description: Use this skill when someone wants to track job changes for champions, get alerted when a champion or past buyer moves companies, follow champions to their new company, detect when a key contact leaves a customer account, turn customer alumni into pipeline, or monitor buying contacts for role changes. Builds a recurring Clay workflow that watches your champions — past buyers, power users, and key contacts at existing customers — and tells you the moment one changes jobs, then turns each move into two plays: FOLLOW the mover into their new company (your warmest possible outbound) and BACKFILL the seat they left (protect the existing account). Requires the Clay CLI + agent plugin (workflow tools). Do NOT use for general CRM contact cleanup or re-verifying a whole list's emails and titles (that is a contact-refresh job), or for sourcing net-new prospects by persona (people search). It sends nothing and writes nothing to your CRM without explicit approval.4---56# Track champion job changes78A champion who moves is the warmest pipeline you will ever get — someone who already bought9or used your product, now sitting inside a new account with fresh budget authority and a10honeymoon window in which tooling decisions are open. And every move is TWO plays, not one:11the new company becomes a target (FOLLOW), and the vacated seat at your existing customer12becomes a relationship risk (BACKFILL). Most teams run neither because nobody is watching.13This skill builds the watcher: a scheduled Clay **workflow** that checks each champion's14current employer, flags real moves, and produces a play-ready digest.1516Clay workflows are an **Alpha** product — say so to the user before building, so they can17calibrate expectations.1819## Step 0 — Verify Clay is working2021Run `clay whoami; echo "exit_code=$?"`. If it fails, or the Clay workflow MCP tools22(`read`, `edit_node`, `validate_workflow`, `execute_clay_action`) are missing, run the Clay23plugin's `setup` skill (or follow24https://raw.githubusercontent.com/clay-run/agent-plugins/main/GETTING_STARTED.md), then25restart the agent if setup says to and re-run this skill. Confirm which workspace you are26signed into and tell the user before touching anything.2728## Step 1 — Collect the inputs (interview the user; do not guess)29301. **The champion list.** Where do champions live today? A CRM export (CSV), an existing Clay31 table, or a Clay Audience segment. Minimum viable row: name + LinkedIn URL + the account32 (domain) you know them from. If there's no LinkedIn URL, ask for email instead — the33 workflow will resolve it. If champions aren't in an Audience yet, help the user get the34 list into one — an Audience segment is what lets the workflow re-check everyone on a35 schedule.362. **What counts as a champion.** Past buyer? Power user? Deal contact on closed-won?37 This defines the list; don't expand it silently.383. **The ICP filter for the FOLLOW play.** Industry, size, region — a mover whose new company39 is outside ICP gets logged, not pursued.404. **Cadence.** Weekly is the sensible default; monthly for lists under ~200.415. **Where the digest goes.** A summary table the user reads, a CSV, or a Slack/webhook42 destination the user owns.4344## Step 2 — Plan the workflow and get approval4546Present this plan, mapped to the user's inputs, and wait for approval before building47(follow the `workflows` skill's build protocol throughout):4849```50TRIGGER: audience-scheduled over the "Champions" segment (weekly tick)51 + a manual trigger for testing52 1. [tool] Resolve current employment. Resolution order matters:53 (a) LinkedIn URL on file → person enrichment (cpj-enrich-person);54 (b) no URL → people-index search by name + last-known company;55 (c) reverse email→LinkedIn lookup LAST (weakest coverage; fails often).56 → current employer name, domain, title, current-role start date57 2. [code] Extract + compare, deterministically — never an LLM. Pin the tool58 node's whole $.result (deep paths fail the run when empty), find the59 is_current experience entry, normalize both domains, and emit flat60 string fields: verdict (current / moved / unverified), evidence with61 dates, new-company domain/name/title/start. Use non-empty sentinels62 ("none") — a pinned value that resolves empty fails the run.63 3. [conditional] Rules mode, routing on the verdict string (rules cannot compare two64 dynamic fields — that is why the code node computes the verdict).65 → current: deterministic digest leaf (code node), end66 → unverified: "could not verify" digest leaf (code node), end67 → moved: continue. Genuinely ambiguous cases (rebrand/acquisition68 suspicion) belong in the digest flagged for human review.69 4a. FOLLOW branch (real move):70 [tool] Enrich the NEW company (industry, headcount, region)71 [conditional] ICP gate — outside ICP: log "moved, out of ICP" and end THIS72 branch only. 4b still runs and still reaches the digest: the73 champion leaving is what vacates the seat, and that is true74 whether or not their new employer is worth chasing.75 [agent] Compose the play: champion-arrival note anchored on the shared76 history (which product, which account, when), plus 2-3 suggested77 buying-committee titles to source at the new account78 4b. BACKFILL branch (real move, runs in parallel — never gated on the new79 employer's ICP fit):80 [tool] Find people at the OLD account matching the vacated title/persona81 [agent] Pick the most likely successor + note why; flag "seat vacated"82 5. [leaf] Append one digest row per champion: verdict, evidence, plays83```8485Build node-by-node with `edit_node`, confirm every action's real shape with86`execute_clay_action` before wiring it, run `validate_workflow` with prettier, and show the87user the graph. Where more than one Clay action can do a step (several person-enrichment or88people-finding functions usually exist), list the options by human-readable name with costs89and let the user choose.9091Build gotchas verified against the Alpha at time of writing — re-verify node shapes with92`execute_clay_action` before trusting them:93- Code nodes are `def handler(context):` returning a dict; read inputs with94 `context.get_input("name")`. Top-level `return` is a syntax error.95- Pin inputs via the flat `inputSchema` shorthand (`{"x": {"type":"string","sourceNodeId":96 "wfn_...","sourcePath":"$.field"}}`). Pins that resolve to undefined OR empty string fail97 the whole run — pin container objects, not deep paths, and emit sentinels.98- Prompt `{{vars}}` on agent nodes fill reliably from flat string/object pins; a raw array99 pin can leave the model claiming it got nothing. Flatten arrays in a code node first.100- Tool-node parameters wire via `tools[].inputMappingConfig` references, and the referenced101 value must ALSO be pinned on that tool node's `inputSchema` when it comes from 2+ hops back.102- Keep agents on a cheap model while wiring, then graduate only the nodes that write prose;103 comparisons and routing stay in code — an LLM asked to compare domains may wander off to104 the web instead.105106## Step 3 — Test small, then scale1071081. Run 3–5 champions through with `clay workflows runs test` — include at least one you109 know has NOT moved (the no-change path must terminate cheaply) and, if possible, one110 known mover.1112. Walk the user through each run's path. Fix, re-test.1123. Before the first full run: estimate cost (roughly 1–3 credits per champion per check —113 verify against the actual actions chosen with `execute_clay_action` / `clay credits`),114 state the total, and get explicit approval.1154. Publishing the draft as live automation is the user's click in the editor — prompt them,116 don't attempt it yourself.117118## What good looks like119120- **Join and compare on domains, never company-name strings.** Names differ across sources121 ("Initech Ltd" vs "Initech"); domains don't. If the enriched employer has no domain,122 validate one before deciding anything.123- **A move verdict must trace to evidence in the enrichment payload** — quote the old and124 new employer with dates in the digest. Never infer a move from a name mismatch alone, and125 never fabricate a change to have something to report. Empty or errored enrichment = "could126 not verify", not "no change" and not "moved" — and watch for the sneaky version: an127 enrichment can return status SUCCESS with an empty payload. Gate on the presence of an128 actual employer value, never on the run status.129- **Use the current-role start date.** A mover who started < 12 months ago is in the130 honeymoon window — tooling decisions are open. Rank the FOLLOW digest by recency.131- **Both plays evaluated for every real move.** A digest that only follows movers and never132 flags vacated seats is half the value. The out-of-ICP exit in 4a ends the FOLLOW branch,133 not the run — an out-of-ICP mover still produces a vacated-seat row.134- **The FOLLOW note leans on the shared history** — which product, at which account, roughly135 when. "Congrats on the new role" with no history is generic outbound wearing a costume.136- The common mistake: treating every domain mismatch as a move. Acquisitions and rebrands137 produce mismatches constantly; the verdict step exists because of them.138139## Rules140141- MUST get explicit user approval before the first full run, any CRM write, and any142 publish/schedule — and NEVER send outreach automatically; the digest ends at play-ready.143- MUST re-check credits before scaling a run to the full list.144- NEVER drop a champion silently: every input row lands in the digest as verified-current,145 moved (with plays), out-of-ICP, or could-not-verify.146147## Output148149Per scheduled run, one digest with a row per champion:150`champion · old account · verdict (current / moved / could-not-verify) · evidence · new company ·151new title · ICP fit · FOLLOW note draft · suggested committee titles · BACKFILL successor ·152seat-vacated flag`153plus a summary line: champions checked, moves found, plays generated, rows needing human review.154155## Worked example156157Input: 120 champions in an Audience segment "Champions — Closed Won", weekly cadence,158ICP = B2B software 100–5,000 employees, digest to a summary table.159First test run of 5: 4 verified current, 1 real move — Jordan Lee, former Head of RevOps at160longtime customer acme.com, now VP RevOps at northfield.io (2,300-person B2B software firm,161in ICP). Digest row: verdict MOVED with LinkedIn evidence; FOLLOW note referencing the162three years Jordan ran your product at Acme; suggested committee: CFO, Director of Sales Ops;163BACKFILL: Priya Shah, current Director of RevOps at Acme, flagged as likely successor;164seat-vacated alert on the Acme account. Weekly cost at 120 champions ≈ 150–350 credits;165user approved before the first full run.