Inbound Lead Triage
Pulls all inbound leads from a specified period, classifies them by source urgency, qualifies against ICP, enriches with company/person context, and produces a prioritized action queue. Turns a messy inbox of form fills into a clear "who to call first" list.
When to Auto-Load
Load this composite when:
- User says "triage my inbound leads", "review new leads", "check demo requests"
- User wants to process a batch of inbound leads from any period
- User asks "who should I follow up with first?"
- A scheduled workflow triggers periodic inbound review
Architecture
[Lead Sources] → Step 1: Collect → Step 2: Classify & Rank → Step 3: Qualify → Step 4: Enrich → Step 5: Route & Respond
↓ ↓ ↓ ↓ ↓
Raw lead list Urgency-ranked list ICP-scored list Context-rich list Action queue + drafts
Each step has a clear input/output contract. Tools are configured once per client, not hardcoded.
Step 0: Configuration (Once Per Client)
On first run, ask the user to configure their lead sources and preferences. Save to the current working directory or wherever the user prefers (e.g., config/inbound-triage.json).
{
"lead_sources": {
"demo_requests": {
"source_tool": "HubSpot | Salesforce | Typeform | CSV | other",
"access_method": "API | CSV export | MCP tool | manual paste",
"fields_available": ["name", "email", "company", "title", "message"]
},
"free_trial_signups": {
"source_tool": "product database | Stripe | CSV | other",
"access_method": "API | CSV export | manual paste",
"fields_available": ["name", "email", "company", "signup_date", "plan"]
},
"content_downloads": {
"source_tool": "HubSpot | Marketo | CSV | other",
"access_method": "API | CSV export | manual paste",
"fields_available": ["name", "email", "company", "content_title", "download_date"]
},
"webinar_registrations": {
"source_tool": "Zoom | Luma | CSV | other",
"access_method": "API | CSV export | manual paste",
"fields_available": ["name", "email", "company", "webinar_title", "attended"]
},
"chatbot_conversations": {
"source_tool": "Intercom | Drift | Crisp | CSV | other",
"access_method": "API | CSV export | manual paste",
"fields_available": ["name", "email", "company", "conversation_summary", "intent"]
}
},
"urgency_overrides": {},
"response_preferences": {
"demo_request_sla": "< 1 hour",
"trial_signup_sla": "< 4 hours",
"default_sla": "< 24 hours"
},
"qualification_prompt_path": "path/to/existing/qualification-prompt.md or null"
}
On subsequent runs: Load config silently, skip setup.
If user provides a raw CSV or pastes leads inline: Skip source config — just classify what's given.
Step 1: Collect Leads
Input
- Time period (e.g., "last 24 hours", "this week", "since Monday")
- Lead sources to check (all configured sources by default, or user specifies)
Process
- Pull leads from each configured source for the specified period
- Normalize into a common schema regardless of source:
{
"name": "",
"email": "",
"company": "",
"title": "", // if available
"source_type": "", // demo_request | free_trial | content_download | webinar | chatbot | other
"source_detail": "", // which form, which webinar, which content piece
"timestamp": "",
"raw_message": "", // form message, chat transcript, or null
"raw_fields": {} // all original fields preserved
}
- Deduplicate by email — if same person appears in multiple sources, merge into one record with all source types listed (this is a stronger signal)
Output
- Normalized lead list with source classification
- Dedup report: "X leads from Y sources, Z duplicates merged"
Human Checkpoint
Present the collected leads count by source. Ask: "These are the leads I found. Proceed with triage?"
Step 2: Classify & Rank by Urgency
Urgency Tier System
Rank every lead into one of four urgency tiers based on their source type and behavioral signals.
Tier 1 — Respond NOW (< 1 hour SLA)
- Demo requests (explicit buying intent)
- Chatbot conversations where the prospect asked about pricing, integration, or implementation
- Any lead that mentions a competitor by name
- Any lead that mentions a timeline ("looking to switch by Q2", "evaluating this month")
- Multi-source leads: appeared in 2+ sources (e.g., downloaded content AND requested demo)
Tier 2 — Respond TODAY (< 4 hours SLA)
- Free trial signups (active evaluation intent)
- Chatbot conversations with product questions (not pricing)
- Webinar attendees who actually attended (not just registered)
- Content downloads of bottom-funnel content (case studies, ROI calculators, comparison guides, pricing pages)
Tier 3 — Respond within 24 hours
- Webinar registrants who did NOT attend
- Content downloads of mid-funnel content (how-to guides, industry reports, templates)
- Free trial signups with personal email domains (gmail, yahoo — lower commercial intent)
Tier 4 — Batch response / nurture
- Content downloads of top-funnel content (blog posts, general ebooks, infographics)
- Webinar registrants for broad/educational topics with no other signal
- Any lead where company or title is missing and can't be enriched
Signal Boosters (Move Up One Tier)
- Company matches existing ICP (known good industry, size, stage)
- Person has a title that maps to buyer persona
- Company is already in pipeline (existing deal — warm context)
- Person previously engaged (downloaded other content, attended other webinar)
- Company was flagged by a signal composite (funding, hiring, leadership change)
Signal Dampeners (Move Down One Tier)
- Personal email domain with no company info
- Bot-like behavior (form filled in < 3 seconds, nonsense fields)
- Existing customer (unless upsell signal — keep at tier but flag differently)
- Competitor employee (flag separately — competitive intelligence, not a lead)
Urgency Override
If the user configured custom urgency rules in urgency_overrides, apply those after the default classification.
Output
- Lead list sorted by urgency tier, then by timestamp within each tier
- Each lead tagged with:
urgency_tier,urgency_reason,signal_boosters[],signal_dampeners[]
Step 3: Qualify Against ICP
Process
For each lead, run a lightweight ICP qualification check. This is NOT the full lead-qualification capability — it's a fast pass to separate likely-fit from unlikely-fit.
- If a qualification prompt exists (from
lead-qualificationcapability): Apply it in fast mode — check hard disqualifiers only, skip deep enrichment - If no qualification prompt: Use the company context to do a basic fit check:
- Does the company size/industry/stage roughly match ICP?
- Does the person's title map to a buyer/user persona?
- Any obvious disqualifiers? (wrong geography, wrong industry, too small/large)
Qualification Categories
- Strong fit — Company and person clearly match ICP
- Likely fit — Partial data but what's available looks good
- Unknown fit — Not enough data to determine (needs enrichment)
- Poor fit — Clearly outside ICP (but still log — they came inbound for a reason)
- Flag: Competitor — Employee of a known competitor
- Flag: Existing customer — Already a customer (route to CS/upsell, not sales)
Output
- Each lead tagged with:
icp_fit,fit_reasoning(one sentence) - Leads with "poor fit" or "flag" categories are separated into a secondary list
Step 4: Enrich with Context
Process
For leads in Tier 1 and Tier 2 (and strong/likely fit Tier 3), gather context that helps the responder have a better conversation.