Install
$ agentstack add skill-keinsaasforever-gtm-pipeline-skills-gtm-pipeline ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Pipeline
Plan and orchestrate a full GTM pipeline — from discovery to enriched contact list. Determines which skills to run, in what order, based on client requirements and starting data.
Read ~/.claude/skills/gtm-pipeline/_shared/conventions.md before executing.
When to Use
- Client needs a complete lead generation pipeline (not just one skill)
- You need to determine the right workflow based on what data exists
- Stripe payment trigger: execute full pipeline
- Any request that spans multiple GTM skills
Step 1 — Assess Starting Point
Ask: What data does the user have?
| Starting Point | Available Data | Next Action | |----------------|---------------|-------------| | Nothing (just an ICP description) | ICP prompt only | Determine workflow → full pipeline | | Company list | CSV with company names/domains | Skip company-search → company-enrichment | | Contacts CSV | Names + companies, missing contact info | Skip to people-enrichment | | Signal data | Companies found via signals | Skip to company-enrichment/scoring | | Demo webhook | ICP prompt, ~10 contacts scope | Run demo skill | | SN search URL | Sales Navigator saved search | Run company-search (SN+PB) → continue |
Step 2 — Determine Workflow
Company-First Workflow (Finite Markets)
When: Client provides a company list, known industry, or uses Sales Navigator. The market is bounded — you know (or can enumerate) the target companies.
Full sequence:
1. Company Search → csv/input/companies_raw.csv
2. Company Enrichment → csv/intermediate/companies_enriched.csv
3. ICP Scoring → csv/intermediate/companies_scored.csv (credit-saving gate: icp_score >= 70)
4. Signal Search → csv/intermediate/signals.csv (runs on gated set; doesn't read icp_score)
5. People Search → csv/intermediate/contacts_found.csv
6. Contact Filter → csv/intermediate/contacts_filtered.csv
7. People Enrichment → csv/output/contacts_enriched.csv
The icp_score >= 70 gate at step 3 is for credit savings only — signal-search itself doesn't depend on the ICP score. Skip the gate if you want to score signals on the full enriched set.
Signal-First Workflow (Infinite Markets)
When: No company list — discover companies via buying intent signals. The market is unbounded — you find companies by their behavior.
Full sequence:
1. Signal-based Discovery → companies found via signals (FindAll, Firecrawl Agent, LinkedIn Jobs)
writes csv/input/companies_raw.csv
2. Company Enrichment → csv/intermediate/companies_enriched.csv
3. ICP Scoring → csv/intermediate/companies_scored.csv (optional gate)
4. People Search → csv/intermediate/contacts_found.csv
5. Contact Filter → csv/intermediate/contacts_filtered.csv
6. People Enrichment → csv/output/contacts_enriched.csv
In Signal-First, signal-search runs on raw company names from the discovery channels (no enrichment needed yet). Company enrichment and ICP scoring happen after to filter the discovered set.
Shortcut Flows
| Starting Point | Skills Invoked | |----------------|---------------| | Demo webhook (ICP prompt only) | demo skill (people-search → contact-filter → people-enrichment → messages, 10 contacts, no phone) | | Company list provided | company-enrichment → (optional: signal-search) → people-search → contact-filter → people-enrichment | | Contacts CSV provided | people-enrichment only | | Persona prospecting (no companies) | people-search (persona mode) → contact-filter → people-enrichment | | Full pipeline (Stripe payment) | Full Workflow 1 or 2 based on requirements |
Step 3 — Clarify Requirements
Before executing, confirm with the user:
ICP Definition
- Industry / vertical
- Target roles / job titles
- Company size (headcount range)
- Location / geography
- Revenue range (if relevant)
- Exclusions (e.g. no software companies, no enterprise)
Scope & Budget
- How many contacts needed? (10 for demo, 100+, 500+?)
- Credit budget constraints?
- Enrichment scope: email only? email + phone?
- Message generation needed?
Trigger Context
- Demo mode? (no phone, ~10 contacts)
- Stripe payment? (full pipeline, budget confirmed)
- Manual request? (flexible scope)
Save ICP to {client-slug}-gtm/context/icp.md.
Step 4 — Plan the Sequence
Based on workflow + starting point, build the execution plan:
- List which skills run, in what order
- Recommend providers at each step (with costs from skill docs)
- Estimate total credits and cost across all steps
- Identify n8n flow customizations needed:
- ICP Google Doc (for ICP scoring in company-enrichment)
- Offering section (for signal scoring in signal-search)
- Present plan for user approval before executing anything
Cost Estimation Template
## Pipeline Cost Estimate
### Step 1: Company Search
- Provider: [recommended]
- Records: ~{n}
- Est. cost: {credits} credits (~${cost})
### Step 2: Company Enrichment
- Provider: [recommended]
- Records: ~{n}
- Est. cost: {credits} credits (~${cost})
### Step 3: ICP Scoring
- LLM: [ask user which model]
- Records: ~{n}
- Est. cost: ~${cost} (LLM token pricing)
### Step 4: Signal Search (companies with icp_score >= 70 if gating)
- Sources: [which of the 4 sources]
- LLM for scoring: [ask user]
- Records: ~{n} (est. {pct}% pass ICP gate, or full set if no gate)
- Est. cost: {credits} credits + ~${llm_cost}
### Step 5: People Search
- Provider: [recommended]
- Records: ~{n} contacts across ~{m} companies
- Est. cost: {credits} credits (~${cost})
### Step 6: Contact Filter
- No API cost — local classification only
- Records: ~{n} contacts in → ~{n_filtered} contacts out (est. {pct}% pass ICP filter)
- ICP dimensions: job tier, industry tier, location tier, company size
### Step 7: People Enrichment
- Email provider: [recommended]
- Phone provider: [recommended or "skip — demo mode"]
- Records: ~{n}
- Est. cost: {credits} credits (~${cost})
### Total
- Credits: ~{total_credits}
- Cost: ~${total_cost}
Step 5 — Execute and Chain
Invoke skills in order. After each step:
- Review output quality — hit rates, data completeness, issues
- Log to run_log.md — timestamp, provider, records, credits, duration
- Log provider performance — to
context/provider_performance.md - Chain output → input — each skill's output CSV becomes the next skill's input
- Decide whether to proceed — if quality is poor, flag and discuss before continuing
Chaining Rules
| Skill Output | Next Skill Input | |-------------|-----------------| | csv/input/companies_raw.csv | company-enrichment reads this | | csv/intermediate/companies_enriched.csv | ICP scoring reads this | | csv/intermediate/companies_scored.csv | signal-search reads this (optional credit-saving gate: icp_score >= 70) | | csv/intermediate/signals.csv | Used for outreach context, not a direct input | | csv/intermediate/contacts_found.csv | contact-filter reads this | | csv/intermediate/contacts_filtered.csv | people-enrichment reads this | | csv/output/contacts_enriched.csv | Final output — ready for outreach or message generation |
After Each Step
Print the standardized Run Summary (from conventions.md) and ask:
- Results look good? Proceed to next step?
- Any issues to address first?
- Want to adjust providers or parameters?
Step 6 — Customize Per Client
ICP Scoring (company-enrichment Phase 2 — n8n-backed)
- Create/connect a Google Doc with the client's ICP definition
- Or write to
context/icp.mdand use that as the reference - Adjust score threshold (default: >= 70) based on selectivity
Signal Assessment (signal-search — script-based)
Signal-search runs ~/.claude/skills/gtm-signal-search/signal_search.py. Universal templates (extraction prompts, scoring rubric, request shapes) are baked into the script. Client-specific prompts come from three context files:
context/icp.md— ICP definition (typically written bygtm-setup)context/offering.md— what we sell, value props (used in the scoring prompt). If absent, the script falls back tocontext/profile.md.context/signal_criteria.md— what counts as a signal for this offering: an include list + a short "not a signal" exclude list (used in the web-search objective + both extraction prompts)
Before invoking signal-search:
- Confirm all three files exist; collect any missing pieces from the user. If
signal_criteria.mdis thin, help the user construct it (include + exclude + tuning params like max-age and result count) — see the signal-search skill's Step 2 for the interview. - Pick which optional sources to enable (
--firecrawlor--firecrawl-pages-dir,--parallel-enrichment) based on whether on-site content / structured fields matter for this client. Use--firecrawl-pages-dir(Firecrawl-via-MCP) when there is noFIRECRAWL_API_KEYin the env.
No n8n workflow edits are required for signal-search anymore — the script reads everything from context/ at runtime. Keys are injected via _shared/resolve_env.sh (resolves $GTM_ENV_PATH on any machine).
Working Directory
The pipeline creates and manages the full directory structure:
{client-slug}-gtm/
├── context/
│ ├── icp.md
│ └── provider_performance.md
├── prompts/
│ └── message_prompt.md (demo only)
├── csv/
│ ├── input/
│ │ ├── companies_raw.csv
│ │ └── contacts_raw.csv
│ ├── intermediate/
│ │ ├── companies_enriched.csv
│ │ ├── companies_scored.csv
│ │ ├── signals.csv
│ │ ├── contacts_found.csv
│ │ ├── contacts_filtered.csv
│ │ └── request_ids.json
│ └── output/
│ ├── contacts_enriched.csv
│ └── messages.csv (demo only)
└── run_log.md
Decision Logic Summary
IF demo mode:
→ Run demo skill directly
IF user has contacts CSV:
→ people-enrichment only
IF user has company list:
→ company-enrichment → (optional: signal-search) → people-search → people-enrichment
IF user has nothing (just ICP):
→ Ask: Company-First or Signal-First?
→ Company-First: company-search → company-enrichment → signal-search → people-search → contact-filter → people-enrichment
→ Signal-First: signal-search (discovery) → company-enrichment → people-search → contact-filter → people-enrichment
IF paid trigger (e.g. Stripe webhook):
→ Full pipeline based on workflow determination above
What's Missing (To Document)
- Payment trigger integration (e.g. Stripe webhook → pipeline invocation)
- Automated webhook integration for demo triggers
- Orchestration platform (e.g. n8n) integration for creating client-specific flow copies
- Pipeline recovery: resuming a partially completed pipeline from the last successful step
- Cost tracking dashboard / running totals across multiple pipeline runs
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: keinsaasforever
- Source: keinsaasforever/gtm-pipeline-skills
- License: MIT
- Homepage: https://www.keinsaas.com/de/research-agent
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.