What it does
This skill applies your lead routing rules to a lead and tells you exactly what it did. You give it the rules table (ordered rows with conditions, owner, segment, and SLA) and the lead's known fields, and it returns the owner, the segment, the response SLA, the rule id that fired, the out-of-office backup if the owner is away, and the fields it could not see. It replaces the routing workflow nobody on the team can read anymore, the one with fourteen branches built by someone who left, where a lead going to the wrong rep is discovered three days later by the rep who should have had it.
The bad version of lead routing is a black box. A lead lands with an owner and no explanation, so when it is wrong nobody knows which branch misfired, and when a field is blank the tool silently defaults to whoever is first alphabetically. The good version names the rule that fired on every single lead, refuses to fire a rule on a field it cannot see, and sends unmatched leads to a catch-all with the two rules they nearly matched and the condition that failed. That last part turns the catch-all queue from a dumping ground into the weekly to-do list for improving the table.
It beats the hand-built workflow in three ways. First, the rules are text a human can read in a Project or a repo, reviewed like any other document, not clicks buried in a UI. Second, it handles the messy input: it normalises a US state to a region, a headcount to a band, a German title to a seniority level, and lists each normalisation so you can catch a bad one. Third, it treats the existing-account check as unconditional, which is the single routing mistake that costs the most goodwill, an AE finding out an SDR cold-called their customer.
Where it does not help: it is a router, not an enricher. If the lead arrives with no headcount, the skill will not guess one; the lead falls through the headcount rules and you will see Missing in the output. Pair it with the enrichment agent linked below so the fields exist before routing runs. It also does not write to the CRM by itself; in the agent build, the assignment it returns is what the agent writes to the owner field over MCP.
The lead routing rules table
The skill is only as good as the table you hand it, and most teams have never written theirs down; the rules live in a workflow tool nobody dares open. Copy this table, fill it top to bottom in priority order, and keep R0 and the catch-all exactly where they are. Paste the finished table into the Project once and the skill applies it to every lead from then on.
ROUTING RULES, {{TEAM}} Owner: {{RevOps name}} Last reviewed: {{date}}
Rules apply in order. First match wins. R0 always wins.
R0 Existing account
IF domain matches a CRM company with an owner
-> owner = that account owner segment = Existing SLA = 1 hour
R1 {{Enterprise, region}}
IF headcount >= {{1,000}} AND region = {{NA}} AND title band in {{VP+, C-level}}
-> owner = {{AE name or pool}} segment = Enterprise SLA = {{5 min}}
R2 {{Enterprise, other titles}}
IF headcount >= {{1,000}} AND region = {{NA}}
-> owner = {{SDR pool}} segment = Enterprise SLA = {{15 min}}
R3 {{Mid-market, high intent}}
IF headcount {{250-1,000}} AND source page in {{/pricing, /demo}}
-> owner = {{pool}} segment = Mid-Market SLA = {{5 min}}
R4 {{Mid-market, other}}
IF headcount {{250-1,000}}
-> owner = {{pool}} segment = Mid-Market SLA = {{1 hour}}
R5 {{SMB}}
IF headcount < {{250}} AND ICP tier in {{A, B}}
-> owner = {{pool}} segment = SMB SLA = {{4 hours}}
R6 {{EMEA / other regions}}
IF region = {{EMEA}}
-> owner = {{name}} segment = {{International}} SLA = {{next business day}}
R9 Personal email
IF domain in {{gmail, outlook, yahoo, icloud}}
-> owner = {{SDR inbound pool}} segment = Unqualified inbound SLA = {{4 hours}}
CATCH-ALL
-> owner = {{RevOps queue owner}} segment = Unrouted SLA = next business day
Review weekly: every lead here is a missing rule or a missing field.
POOLS (round-robin, in order)
- {{pool name}}: {{name}}, {{name}}, {{name}}
OUT OF OFFICE
- {{name}} out {{dates}} -> backup {{name}}
FIELD VOCABULARY
- region: NA = US, CA; EMEA = {{...}}; APAC = {{...}}
- headcount bands: <250 / 250-1,000 / 1,000+
- title band: C-level / VP+ / Director / Manager / IC
If two rules could both match the same lead, the earlier one wins and the later one is dead code. The skill will tell you when that happens. Delete the dead rule or move it up; do not leave both.
Inputs & outputs
Inputs
- The routing rules table: ordered rules with conditions, owner or pool, segment, and SLA, plus a catch-all row (required; use the template below)
- The lead's known fields: email, company, headcount, country or state, title, source page, UTM campaign, ICP score or tier, and the existing account owner if the CRM has one (required)
- Optional: the round-robin pointer per pool and the out-of-office roster with backups
- Optional: the current date and time, so SLA deadlines and OOO checks are exact
- Optional: a batch of leads instead of one, for a nightly re-route or a table audit
Outputs
- For each lead: owner, segment, SLA, and the rule id that fired, with the pool pointer used if the owner came from a round-robin
- The normalisations applied (state to region, headcount to band, title to seniority) and every field that was Missing
- An out-of-office line when the owner is away, naming the backup used
- A Catch-all flag on unmatched leads with the two nearest rules and the condition each failed on
- For batches: counts by owner and segment, the catch-all count, and the missing fields ranked by frequency, plus a note on dead or overlapping rules
How to set it up
Write the lead routing rules down first
Before the skill can route anything, the rules have to exist as text. Open whatever tool routes leads today, walk every branch, and transcribe it into the table below in priority order. You will find rules nobody remembers, two rules that can never both fire, and a default nobody chose. Fix the obvious ones while you are there. Keep R0 (existing account) at the top and the catch-all at the bottom; the skill treats R0 as unconditional and the catch-all as the improvement queue.
Decide where the skill lives
Two routes. (1) In claude.ai, create a Project called "Lead Routing", paste the SKILL.md body below into custom instructions, and paste the finished rules table into the Project knowledge. Anyone on the team can then drop a lead into a chat and get the owner and the rule. (2) In Claude Code, save the skill as skills/lead-router/SKILL.md and keep the rules table as routing-rules.md beside it; this is the route to use when a Claude agent is doing the routing inside the inbound flow, because the agent can read both files and write the owner back to the CRM over MCP.
Route one lead and read the rule id, not the owner
Send: "Route this lead" with the fields you have. The first thing to read is the rule that fired, not who got the lead. If the rule is right the owner is right by construction. If the rule surprises you, the table is wrong, and you fix the table rather than overriding one lead. When the output says a field was Missing, that is the enrichment step telling you what it needs to capture; add it to the form or the enrichment pass, not to the router.
Run the catch-all queue weekly and retire dead rules
Once a week, paste the catch-all leads back in as a batch. The summary ranks the missing fields and names the rules each lead nearly matched, which is usually one new rule or one widened band away from zero catch-all. The same run reports rules that can never fire because an earlier rule shadows them; delete those. A routing table that shrinks over time while catch-all trends to zero is the sign the system is working.
The SKILL.md
Save this as SKILL.md in a folder named lead-router, with your rules table beside it as routing-rules.md, or paste both into a Claude Project. Then send a lead.
---
name: lead-router
description: Use when an inbound or scored lead needs an owner and a segment assigned by written rules. Takes the lead's known fields and a routing rules table (ordered rules with conditions, owner, segment, SLA) and returns the owner, segment, the exact rule that fired, the fallback if the owner is out, and the fields that were missing. Applies rules in order, never guesses an owner, and flags every lead that reached the catch-all.
---
# Lead Router
You assign one owner and one segment to a lead by applying the user's routing rules table in order. You are a deterministic rules engine with a voice: the answer is the first rule whose conditions all hold, and you always say which rule that was. You do not improvise owners, territories, or segments that are not in the table.
## Inputs
- The routing rules table (required): ordered rows, each with a rule id, conditions (field, operator, value), owner (person or round-robin pool), segment, response SLA, and optional notes. Plus the catch-all row and the out-of-office roster.
- The lead (required): every field known, e.g. email domain, company, headcount, country or state, title, source page, UTM campaign, ICP score or tier, existing account owner if the CRM has one.
- Optional: the current date and time (for SLA and OOO), the round-robin pointer per pool, and a batch of leads instead of one.
## Method
1. Check the existing-account rule first, regardless of table order. If the lead's domain matches an account with an owner, the owner is that person and the segment is Existing. Say so. This rule is never overridden by a later row.
2. Normalise the lead's fields to the table's vocabulary before matching: country codes to region names, headcount to the table's bands, title to seniority band, free-mail domains to Personal email. List each normalisation you made.
3. Walk the rules in order. A rule fires only when every condition holds on a known field. A condition on a missing field does not hold; record the field as Missing and keep walking.
4. On the first firing rule, stop. Report rule id, owner, segment, SLA. If the owner is a pool, take the next name from the pointer supplied; if no pointer was supplied, name the pool and say a pointer is needed.
5. Resolve out-of-office: if the owner is on the OOO roster for the current date, route to the named backup and say so. If no backup is named, route to the pool lead and flag it.
6. If no rule fires, apply the catch-all and flag the lead as Catch-all with the two rules it came closest to matching and which condition failed. Catch-all leads are the queue for improving the table, not a shrug.
7. For a batch, output one line per lead in the table format, then a summary: count per owner, count per segment, count Catch-all, and the missing fields ranked by frequency.
## Hard rules
- Never invent an owner, territory, or segment not present in the table. If the table is silent, the answer is the catch-all, not a guess.
- Order is law. Do not reorder rules to get a "better" answer; report the conflict instead if two rules seem to overlap.
- Every routing decision names the rule id that fired. A decision without a rule id is invalid.
- Missing fields are reported, not filled. Do not infer headcount from a company name or region from a first name.
- Match on a Missing field never fires. The lead falls through.
## Output template
**Routed: <lead name or email>, <timestamp>**
Normalised: <field: raw -> table value>, ...
Missing: <fields> (or "none")
Rule fired: <rule id>, "<rule name>"
Owner: <person> (<via pool name, pointer n> | direct)
Segment: <segment> SLA: <time>
OOO: <none | owner out until <date>, routed to <backup>>
Flag: <none | Catch-all: closest R<x> failed on <condition>; R<y> failed on <condition>>
Batch summary (when more than one lead)
- By owner: <name n, ...>
- By segment: <segment n, ...>
- Catch-all: <n>; top missing fields: <field n, ...>
Run it from the terminal
Example run
A RevOps lead at a fictional logistics-software company routes an inbound pricing-page demo request and gets the owner plus the rule that fired.
Prompt: lead-router. Rules: (routing table pasted). Lead: priya.n@northwindfreight.com, Northwind Freight, 640 employees, Columbus OH, VP Operations, source /pricing, campaign q3-tms-integrations, ICP tier A, no CRM owner. Now: 2026-09-08 14:02 ET.
Output:
Routed: priya.n@northwindfreight.com, 2026-09-08 14:02 ET
Normalised: country US-OH -> Midwest; headcount 640 -> 250-1,000; title VP Operations -> VP+; source /pricing -> High-intent page
Missing: none
Rule fired: R3, "Mid-market Midwest, VP+, high-intent page"
Owner: Dana Okafor (via pool MM-Midwest, pointer 2)
Segment: Mid-Market SLA: 5 minutes
OOO: none
Flag: none
Related plays
- AI Lead Scoring: Score Your Whole Database with a Claude Agent →The scoring pass that produces the ICP tier this router keys on, and the nightly Routine it runs in.
- Lead Enrichment and Routing with a Claude Agent →The real-time inbound flow; the enrichment step there fills the fields this skill would otherwise report as Missing.
- Reply Fast to an Inbound Lead →What the owner sends inside the SLA once the lead lands.
- Claude + HubSpot integration guide →Reading the existing-account owner and writing the assignment back over MCP.