New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

Detect buying signals across TAM companies

Signal scanner

by gooseworks-ai · MIT license · ★ 1,220 on GitHub · updated Sep 21

Signal scanner cover

Detect buying signals across TAM companies and watchlist personas. Three-phase architecture: (1) free diff-based signals from existing data (headcount growth, tech stack changes, funding rounds), (2) Apify-powered signals (job postings,…

---
name: signal-scanner
description: >
  Detect buying signals across TAM companies and watchlist personas.
  Three-phase architecture: (1) free diff-based signals from existing data
  (headcount growth, tech stack changes, funding rounds), (2) Apify-powered
  signals (job postings, LinkedIn content analysis, profile changes), and
  (3) post-processing with dedup, scoring, and lead status updates.
  Writes signals to Supabase signals table for downstream activation.
tags: [lead-generation]
---

# Signal Scanner

Scheduled scanner that detects buying signals on TAM companies and watchlist personas, writes them to the `signals` table, and sets up downstream activation.

## When to Use

Overview

Scheduled scanner that detects buying signals on TAM companies and watchlist personas, writes them to the signals table, and sets up downstream activation.

Manual install (npx, ZIP)
Claude Codenpx skills add gooseworks-ai/goose-skills --skill signal-scanner -g -a claude-code
Claude Code (manual)mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/gooseworks-ai/goose-skills/tar.gz/615c685f34f8 \ | tar -xz -C ~/.claude/skills --strip-components=4 goose-skills-615c685f34f8/skills/lead-generation/capabilities/signal-scanner
Windows (PowerShell)New-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/77cfb0133a97c1b7ecba/signal-scanner.zip" -OutFile "$env:TEMP\signal-scanner.zip"; Expand-Archive "$env:TEMP\signal-scanner.zip" -DestinationPath "$HOME\.claude\skills" -Force
Claude.ai / desktopDownload the ZIP and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md5.5 KB
  • skill.meta.json307 B
  • configs/2 files · 2.1 KB
  • scripts/1 file · 35.9 KB
Read the files here
gooseworks-ai/615c6855 files
SKILL.md
Show the full text139 lines

Signal Scanner

Scheduled scanner that detects buying signals on TAM companies and watchlist personas, writes them to the signals table, and sets up downstream activation.

When to Use

  • After TAM Builder has populated companies and personas
  • As a recurring scan (daily/weekly) to detect timing-based outreach triggers
  • When you need to move from static lists to intent-driven outreach

Prerequisites

  • SUPABASE_URL + SUPABASE_SERVICE_ROLE_KEY in .env
  • APIFY_TOKEN in .env (for Phase 2 signals)
  • ANTHROPIC_API_KEY in .env (optional, for LLM content analysis)
  • TAM companies populated via tam-builder
  • Watchlist personas created for Tier 1-2 companies

Signal Types

Priority Signal Level Source Cost
P0 Headcount growth (>10% in 90d) Company Data diffs Free
P0 Tech stack changes Company Data diffs Free
P0 Funding round Company Data diffs Free
P0 Job posting for relevant roles Company Apify linkedin-job-search ~$0.001/job
P1 Leadership job change Person Apify linkedin-profile-scraper ~$3/1k
P1 LinkedIn content analysis Person Apify linkedin-profile-posts + LLM ~$2/1k + LLM
P1 LinkedIn profile updates Person Apify linkedin-profile-scraper ~$3/1k
P2 New C-suite hire Company Derived from person scans Free

Config Format

See configs/example.json for full schema. Key sections:

  • client_name — which client's TAM to scan
  • signals.* — enable/disable each signal type with thresholds
  • scan_scope — filter by tier, status, lead_status

Database Write Policy

CRITICAL: Never write signals or update lead statuses without explicit user approval.

The signal scanner writes to multiple tables: signals (insert), enrichment_log (insert), companies (patch snapshots), and people (patch lead_status). These writes affect downstream outreach decisions — bad signals lead to bad outreach timing.

Required flow:

  1. Always run --dry-run first to detect signals without writing to the database
  2. Present the dry-run results to the user: signal count, types, top signals, affected companies/people
  3. Get explicit user approval before running without --dry-run
  4. Only then run the actual scan that writes to the database

Why this matters:

  • Signals drive outreach timing — incorrect signals trigger premature outreach
  • lead_status changes from monitoring to signal_detected are hard to undo across many records
  • Snapshot updates affect future signal diffs — bad snapshots cascade into future scans
  • Enrichment log entries track Apify credit spend

The agent must NEVER pass --yes on a first run. The --yes flag is only for pre-approved scheduled scans where the user has already validated the signal detection logic.

Usage

# Dry run first (ALWAYS DO THIS) — detect signals without writing to DB
python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
  --config skills/capabilities/signal-scanner/configs/my-client.json --dry-run

# Full scan (only after user reviews dry-run results and approves)
python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
  --config skills/capabilities/signal-scanner/configs/my-client.json

# Test mode (5 companies max)
python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
  --config configs/example.json --test --dry-run

# Free signals only (skip Apify)
# Set all Apify signals to enabled: false in config
Flags
Flag Effect
--config PATH Path to config JSON (required)
--test Limit to 5 companies, 3 people
--yes Auto-confirm Apify cost prompts. Only use for pre-approved scheduled scans.
--dry-run Detect signals but don't write to DB. Always run this first.
--max-runs N Override Apify run limit (default 50)

Output

Signals table writes

Each signal includes: client_name, company_id, person_id, signal_level (company or person), signal_type, signal_source, strength, signal_data (JSON), activation_score, detected_at, acted_on, run_id.

Other database writes
  • Person lead_status updated to signal_detected when activation_score >= threshold
  • Company metadata._signal_snapshot updated for next diff cycle
  • Person raw_data._signal_snapshot updated for next diff cycle
  • enrichment_log entries with tool='apify', action='search' or 'enrich', plus credits_used
Console output
  • Summary stats printed to stdout

Activation Score

activation_score = strength * recency_multiplier * account_fit

Recency:   <24h = 1.5, 1-3d = 1.2, 3-7d = 1.0, 1-2w = 0.8, 2-4w = 0.5
Account:   Tier 1 = 1.3, Tier 2 = 1.0, Tier 3 = 0.7

Connects To

  • Upstream: tam-builder (provides companies + people)
  • Downstream: cold-email-outreach (acts on signals)

File Structure

signal-scanner/
├── SKILL.md
├── configs/
│   └── example.json
└── scripts/
    └── signal_scanner.py
1---
2name: signal-scanner
3description: >
4 Detect buying signals across TAM companies and watchlist personas.
5 Three-phase architecture: (1) free diff-based signals from existing data
6 (headcount growth, tech stack changes, funding rounds), (2) Apify-powered
7 signals (job postings, LinkedIn content analysis, profile changes), and
8 (3) post-processing with dedup, scoring, and lead status updates.
9 Writes signals to Supabase signals table for downstream activation.
10tags: [lead-generation]
11---
12 
13# Signal Scanner
14 
15Scheduled scanner that detects buying signals on TAM companies and watchlist personas, writes them to the `signals` table, and sets up downstream activation.
16 
17## When to Use
18 
19- After TAM Builder has populated companies and personas
20- As a recurring scan (daily/weekly) to detect timing-based outreach triggers
21- When you need to move from static lists to intent-driven outreach
22 
23## Prerequisites
24 
25- `SUPABASE_URL` + `SUPABASE_SERVICE_ROLE_KEY` in `.env`
26- `APIFY_TOKEN` in `.env` (for Phase 2 signals)
27- `ANTHROPIC_API_KEY` in `.env` (optional, for LLM content analysis)
28- TAM companies populated via `tam-builder`
29- Watchlist personas created for Tier 1-2 companies
30 
31## Signal Types
32 
33| Priority | Signal | Level | Source | Cost |
34|----------|--------|-------|--------|------|
35| P0 | Headcount growth (>10% in 90d) | Company | Data diffs | Free |
36| P0 | Tech stack changes | Company | Data diffs | Free |
37| P0 | Funding round | Company | Data diffs | Free |
38| P0 | Job posting for relevant roles | Company | Apify linkedin-job-search | ~$0.001/job |
39| P1 | Leadership job change | Person | Apify linkedin-profile-scraper | ~$3/1k |
40| P1 | LinkedIn content analysis | Person | Apify linkedin-profile-posts + LLM | ~$2/1k + LLM |
41| P1 | LinkedIn profile updates | Person | Apify linkedin-profile-scraper | ~$3/1k |
42| P2 | New C-suite hire | Company | Derived from person scans | Free |
43 
44## Config Format
45 
46See `configs/example.json` for full schema. Key sections:
47 
48- `client_name` — which client's TAM to scan
49- `signals.*` — enable/disable each signal type with thresholds
50- `scan_scope` — filter by tier, status, lead_status
51 
52## Database Write Policy
53 
54**CRITICAL: Never write signals or update lead statuses without explicit user approval.**
55 
56The signal scanner writes to multiple tables: `signals` (insert), `enrichment_log` (insert), `companies` (patch snapshots), and `people` (patch lead_status). These writes affect downstream outreach decisions — bad signals lead to bad outreach timing.
57 
58**Required flow:**
591. **Always run `--dry-run` first** to detect signals without writing to the database
602. Present the dry-run results to the user: signal count, types, top signals, affected companies/people
613. **Get explicit user approval** before running without `--dry-run`
624. Only then run the actual scan that writes to the database
63 
64**Why this matters:**
65- Signals drive outreach timing — incorrect signals trigger premature outreach
66- `lead_status` changes from `monitoring` to `signal_detected` are hard to undo across many records
67- Snapshot updates affect future signal diffs — bad snapshots cascade into future scans
68- Enrichment log entries track Apify credit spend
69 
70**The agent must NEVER pass `--yes` on a first run.** The `--yes` flag is only for pre-approved scheduled scans where the user has already validated the signal detection logic.
71 
72## Usage
73 
74```bash
75# Dry run first (ALWAYS DO THIS) — detect signals without writing to DB
76python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
77 --config skills/capabilities/signal-scanner/configs/my-client.json --dry-run
78 
79# Full scan (only after user reviews dry-run results and approves)
80python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
81 --config skills/capabilities/signal-scanner/configs/my-client.json
82 
83# Test mode (5 companies max)
84python skills/capabilities/signal-scanner/scripts/signal_scanner.py \
85 --config configs/example.json --test --dry-run
86 
87# Free signals only (skip Apify)
88# Set all Apify signals to enabled: false in config
89```
90 
91### Flags
92 
93| Flag | Effect |
94|------|--------|
95| `--config PATH` | Path to config JSON (required) |
96| `--test` | Limit to 5 companies, 3 people |
97| `--yes` | Auto-confirm Apify cost prompts. **Only use for pre-approved scheduled scans.** |
98| `--dry-run` | Detect signals but don't write to DB. **Always run this first.** |
99| `--max-runs N` | Override Apify run limit (default 50) |
100 
101## Output
102 
103### Signals table writes
104Each signal includes: `client_name`, `company_id`, `person_id`, `signal_level` (company or person), `signal_type`, `signal_source`, `strength`, `signal_data` (JSON), `activation_score`, `detected_at`, `acted_on`, `run_id`.
105 
106### Other database writes
107- Person `lead_status` updated to `signal_detected` when activation_score >= threshold
108- Company `metadata._signal_snapshot` updated for next diff cycle
109- Person `raw_data._signal_snapshot` updated for next diff cycle
110- `enrichment_log` entries with `tool='apify'`, `action='search'` or `'enrich'`, plus `credits_used`
111 
112### Console output
113- Summary stats printed to stdout
114 
115## Activation Score
116 
117```
118activation_score = strength * recency_multiplier * account_fit
119 
120Recency: <24h = 1.5, 1-3d = 1.2, 3-7d = 1.0, 1-2w = 0.8, 2-4w = 0.5
121Account: Tier 1 = 1.3, Tier 2 = 1.0, Tier 3 = 0.7
122```
123 
124## Connects To
125 
126- **Upstream:** `tam-builder` (provides companies + people)
127- **Downstream:** `cold-email-outreach` (acts on signals)
128 
129## File Structure
130 
131```
132signal-scanner/
133├── SKILL.md
134├── configs/
135│ └── example.json
136└── scripts/
137 └── signal_scanner.py
138```
139 
View all files on GitHub →

Details

Updated
Sep 21, 2026
License
MIT
Stars on the repo
★ 1,220
Checked
Source
gooseworks-ai/goose-skills ↗
Creator
gooseworks-ai · 206 listings
View creator

Made with signal-scanner

Signal scanner — CleanShot 2026-07-13 at 20 16 54@2x (from the gooseworks-ai/goose-skills README)
Signal scanner — CleanShot 2026-07-13 at 20 16 54@2x (from the gooseworks-ai/goose-skills README)

by gooseworks-ai

Similar skills

See all →
SkillEnd-to-end champion/buyer/user job change signal compositeChampion move outreachgooseworks-ai/goose-skills · by gooseworks-aiEnd-to-end champion/buyer/user job change signal composite. Takes a set of known people (past buyers, champions, power users), detects when they move to a new company, researches the new company for ICP fit, and drafts personalized outreach leveraging the existing relationship. Tool-agnostic — works with any people source, detection method, and outreach platform.★ 1.2k GitHub starsSkillMonitor existing customer accounts for upsell and cross-sellExpansion signal spottergooseworks-ai/goose-skills · by gooseworks-aiMonitor existing customer accounts for upsell and cross-sell signals: team growth on LinkedIn, new job postings, product usage patterns, funding announcements, and public company news. Produces a weekly expansion opportunity list with context and talk tracks. Chains web search, LinkedIn profile monitoring, and job posting detection.★ 1.2k GitHub starsSkillMonitor web sources for Series A-C funding announcementsFunding signal monitorgooseworks-ai/goose-skills · by gooseworks-aiMonitor web sources for Series A-C funding announcements. Aggregates signals from TechCrunch, Crunchbase (via web search), Twitter, Hacker News, and LinkedIn. Filters by stage, amount, and industry. Returns qualified recently-funded companies ready for outreach.★ 1.2k GitHub starsSkillEnd-to-end funding signal compositeFunding signal outreachgooseworks-ai/goose-skills · by gooseworks-aiEnd-to-end funding signal composite. Takes any set of companies, detects recent funding events, qualifies against your company context, finds relevant people (buyers, champions, users), and drafts personalized outreach. Tool-agnostic — works with any company source, contact finder, and outreach platform.★ 1.2k GitHub starsSkillDetect buying intent from job postingsJob Posting Intent Detectiongooseworks-ai/goose-skills · by gooseworks-aiDetect buying intent from job postings. When a company posts a job in your problem area, they've allocated budget and are actively thinking about the problem. This skill finds those companies, qualifies them, extracts personalization context, and outputs everything to a Google Sheet. Does NOT do outreach — just delivers qualified leads with reasoning.★ 1.2k GitHub starsSkillDetect buying signals from multiple sources, qualify leadsSignal detection pipelinegooseworks-ai/goose-skills · by gooseworks-aiDetect buying signals from multiple sources, qualify leads, and generate outreach context★ 1.2k GitHub stars

More from gooseworks-ai

SkillMine the highest-converting ad angles from customer reviewsAd angle minergooseworks-ai/goose-skills · by gooseworks-aiMine the highest-converting ad angles from customer reviews, Reddit complaints, support tickets, and competitor ads. Extracts actual pain language, competitor weaknesses, and outcome phrases that real buyers use. Outputs a ranked angle bank with proof quotes and recommended ad formats per angle.★ 1.2k GitHub starsSkillAnalyze ad campaign performance data to identify what'sAd campaign analyzergooseworks-ai/goose-skills · by gooseworks-aiAnalyze ad campaign performance data (Google, Meta, LinkedIn) to identify what's working, what's wasting budget, and specific cut/scale/test recommendations. Runs statistical analysis, funnel diagnostics, and multi-channel budget reallocation with specific dollar-amount shift recommendations and scenario modeling.★ 1.2k GitHub starsSkillFor paid lead-gen and participant-recruitment adsAd lead quality analyzergooseworks-ai/goose-skills · by gooseworks-aiFor paid lead-gen and participant-recruitment ads, replaces vanity CPA with true CAC per qualified lead by joining ad-platform data with downstream funnel events, surfaces tracking gaps, and classifies every creative into Scale / Keep / Investigate / Cut.★ 1.2k GitHub starsSkillAnalyze the message match between your ads and landing pagesAd to landing page auditorgooseworks-ai/goose-skills · by gooseworks-aiAnalyze the message match between your ads and landing pages. Checks if the promise in the ad copy carries through to the landing page headline, body, and CTA. Flags disconnects that kill conversion rates. Works with Google, Meta, and LinkedIn ads.★ 1.2k GitHub starsSkillCheck and improve your brand's visibility across AI searchAeogooseworks-ai/goose-skills · by gooseworks-aiCheck and improve your brand's visibility across AI search engines (ChatGPT, Perplexity, Gemini, Grok, Claude, DeepSeek). Set up tracking, run visibility analyses, audit your website for AI readability, and get actionable recommendations. Uses the npx goose-aeo@latest CLI.★ 1.2k GitHub starsSkillSearch Amazon products - find items, compare pricesAmazon Product Searchgooseworks-ai/goose-skills · by gooseworks-aiSearch Amazon products - find items, compare prices, read reviews★ 1.2k GitHub stars