intent-signal-aggregator-skill
About intent-signal-aggregator-skill
A skill that ranks target accounts by buying-intent signals from Apollo and Epiphan CRM activity. It gates accounts before signal collection and delivers a Slack digest plus handoff data for follow-up skills.
Key features
- 01Resolve account lists and domains
- 02Qualify accounts before signal collection
- 03Gather hiring, funding, growth, and leadership signals
- 04Include first-party engagement and tech-stack data
- 05Score and rank accounts with signal decay
- 06Deliver Slack digest and hot-account handoff JSON
Use cases
- 01Find accounts showing recent buying signals
- 02Prioritize outreach by account intent score
- 03Monitor hiring or leadership changes at target accounts
- 04Pass hot-account details to dialing and contact research workflows
MCP support
Uses MCP tools for account qualification, Apollo organization and people signals, and Epiphan CRM activity. Results can be delivered through Slack and a handoff JSON file; outreach copy is drafted only after checks.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ scientiacapital/ skills --skill intent-signal-aggregator-skillAfter installing, type/intent-signal-aggregator-skillin Claude Code to confirm it loaded.
Bundled filesconfig.json
Details
From the project READMEIntent Signal Aggregator
Turn a target-account list into a ranked intent feed where every signal is a tool result: Apollo job postings and organization enrichment for hiring, funding, growth, and leadership changes; Epiphan CRM activity for first-party engagement. Accounts are gated through `qualify_lead` before they can be hot, scored 0-100, and delivered as a Slack digest plus a handoff file for sdr-dial-lists and contact-hunter. Timing is the product: same prospect, different week, different outcome. Keywords: `intent signals`, `buying signals`, `hot accounts`, `job postings`, `funding`, `in-market`<quick_start> Trigger: "track intent signals for [account list / vertical]" or "which accounts are showing buying signals this week?"
Tool order:
- Account list — from the request, a HubSpot list (
hubspot_search_lists+hubspot_list_members), orexecute_sqloverhubspot_companiesfor the vertical. Resolve domains. - Gate Q —
qualify_leadper account before any signal pull (no credits on excluded accounts). Verdict decides exclude /STALE AE LEAD/ net-new. - Signals, per surviving domain:
apollo_organizations_job_postings→ open roles; match titles/descriptions against the AV/video keyword list below.apollo_organizations_enrich→ funding events,estimated_num_employeestrend, leadership (current_technologies,latest_funding_stage,founded_year).apollo_mixed_people_api_searchwith ATL titles + the domain,apollo_people_bulk_matchfor tenure → new executive < 90 days.- First-party:
activity_get_timelineon known contacts andanalytics_search_by_emailfor product-page / pricing / demo activity. - Optional Clay
track-eventfor funding/news when configured.
- Score (table below), rank, write the digest.
- Deliver: Slack DM to Tim with the digest; handoff JSON to
~/.claude/skill-state/intent-signal-aggregator/<date>-hot.jsonfor sdr-dial-lists / contact-hunter; any outreach copy goes through Gate B thencreate_draft. </quick_start>
<house_rules> Customer-facing skill. Before output, run the gates in order (details: ~/.claude/skills/epiphan-house-rules-skill/reference/gates.md): S: search_product_catalog (Epiphan AI) or Epiphan Knowledge search before any product claim. B: check_my_copy on every customer-facing string. Q: qualify_lead right after the candidate pull, before tiering/enrichment/drafts. D: outbound text becomes a Gmail draft, never a send. Identifiers (owner IDs, portal, emails, seats) come from reference/identifiers.md in that skill — do not restate them here. On any gate failure follow reference/self-healing.md (retry, degrade with a flag, alert Tim, halt) and append a line to ~/.claude/skill-runs/.jsonl. </house_rules>
<success_criteria>
- Every account passed through
qualify_leadbefore signal pulls; exclusions andSTALE AE LEADcounted - Every signal cites its source call and date (job posting id, funding event, timeline event); nothing narrated
- Each account has an intent score 0-100 with the per-signal contribution visible
- Per-source degradation reported (which source was empty/failed) rather than silently skipped
- Digest delivered as Slack DM; hot-account handoff JSON written
- Recommended action per hot account names the contact tier (from
qualify_lead) and the next skill - Outcome sidecar and run-log line written </success_criteria>
Stage 1 — Account list and Gate Q
Resolve the list to HubSpot company ids and domains. Run qualify_lead on each; Golden Rules, the AE 90-day rule, suppression, and geo default (USA/Canada) are evaluated inside that call — see epiphan-house-rules-skill reference/gates.md and reference/identifiers.md, do not restate owner IDs here. Excluded accounts are dropped before any Apollo credit is spent. qualify_lead unavailable → halt.
Stage 2 — Signal sources (all live)
| Signal | Tool | What counts |
|---|---|---|
| Hiring (relevant) | apollo_organizations_job_postings | Titles/descriptions matching: AV, audiovisual, media services, lecture capture, video production, streaming, classroom technology, instructional technology, courtroom technology, broadcast engineer |
| Hiring (volume) | same | ≥ 3 open roles in IT / facilities / media departments |
| Funding | apollo_organizations_enrich | latest_funding_stage / funding event ≤ 90 days; for public institutions, bond or capital-project news via Clay track-event when configured |
| Headcount growth | apollo_organizations_enrich | employee estimate up ≥ 10% vs the stored prior value in skill-state |
| Leadership change | apollo_mixed_people_api_search + apollo_people_bulk_match | ATL title with role start ≤ 90 days |
| Tech stack | apollo_organizations_enrich current_technologies | Panopto, Kaltura, Echo360, YuJa, Zoom Rooms, Crestron, Extron present or newly added |
| First-party engagement | activity_get_timeline, analytics_search_by_email | pricing/demo page views, form fills, email replies in the last 30 days |
Each source is retried once on a transient error, then degraded: empty or failed source → that signal scores 0, the account is flagged partial:<source>, and the run continues.
Stage 3 — Scoring
| Signal | Points | Decay |
|---|---|---|
| Relevant job posting | 25 (first) + 5 each additional, cap 35 | halves after 30 days |
| New ATL executive | 25 | halves after 60 days |
| Funding / capital event | 15 | halves after 90 days |
| First-party engagement | 15 | halves after 14 days |
| Headcount growth | 5 | per quarter |
| Tech stack match | 5 | static |
Cap 100. Hot ≥ 60 (act this week) · Warm 35-59 (act within 2 weeks) · Watch < 35.
Stage 4 — Output
# Intent Signal Report — [date range]
Accounts in: [n] · excluded by Gate Q: [n] · stale AE surfaced: [n] · scored: [n] · hot: [n] · warm: [n]
Sources degraded: [none | job_postings for 3 accounts | …]
## HOT
### #1 [Company] — [vertical] — score [n]/100
1. Hiring: [n] relevant roles — "[title]" posted [date] (job posting id) — mentions [keyword]
2. Leadership: [Name], [Title], started [date] (Apollo id) — tier [ATL] per qualify_lead
3. First-party: [contact] viewed pricing [date] (timeline event)
Action: [call this week via sdr-dial-lists | contact-hunter for the new exec] — contact tier [ATL/GRAY]
Opener (draft id [Gmail id] after check_my_copy): "[one line]"
## WARM … ## WATCH …
## STALE AE LEADS — Tim decides
[Company] — owner [AE] — last activity [date] — score [n]
Signal win-rate tables are not emitted unless computed from ~/.claude/skill-analytics/outcomes.jsonl; no illustrative percentages in the report.
Stage 5 — Delivery and handoff
- Slack DM to Tim: the HOT block plus counts, with the path to the full report saved at
~/.claude/skill-state/intent-signal-aggregator/<date>.md. - Handoff JSON
~/.claude/skill-state/intent-signal-aggregator/<date>-hot.json:[{company_id, domain, score, signals[], recommended_skill, contact_tier}]consumed bysdr-dial-listsandcontact-hunter-skill. - Openers:
get_writing_styleonce,check_my_copyper line,create_draftfor hot accounts with a verified contact. Never send. - Persist the headcount snapshot per domain in skill-state for the next run's growth comparison.
Stage 6 — Emit outcome sidecar + run log
Write ~/.claude/skill-analytics/last-outcome-intent-signal-aggregator-skill.json:
{"ts":"[UTC ISO8601]","skill":"intent-signal-aggregator-skill","version":"<frontmatter version>","variant":"default",
"status":"[success|partial|error]","runtime_ms":[estimated ms from start],
"metrics":{"accounts_in":[n],"excluded_by_qualify":[n],"stale_ae_surfaced":[n],"accounts_scanned":[n],"signals_detected":[n],"hot_accounts":[n],
"signal_types":{"hiring":[n],"funding":[n],"leadership":[n],"tech_stack":[n],"engagement":[n]},"sources_degraded":["job_postings"]},
"error":null,"session_id":"[YYYY-MM-DD]"}
status partial must name the degraded source(s) in error. Append one line to ~/.claude/skill-runs/intent-signal-aggregator-skill.jsonl.
<self_healing>
partial = a ranking was produced but a source degraded: job postings or enrichment empty/failed after retry (signal scored 0, account flagged partial:<source>), Slack DM failed (report path returned in chat), create_draft failed (opener in chat). error = no account list resolvable, Apollo entirely unavailable, or qualify_lead unavailable (halt: never mark an account hot that Gate Q has not seen). Ladder per ~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md: retry once → degrade with a flag → Slack DM Tim → halt with state in ~/.claude/skill-state/intent-signal-aggregator/.
</self_healing>
<anti_patterns>
- Writing "Posted 5 job listings" without a job-posting result to cite.
- Restating owner IDs or Golden Rules inline;
qualify_leadowns the verdict. - Emitting win-rate benchmarks that were never measured.
- Marking an account hot on a single stale signal; apply the decay. </anti_patterns>
<reference_guides>
~/.claude/skills/epiphan-house-rules-skill/reference/gates.md— Gate Q verdicts, suppression, geo default~/.claude/skills/epiphan-house-rules-skill/reference/identifiers.md— owner IDs, portal, emails (never restate here)- Siblings:
linkedin-sales-navigator-alt-skill(people who changed roles),lookalike-customer-finder-skill(who to monitor),sdr-dial-lists/contact-hunter-skill(act on hot accounts) </reference_guides>