00-gtm-router
Plan and run the full API-first GTM chain - the orchestrator (step 00) that turns an ICP description plus optional budget, volume, and urgency into the right…
Enriches company domains with structured signals from CrustData - funding rounds, headcount growth, department growth, and recent hires. Use when the user wants to pull company signals, enrich domains with funding/growth/hiring data, check who recently joined a company, find new
$ npx -y skills add Zevenue/headless-gtm --skill 04-crustdata-signals --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/04-crustdata-signalsContext preview
The summary Claude sees to decide when to auto-load this skill.
Enriches company domains with structured signals from CrustData - funding rounds, headcount growth, department growth, and recent hires. Use when the user wants to pull company signals, enrich domains with funding/growth/hiring data, check who recently joined a company, find new
name: 04-crustdata-signals description: > Enriches company domains with structured signals from CrustData - funding rounds, headcount growth, department growth, and recent hires. Use when the user wants to pull company signals, enrich domains with funding/growth/hiring data, check who recently joined a company, find new hires at a domain, get headcount trends, or anything involving CrustData enrichment. Also triggers on: "run crustdata signals", "enrich these domains", "pull funding data", "who joined recently", "headcount growth for these companies", "department growth", "recent hires at", "crustdata enrich".
Enrich company domains with structured signal data (funding, growth, departments, recent hires) and write results to Google Sheets across 5 tabs.
1. **Domains** - a Google Sheet link/ID with a domain column, or a raw list 2. **Hire window** (optional) - 90, 180, or 365 days back for recent hires (default: 180) 3. **Output destination** - same sheet (new tabs), different sheet ID, or create new
If the user provides a sheet link, extract the spreadsheet ID and ask which tab and column contain the domains.
Each API call costs real credits. Treat them like money.
| API | Cost | Rate limit | |-----|------|------------| | `/company/enrich` | 2 credits/company | 15 RPM | | `/person/search` | 0.03 credits/result | 30 RPM |
Cost per domain scales with how many hires come back, so it is not a flat rate: `2 (enrich) + 0.03 x (hires returned)`. Budget by the ICP's hiring velocity, not a single number:
| ICP hiring profile | Hires/company | Cost/domain | |--------------------|---------------|-------------| | Low-hiring | ~10 | ~2.3 | | Typical | ~20 | ~2.6 | | High-growth / high-hiring | ~65 | ~4.0 |
The flat "~2.6" only holds for a typical ~20-hire pull; high-growth ICPs run closer to ~4 credits/domain. Estimate with the actual hire window and expected velocity.
**JSON files are the source of truth.** Every API call saves a per-domain JSON to `runs/{run-id}/`. Before calling the API for any domain, check whether a JSON already exists in any prior run folder (older runs may sit in the legacy `outputs/` dir - check both). If it does, reuse it - do not spend credits again. The sheets writer can combine multiple run folders.
Ask the user for domain source, hire window, and output destination. Default to 180-day hire window if not specified.
All paths below are relative to this skill's folder.
export CRUSTDATA_API_KEY=<your-crustdata-api-key> # From a list of domains python3 scripts/crustdata_signals.py \ --domains domain1.com,domain2.com \ --hire-days 180 # Chain position: from an upstream records.jsonl (01/02/03) - inherits its fields python3 scripts/crustdata_signals.py \ --records ./runs/<run-id>/records.jsonl \ --hire-days 180 # From a Google Sheet python3 scripts/crustdata_signals.py \ --sheet-id <SHEET_ID> --tab "Sheet1" --domain-col B \ --hire-days 180
The script saves per-domain JSON files to `runs/{run-id}/` and maintains a `tracker.json` for resume. If it fails mid-run, resume with `--resume --output-dir runs/{run-id}`.
# Single run folder
python3 scripts/sheets_writer.py \
--run-dir runs/{run-id} \
--spreadsheet-id <SHEET_ID>
# Combine multiple run folders (dedupes by domain)
python3 scripts/sheets_writer.py \
--run-dir runs/run-A runs/run-B runs/run-C \
--spreadsheet-id <SHEET_ID>
# Create a new sheet
python3 scripts/sheets_writer.py \
--run-dir runs/{run-id} \
--create-new --title "CrustData Signals - Jul 2026"The writer accepts multiple `--run-dir` paths and deduplicates by domain. This means you can enrich domains across separate sessions and combine them into one sheet without re-running the API.
| Tab | Grain | Key columns | |-----|-------|-------------| | Signal Summary | 1 row/domain | Company info, key metrics, signal analysis (Funding/Growth/Dept/Hiring/Summary) | | Recent Hires | 1 row/person | Name, title, start date, days since joining, seniority, function | | Funding | 1 row/round | Date, round type, amount, lead investors, all investors | | Company Growth | 1 row/domain | Headcount + MoM/QoQ/6m/YoY growth (% and absolute) | | Dept Growth | 1 row/domain-dept | Department, current headcount, 6m ago, YoY ago, growth % |
After writing to sheets, save a markdown summary to `runs/{run-id}/summary.md` with: date, domain count, hire window, credits consumed, domains processed/failed/skipped, sheet URL.
Ask the user whether to keep or delete the JSON backup files. They can always be regenerated but that costs credits again.
The sheets writer auto-generates signal text:
GTM without the SaaS layer. An outbound pipeline built as agent skills for Claude Code and Codex: describe an ICP in plain English and the chain takes it from company discovery to verified, signal-ranked contacts - every step running on raw vendor APIs, not
Plan and run the full API-first GTM chain - the orchestrator (step 00) that turns an ICP description plus optional budget, volume, and urgency into the right…
The qualification gate of the GTM chain - judges every discovered company against the client's ICP before any paid enrichment, so credits are spent only on…
B2B company discovery and list building via the Prospeo search API. Use when the user wants to find companies from an ICP, build a prospect or TAM list, search…
Seed-based B2B company discovery via the Prospeo company-lookalike API. Use when the user has example companies and wants more like them - "find companies…
Find local-business (SMB) prospects via Google Maps using the Apify Compass actor. Use for Zevenue Step-2 Discovery (Vertical) when the ICP is Maps-addressable…
Scrapes a company website into clean, page-typed markdown using Firecrawl map + scrape + extract. Triggers on: "scrape this company", "read their website",…