skills/scientiacapital/skills/callable-lead-count

callable-lead-count

Installation
SKILL.md

Callable Lead Count Skill

<quick_start> Trigger: M-F 7:25 AM ET (daily, before morning-brief at 7:30 AM)
Manual Trigger: "Show callable leads" or "Lead inventory check"
Dependencies: Requires HubSpot portal 21530819 access
Output: Callable lead count by tier, ATL Runway days, health alerts </quick_start>

<success_criteria>

  • Query HubSpot for contacts with phone != null
  • Apply Golden Rules (exclude customers, channel, device owners, product-page engagers)
  • Classify each by ATL/BTL tier (per CLAUDE.md Decision-Maker rules)
  • Count totals: ATL, GRAY, BTL, NEVER (for awareness)
  • Calculate ATL Runway = ATL count ÷ 15 dials/day = X days of inventory
  • Calculate total Runway = total callable count ÷ 50 dials/day = X days
  • Alert if ATL < 15 (⚠️ warning)
  • Alert if total < 50 (🚨 critical)
  • Alert if NEVER ATL > 0 (🔍 review, remove from sequences)
  • Output: Summary stats + detailed table + trend vs previous day </success_criteria>

Stage 1: Query HubSpot for Callable Contacts

MCP Tool: search_crm_objects (HubSpot)

objectType: "contacts"
filterGroups: [{
  filters: [
    { propertyName: "phone", operator: "HAS_PROPERTY" }
  ]
}]
properties: [
  "firstname",
  "lastname",
  "email",
  "phone",
  "jobtitle",
  "company",
  "hs_lead_status",
  "hubspot_owner_id",
  "hs_analytics_num_page_views",
  "custom_atl_btl_tier",
  "custom_prospect_vertical",
  "lifecyclestage",
  "createdate"
]
limit: 100

Pagination: Loop through all results (may be 200+ contacts)

Output: Full contact list with all properties (no filtering yet)


Stage 2: Apply Golden Rules Filter

Golden Rules (Hard Exclusions):

Skip contacts if:

  • Email domain matches crm_customers table (customer account)
  • Contact tagged "Channel Partner" (hubspot_owner_id = channel owner)
  • Contact tagged "Device Owner" or in device-owner list
  • Contact tagged "Product Page Engager" (marketing-only engagement)
  • Job title contains BTL keywords: Technician, Support, Intern, Volunteer, Operator, Designer (non-director)
  • Job title in NEVER ATL list (Warehouse Manager, Network Manager, Systems Admin, AV Tech, Graphic Design Instructor, Program Administrator, Web Designer, Classroom Support, Lab Coordinator, Maintenance, Building Engineer, Multimedia Services Manager, Video Production Specialist, Streaming Crew)
  • Lead status in exclusion list: Unqualified, Opted Out, Bad Fit
  • Phone number invalid or duplicate

Retention Logic:

  • Keep contacts with hs_lead_status in: Subscriber, Qualified Lead, Inbound Lead, Marketing Qualified Lead, Sales Qualified Lead
  • Keep prospects created in last 90 days
  • Keep contacts with hs_analytics_num_page_views > 0 (engagement signal)

Output: Filtered callable list (typically 50-70% of input after Golden Rules)


Stage 3: Classify by ATL/BTL Tier

MCP Tool: N/A (logic-based classification using jobtitle)

Apply ATL/BTL Decision-Maker Classification (per CLAUDE.md):

ATL Tier (Always Prospect) — 10 Universal Keywords:

  • Chief, CIO, CTO, CFO, COO
  • Vice President, VP, AVP, SVP, EVP
  • President, Provost, Vice Provost
  • Superintendent, Director (IT/Tech/Facilities/Academic Tech/Procurement)
  • Dean, Court Administrator, Clerk of Court
  • City Manager, County Manager, Senior Pastor, Executive Pastor

GRAY Tier (Contextual - Budget Authority >$25K):

  • Manager (AV/Facilities/IT) — only if reports to Director+
  • Department Chair — context-dependent (small vs large institution)
  • Director of Educational Technology — depends on reporting line
  • Program Director — only if dept-level budget authority

BTL Tier (No Budget Authority):

  • Technician, Specialist, Coordinator, Support
  • Administrator (Systems/Network/Database)
  • Engineer (AV/Network/Systems), Operator
  • Instructor, Professor, Faculty, Designer, Assistant
  • Clerk (non-Court), Volunteer, Help Desk
  • Student, Resident, Intern

NEVER ATL (Automatic Exclusions):

  • Warehouse Manager, Network Manager, Systems Administrator
  • AV Technician, Graphic Design Instructor
  • Program Administrator, Web Designer
  • Classroom Support, Lab Coordinator, Maintenance
  • Building Engineer, Multimedia Services Manager
  • Video Production Specialist, Streaming Crew

Classification Algorithm:

FOR each contact IN filtered_list:
  title = contact.jobtitle.lower()
  
  IF title matches any NEVER_ATL keyword:
    tier = "NEVER"
    action = "REVIEW" (may need removal from sequences)
  
  ELIF title matches any ATL keyword:
    tier = "ATL"
  
  ELIF title matches any GRAY keyword:
    tier = "GRAY"
    note = "Verify budget authority >$25K via company research"
  
  ELSE:
    tier = "BTL"

Output: Classified callable contacts with tier assignment


Stage 4: Calculate Callable Inventory Metrics

Count by Tier:

atl_count = count(tier == "ATL")
gray_count = count(tier == "GRAY")
btl_count = count(tier == "BTL")
never_count = count(tier == "NEVER")
total_callable = atl_count + gray_count + btl_count

ATL Runway Metric:

atl_runway_days = ROUND(atl_count / 15, 1)
# Tim's target: 15 ATL dials/day
# Example: 45 ATL contacts = 3 days of ATL inventory

Total Runway Metric:

total_runway_days = ROUND(total_callable / 50, 1)
# Tim's target: 50+ dials/day (mix of ATL, GRAY, BTL)
# Example: 200 callable = 4 days of total inventory

Lead Age Metrics:

avg_days_in_system = AVERAGE(TODAY() - contact.createdate)
recent_engagers = count(hs_analytics_num_page_views > 0)

Stage 5: Generate Health Alerts

Alert Thresholds:

Metric Threshold Alert Level Action
ATL count < 15 ⚠️ Warning "Increase ATL prospecting (prospect-enrich + prospect-refresh)"
Total callable < 50 🚨 Critical "Insufficient inventory for 50 dials/day—escalate prospecting"
NEVER ATL count > 0 🔍 Review "X contacts in NEVER ATL tier—remove from sequences"
ATL Runway < 2 days ⚠️ Warning "Less than 2 days of ATL dials—restock urgently"

Alert Output:

✓ ATL inventory: 42 contacts (2.8 days runway)
✓ Total callable: 185 contacts (3.7 days runway)
🔍 NEVER ATL: 2 contacts (remove from sequences)
✓ Health: GREEN (acceptable inventory)

Stage 6: Output Summary Report

Format: Markdown summary + detailed table

Summary Section:

# Daily Callable Lead Inventory — 2026-03-19

## Health Status
✓ ATL Inventory: 42 contacts (2.8 days)
✓ Total Callable: 185 contacts (3.7 days)
🔍 NEVER ATL: 2 contacts (review)

## Detailed Breakdown
| Tier | Count | % of Total | Runway Days | Status |
|------|-------|-----------|-------------|--------|
| ATL | 42 | 22.7% | 2.8 | ✓ Good |
| GRAY | 65 | 35.1% | 1.3 | ⚠️ Monitor |
| BTL | 78 | 42.2% | 1.6 | ✓ OK |
| **TOTAL** | **185** | **100%** | **3.7** | **✓ GREEN** |

## Trend vs Yesterday
- ATL: +3 (was 39)
- GRAY: -2 (was 67)
- BTL: +5 (was 73)
- Total: +6 (was 179)

## Top Companies by Leads
1. Acme Corp: 12 contacts (5 ATL)
2. State University: 8 contacts (6 ATL)
3. County Courts: 6 contacts (5 ATL)

## Activity Signal
- Recent engagers (>5 page views): 45 contacts
- Avg days in system: 23 days
- New adds (last 7 days): 18 contacts

Detailed Callable Table:

Contact Title Company Vertical Phone Tier Days in System Engagement Sequence
Jane Smith Director of IT Services Acme Corp Corp AV ATL 34 12 views BDR_CorporateAV_1
Bob Jones Manager, IT Infrastructure State Univ Higher Ed GRAY 45 3 views BDR_HigherEd_1
Carol White AV Technician Example Inc Healthcare NEVER 12 1 view REMOVE

Stage 7: Integration with Morning Brief

This skill feeds into morning-brief (7:30 AM):

  • Pass ATL/GRAY/BTL breakdown to morning-brief
  • Pass alert flags (⚠️ warning, 🚨 critical, 🔍 review)
  • Pass top 15 ATL contacts for priority dial list
  • Pass runway metrics for inventory planning

Output format for morning-brief:

{
  "atl_count": 42,
  "gray_count": 65,
  "btl_count": 78,
  "never_count": 2,
  "total_callable": 185,
  "atl_runway_days": 2.8,
  "total_runway_days": 3.7,
  "alerts": ["NEVER_ATL_REVIEW"],
  "top_atl_contacts": [
    { "name": "Jane Smith", "company": "Acme", "days_in_system": 34 },
    ...
  ]
}

Stage 8: Comparison Metrics (Week-over-Week)

Optional: Track 7-day trend

Date ATL GRAY BTL Total ATL Runway Status
2026-03-19 42 65 78 185 2.8
2026-03-18 39 67 73 179 2.6
2026-03-17 35 64 70 169 2.3 ⚠️
2026-03-16 32 62 68 162 2.1 ⚠️

Trend Analysis:

  • ATL growing 3-4/day (good)
  • Total growing 6/day (good, at target from prospect-enrich + prospect-refresh)
  • Runway stable at 2.8-3.7 days (acceptable; 2+ days is minimum)

Emit Outcome Sidecar

As the final step, write to ~/.claude/skill-analytics/last-outcome-callable-lead-count.json:

{"ts":"[UTC ISO8601]","skill":"callable-lead-count","version":"1.0.0","variant":"default",
 "status":"[success|partial|error]","runtime_ms":[estimated ms from start],
 "metrics":{"atl_count":[n],"gray_count":[n],"btl_count":[n],"total_callable":[n],"never_atl_flagged":[n],"atl_runway_days":[n]},
 "error":null,"session_id":"[YYYY-MM-DD]"}

Use status "partial" if some stages failed but results were produced. Use "error" only if no output was generated.


Skill Metadata

Version: 1.0
Last Updated: 2026-03-19
Author: Tim Kipper
Status: Production
Integration: HubSpot (portal 21530819)
Tier: P1 (Core BDR Automation)
Triggers: Scheduled (M-F 7:25 AM) + Manual ("Show callable leads")
Dependencies: Feeds into morning-brief (7:30 AM)

Weekly Installs
9
GitHub Stars
12
First Seen
Mar 22, 2026