返回 Skills
anthropics/knowledge-work-plugins· Apache-2.0 内容可用

lead-triage

Scores inbound HubSpot leads by engagement signals, company fit, and urgency markers to produce a "call these 5 today" list with talking points, drafts the follow-ups, and blocks Calendar time. Use when the user asks to prioritize leads, who to call first, or about their pipeline.

安装

与 skills.sh 相同的 Command / Prompt 安装方式


name: lead-triage version: 0.1.1 description: > Scores inbound HubSpot leads by engagement signals, company fit, and urgency markers to produce a "call these 5 today" list with talking points, drafts the follow-ups, and blocks Calendar time. Use when the user asks to prioritize leads, who to call first, or about their pipeline.

Lead Triage

Quick start

Pull inbound leads from HubSpot, score them, and surface a ranked call list with talking points. Drafts follow-ups and proposes calendar slots — never sends or books without owner approval.

User: "prioritize my leads"
→ Pull contacts: lifecycle stage Lead or MQL, status ≠ Unqualified
→ Score each across engagement, company fit, urgency, recency
→ Return ranked list (size adapts to volume) with talking points
→ Offer to draft follow-ups and propose calendar slots

Workflow

  1. Pull leads from HubSpot. Fetch contacts with lifecyclestage = Lead or MQL and hs_lead_statusUnqualified. Use the field list in reference/hubspot-scoring.md. If HubSpot is unavailable, stop: "HubSpot is disconnected — connect it and try again."

  2. Clarify if trigger is ambiguous. If the user said only "pipeline" without a qualifier, ask: "Quick pipeline overview (deal stages + total value) or prioritized call list?" — then route accordingly. Do not score leads on a bare "pipeline."

  3. Score each lead. Apply the four-dimension model in reference/hubspot-scoring.md:

    • Engagement — email replies, opens, site visits in HubSpot (last 30 days only)
    • Company fit — industry and employee count vs. owner's ICP (default: any industry, 1–50 employees)
    • Urgency — lead age, stage duration, notes containing "urgent / ASAP / deadline / budget approved"
    • Recency penalty — subtract points if last activity was <24 hours ago (already touched today)
  4. Build the ranked list. Sort descending by composite score. Adapt list size to volume:

    • ≤10 leads → show all
    • 11–30 leads → show top 5
    • 30 leads → show top 8

    For each lead: name, company, score, one-paragraph talking point, last activity summary. If engagement signals are all >30 days old, flag: "Engagement signals are stale — approach as cold outreach."

  5. Offer follow-up drafts. Ask: "Draft follow-ups for any of these?" If yes, write one email per selected lead, matching the tone of their last outbound thread in Mail. Show draft; do not send.

  6. Offer calendar slots. Ask: "Propose call slots for any of these?" If yes, check Calendar for open 30-minute windows in the next two business days (avoid slots with existing events ±15 min). Propose two options per lead. Do not create events — the owner books.

Approval gates

  • Never send an email. Draft only; owner sends from their inbox.
  • Never create calendar events. Propose times; owner books.
  • Never change lifecycle stage or mark a lead Unqualified unless the owner explicitly asks.
  • Never include Customer or Evangelist lifecycle contacts in the lead list.
  • If zero leads match the filter, explain why and offer to check what lifecycle stages are in use — do not fabricate a list.

Reference

附带文件

reference/examples/happy-path-triage.md
# Example: Happy-path triage — 7-lead list

7 leads → show all (≤10 rule). Owner ICP: SaaS, 10–50 employees.

---

## Ranked output

```
Here are your 7 leads, ranked by priority:

─────────────────────────────────────
1. Sarah Chen · Acme SaaS · Score: 78
   Last activity: 2 days ago (email reply)
   Sarah replied asking about API limits — evaluating for a 22-person team.
   Strong ICP fit. Lead is 12 days old (prime window). Open with her API
   question; offer a 20-min demo to walk through limits live.

2. Marcus Webb · Loop Analytics · Score: 64
   Last activity: 5 days ago (site visit)
   Visited pricing page twice this week, no reply to outreach. 31 employees,
   SaaS — good fit. Try a softer touch: share a case study instead of another
   demo ask.

3. Priya Nair · BuildFast · Score: 51
   Last activity: 9 days ago (email open)
   Opened the intro email, no reply. 18 days old — approaching stale. One
   more value-add touch (ROI one-pager) before deprioritizing.

[4–7 follow same format, scores 30–45]
─────────────────────────────────────

Draft follow-ups for any of these? (e.g., "draft for 1 and 2")
Propose call slots? (e.g., "find times for Sarah and Marcus")
```

---

## Follow-up draft — Sarah Chen

```
Subject: Re: API limits question

Hi Sarah,

Happy to answer the API limits question properly on a short call rather
than over email.

[Owner adds availability after booking]

Would that work?

[Owner name]
```
Draft shown. Not sent.

---

## Calendar proposal — Sarah Chen

```
Open 30-min slots (next 2 business days):
  • Thu Apr 25 · 10:00–10:30 AM
  • Thu Apr 25 · 2:00–2:30 PM
  • Fri Apr 26 · 9:00–9:30 AM

No events created — pick one and book it directly.
```
reference/gotchas.md
# Gotchas — lead-triage

---

## Gotcha: "Pipeline" bare trigger runs full scoring when user just wants a status check

**Why it matters:** "Pipeline" alone is ambiguous — the owner may want deal-stage totals, not a scored call list.

### ✗ Bad
```
User: "how's my pipeline?"
Claude: [runs full scoring, returns 12-lead ranked list]
```

### ✓ Good
```
User: "how's my pipeline?"
Claude: "Quick pipeline overview (deal stages + total value) or prioritized
         call list for today?"
```

---

## Gotcha: Stale engagement data inflates scores

**Why it matters:** `hs_email_open` is cumulative — opens from a year-old campaign make a cold lead look hot.

### ✗ Bad
```
Lead has 20 opens (all 11 months ago). Scores 25/25 on engagement.
Appears as #1. Owner calls; lead has no memory of the brand.
```

### ✓ Good
```
Cap engagement signals at 30 days. If all signals are older than 30 days,
engagement score = 0 and talking point notes:
"Engagement signals are stale (last: [date]) — approach as cold outreach."
```

---

## Gotcha: Customers appear in the lead list

**Why it matters:** Calling a `Customer` or `Evangelist` as a lead prospect is embarrassing.

### ✗ Bad
```
Lifecycle filter not applied → existing customer appears as #2 on the list.
```

### ✓ Good
```
Filter strictly: lifecyclestage = Lead or MQL only.
If a contact has a blank lifecycle stage, include with a warning flag:
"⚠ Lifecycle stage not set — confirm this is a lead before calling."
```

---

## Gotcha: Proposing calendar slots that conflict with existing events

**Why it matters:** Proposing a time the owner is already booked erodes trust immediately.

### ✗ Bad
```
Claude proposes "Tuesday 2–2:30 PM" without checking Calendar.
Owner already has a client call in that slot.
```

### ✓ Good
```
Fetch Calendar for next two business days before proposing any slot.
Only propose windows with no existing events ±15 minutes buffer.
If no free window exists, say so and offer to look further out.
```
reference/hubspot-scoring.md
# HubSpot Scoring — lead-triage

Field names, scoring weights, and ICP defaults.

---

## Fields to pull

| HubSpot field | Used for |
|---|---|
| `firstname`, `lastname` | Display |
| `company` | Display + ICP match |
| `email` | Follow-up draft recipient |
| `lifecyclestage` | Filter (keep Lead, MQL) |
| `hs_lead_status` | Filter (exclude Unqualified) |
| `industry` | Company fit |
| `numemployees` | Company fit — employee count on contact record. Often null; if null, treat as unknown and score accordingly. |
| `createdate` | Urgency — lead age |
| `hs_last_activity_date` | Recency penalty |
| `notes_last_updated` | Urgency — note recency |
| `hs_sales_email_last_replied` | Engagement — reply signal |
| `hs_email_open` | Engagement — open count (use only if within 30 days) |
| `hs_analytics_last_visit_timestamp` | Engagement — site visit |
| `num_contacted_notes` | Engagement — outreach volume |

---

## Scoring model (0–100 composite)

Four dimensions, each 0–25. Sum for composite.

### Engagement (0–25)
Only count signals from the last 30 days. Older signals score 0.

| Signal | Points |
|---|---|
| Email reply in last 14 days | +15 |
| Email open in last 7 days (no reply) | +8 |
| Site visit in last 7 days | +5 |
| >3 outreach attempts, no reply | −5 |

### Company fit (0–25)
Default ICP if owner hasn't stated one: any industry, 1–50 employees.

| Match | Points |
|---|---|
| Industry + size both match ICP | 25 |
| Size matches, industry unknown | 15 |
| Industry matches, size unknown | 12 |
| Neither matches or both unknown | 5 |

### Urgency (0–25)

| Signal | Points |
|---|---|
| Note contains "urgent," "ASAP," "deadline," "budget approved" | +15 |
| Lead age 7–21 days (prime follow-up window) | +10 |
| Lead age <7 days | +5 |
| Lead age >60 days | −5 |

### Recency penalty (subtracted from composite)

| Last activity | Subtract |
|---|---|
| <24 hours ago | −25 |
| 1–3 days ago | −10 |
| 4–7 days ago | −5 |
| >7 days ago | 0 |

---

## Custom ICP (runtime override)

If the owner states an ICP at runtime ("focus on SaaS, 10–100 employees"), apply it for that session only.
    lead-triage | Prompt Minder