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
FAQ
headless-gtm is a Claude Code plugin with 17 hand-picked skills for marketing work, indexed on Flowy. Install it with the command on its page. It includes 00-gtm-router, 01-icp-qualify, 01-prospeo-discover. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add Zevenue/headless-gtm> /plugin install headless-gtm@headless-gtm
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 browser tabs, with cost approved before any credit is spent.
This is the discovery-to-resolution chain Zevenue runs on client work, published as installable skills. No orchestration platform, no per-seat tools. The coding agent is the operator, the vendor APIs are the backend, and the skills encode the methodology.
| # | Skill | Wraps | Job (in -> out) |
|---|---|---|---|
| 00 | 00-gtm-router | the rest of the chain | ICP + budget + volume -> the right chain, with per-step cost estimates, then supervised execution. |
| 01 | 01-prospeo-discover | Prospeo | Plain-English ICP -> firmographic company list. TAM sizing, 33 filters. |
| 01 | 01-prospeo-lookalike | Prospeo | Seed companies -> ranked lookalikes, or a pattern-built ICP handed back to discover for the broad search. |
| 01 | 01-icp-qualify | model judgment (no API) | Discovered companies -> the ones that could plausibly buy. The free gate that runs before any credit is spent. |
| 02 | 02-apify-maps-discover | Apify (Compass actor) | Vertical + geo -> local-business prospect list from Google Maps, normalized records. |
| 03 | 03-firecrawl-research | Firecrawl | Domain -> clean, page-typed markdown (homepage, about, careers, pricing...) or structured JSON. |
| 04 | 04-crustdata-signals | CrustData | Domains -> funding rounds, headcount growth, department growth, recent hires. |
| 04 | 04-theirstack-jobs | TheirStack | Domains -> open reqs, titles, seniority, hiring team. Also searches "companies hiring X right now" directly. |
| 05 | 05-signal-builder | model judgment (no API) | Scraped pages + structured signals -> ranked signals with verbatim provenance, 1-10 scores, and a campaign approach per signal. |
| 06 | 06-resolution-email-person | AI Ark -> Prospeo -> Blitz -> Findymail + ZeroBounce | Domain (+ optional name or title) -> verified, send-safe email. Waterfall by cost, validate everything. |
| 07 | 07-campaign-sheet | stdlib script (no API) | Terminal records -> an owner-readable campaign sheet + a HubSpot-import-shaped CSV. The chain's exit door; nothing downstream reads it. |
Prefixes are folder names, not a strict run order. The gate (01-icp-qualify) is numbered with discovery but runs after it, and 04-theirstack-jobs doubles as the discovery route when the ICP is itself a hiring event.
flowchart LR
R["00 gtm-router<br/><i>picks the chain</i>"]
subgraph DISC["Discover"]
D1["01 prospeo-discover<br/>B2B databases"]
D2["01 prospeo-lookalike<br/>from seed companies"]
D3["02 apify-maps-discover<br/>local / SMB"]
end
Q["01 icp-qualify<br/><i>free gate: fit before spend</i>"]
E["03 firecrawl-research<br/>read the websites"]
subgraph SIG["Signals"]
S1["04 crustdata-signals<br/>funding · headcount · hires"]
S2["04 theirstack-jobs<br/>open reqs · hiring team"]
end
J["05 signal-builder<br/>judgment: rank + approach"]
RES["06 resolution<br/>verified email"]
W["email-writer<br/><i>writes the copy</i>"]
CS["07 campaign-sheet<br/><i>owner sheet + CSV</i>"]
R -.orchestrates.-> DISC
R -.-> Q & E & SIG & J & RES
DISC --> Q
Q --> E --> J
Q --> SIG --> J
J --> RES --> W --> CS
Start anywhere: the router enters the chain at the first step whose input is missing. Already have a domain list? Gate it, then start at 03/04. Have example companies instead of a described ICP? Start at lookalike - that list is seeds, not targets. Have contacts without emails? Start at 06. Hiring-defined ICPs ("companies with an open SDR req") skip firmographic discovery entirely and enter at 04-theirstack-jobs in discover mode, whose sizing count is free.
Most GTM tooling advice stops at "use Firecrawl for scraping." The hard part is everything between the tools:
./runs/ root in your working directory. Each step adds fields and never overwrites upstream ones, so any skill's output is any later skill's input, and an interrupted run resumes without re-spending. See headless-gtm-shared/CONVENTIONS.md.info@ addresses.decision-tree.md.In our internal benchmark (4 scenarios, 27 assertions), chains run through the router scored 100% with zero variance vs 84% (±19) for the same setup without it, at equal time and token cost. The edge isn't tool knowledge - it's the enforced operating contract.
Where the chain hands off. Optional, but the chain's output is shaped to feed it:
| Skill | What it does |
|---|---|
email-writer | 3-email cold sequences using the Situation -> Insight -> Inquisition methodology, with deliverability rules and a QA checklist. |
creative-variable | Specs the personalization variables for a campaign - names, grammar, sources, extraction prompts, fallbacks. |
prospect-posts | Scans prospects' recent LinkedIn posts for a theme. Account intelligence input. |
gtm-context | Persists your offer + ICP as context files, so the router and the gate don't re-interview you every run. Run once per workspace if you're using the writing skills. |
Where the chain skills are building blocks, a workflow is a packaged sequence that runs a fixed path start to finish with an owner approval between every step. Say what you want in plain English, or invoke it by name.
| Workflow | What it does | Just say... | Skills used | Keys required |
|---|---|---|---|---|
run-first-campaign | The cold start: an owner with no list, no CRM, and no outbound history taken to an approved campaign sheet in one supervised pass. Proposes a source of record - a public directory (registry, college, association, marketplace) for local businesses, or a firmographic pull (prospeo, theirstack) for B2B - then extracts or pulls it, qualifies for free, ranks, drafts a 3-email sequence, and exports the sheet. | "run my first campaign", "I need customers but have nothing to analyze" | discovery (03 or 01-prospeo-discover / 04-theirstack-jobs) -> 01-icp-qualify -> 05 -> email-writer -> 07 | None to plan, qualify, rank, and write; one discovery key for the sourcing step (FIRECRAWL_API_KEY for a directory, PROSPEO_API_KEY or THEIRSTACK_API_KEY for a B2B pull) |
Works in Claude Code and Codex - the skills follow the agent skills standard (SKILL.md + frontmatter), and every script is plain Python on env-var keys. Python 3.10+.
Skills live in the tool-neutral top-level skills/ directory, one folder per skill - the same layout as anthropics/skills. Pick one of the four routes below.
A. Install into a project you're working in (most common)
From that project's root, not from a clone of this repo:
npx skills add Zevenue/headless-gtm
The installer detects your agent and writes to .claude/skills/ (Claude Code) or .agents/skills/ (Codex). Add -g to install globally instead - ~/.claude/skills/ or ~/.codex/skills/.
B. Run from a clone - to read the source, change a skill, or try the chain without touching another project:
git clone https://github.com/Zevenue/headless-gtm.git
cd headless-gtm
mkdir -p .claude/skills && cp -R skills/* .claude/skills/ # Claude Code
mkdir -p .agents/skills && cp -R skills/* .agents/skills/ # Codex
The copy line makes claude or codex started in this directory find the skills. (These used to be symlinks committed to the repo, but committed symlinks break web-based plugin installers - e.g. the Cowork plugin directory - so the copy is now a local step.)
C. Copy by hand - cp -R skills/* ~/.claude/skills/ (or ~/.codex/skills/, or a project's .claude/skills/). If you copy individual skills rather than all of them, bring skills/headless-gtm-shared/ too - the chain skills import their helpers and read the record contract from it, and they exit with an explicit error if it's missing.
D. Install as a Claude Code plugin - registers the skills and the run-first-campaign workflow command as a managed plugin:
claude plugin marketplace add Zevenue/headless-gtm
claude plugin install headless-gtm@headless-gtm
The marketplace and plugin manifests live in .claude-plugin/. Plugin skills are always namespaced, so as a plugin the workflow is invoked as /headless-gtm:run-first-campaign (the plain /run-first-campaign form applies to routes A-C, where skills install unnamespaced). This is additive to route A - use it when you want the workflow registered as a first-class command; the skills themselves are identical.
Then, in whichever directory you'll actually run from:
cp .env.example .env
pip install -r requirements.txt
.env is read by the scripts themselves - no export needed, and an exported variable always wins over the file. The chain writes its output to ./runs/<run-id>/ in that same working directory, never into the installed skill.
If you use the writing skills, also copy context/ into your project root.
Every key is optional. .env.example lists all of them with signup links. Keys buy exactly one thing: data acquisition. The judgment half of the chain is model-only - no vendor, no account, no credits.
With no keys at all, you can still:
00-gtm-router). It costs out every step before you buy anything, so you can decide which vendor accounts are actually worth opening.01-icp-qualify). CSV in, verdicts with evidence out. Rows without a description get a plain-HTTP homepage fetch, which needs no scraping service.05-signal-builder) from a URL or pasted content.email-writer, creative-variable, gtm-context).What you can't do without keys is acquire raw data - find companies you don't have, read their sites at scale, pull funding or hiring signals, resolve emails.
| Key | Unlocks | Without it |
|---|---|---|
PROSPEO_API_KEY | 01 discover + lookalike, and the Prospeo rung of 06 | No firmographic discovery. Bring your own list and enter at the gate. |
APIFY_API_TOKEN | 02 Maps discovery, prospect-posts | No local/SMB discovery. |
FIRECRAWL_API_KEY | 03 site extraction | 05 still judges, but only on what you paste or on vendor signals. |
CRUSTDATA_API_KEY | 04 funding, headcount, recent hires | No "what already happened" signals. |
THEIRSTACK_API_KEY | 04 open roles, and hiring-defined discovery | No hiring signals. |
AIARK_API_KEY, BLITZ_API_KEY, FINDYMAIL_API_KEY, ZEROBOUNCE_API_KEY | The 06 resolution waterfall and its validation | Each missing rung is skipped, not fatal - the waterfall runs on whichever you have. One key is enough to resolve email; ZeroBounce is what makes results send-safe rather than guessed. |
A missing key never crashes a run. The skill logs which layer it skipped and why, and the router marks that step manual in the plan rather than silently rerouting the methodology.
Two ways in without committing to a stack:
04-theirstack-jobs can size a market and tell you what a pull would cost before you spend a credit.Describe what you want and the right skill triggers - or invoke by name:
new client ICP: B2B SaaS, US, 50-500 headcount, budget $200 -> 00-gtm-router plans the chain
qualify this list against the ICP before we enrich it -> 01-icp-qualify
laundromats in Texas metros -> 02-apify-maps-discover
rank these accounts - who do we email first, with what angle -> 05-signal-builder
find the owner's email for these 40 domains -> 06-resolution-email-person
Each skill's SKILL.md is the authoritative spec for what it expects and returns.
Adds the first packaged workflow and makes the repo installable as a plugin:
run-first-campaign, the cold-start workflow - context to approved campaign sheet in one supervised pass, for an owner with no list and no CRM07-campaign-sheet, the chain's exit door - terminal records to an owner-readable sheet plus a HubSpot-import CSV.claude-plugin/ manifests, route D above); the npx skills add and copy routes are unchanged03-firecrawl-research gains directory and registry extraction - one listing URL to N company records, the discovery path for web-scattered ICPsThis repo was previously Zevenue/gtm-skills (v1: the methodology skills only). v2.0 renames it to Headless GTM, adds the numbered API chain, and makes everything run in both Claude Code and Codex:
headless-gtm-shared/signal-builder -> 05-signal-builder (chain-native), job-search -> 04-theirstack-jobs (free sizing counts, discover mode, credit caching)gtm-context, email-writer, creative-variable, prospect-postsOld links redirect. Evals for every skill are maintained in Zevenue's private source repo and run before each release.
MIT. See LICENSE.
Zevenue is a Toronto-based GTM engineering firm. We build custom outbound + RevOps systems for GTM teams. Reach me at: yusuf@zevenue.com
.claude-plugin/
marketplace.json
plugin.json
.env.example
.gitignore
AGENTS.md
CLAUDE.md
context/
outreach/
email-voice-and-tone.md
outreach-principles.md
playbooks/
copy-variable-design.md
LICENSE
README.md
requirements.txt
skills/
00-gtm-router/
README.md
references/
decision-tree.md
unit-costs.md
SKILL.md
01-icp-qualify/
README.md
references/
brief-template.md
dq-catalog.md
SKILL.md
01-prospeo-discover/
README.md
references/
api-curl.md
enum-refresh.md
filters-full.md
mapping-examples.md
plan-filter-map.md
prospeo-enums.json
scripts/
sheets_export.py
SKILL.md
01-prospeo-lookalike/
README.md
references/
api-curl.md
enum-refresh.md
filters-full.md
lookalike-modes.md
mapping-examples.md
plan-filter-map.md
prospeo-enums.json
scripts/
sheets_export.py
SKILL.md
02-apify-maps-discover/
discover.py
README.md
reference/
compass-actor.md
cost-model.md
examples.md
output-schema.md
troubleshooting.md
verticals-and-geo.md
SKILL.md
03-firecrawl-research/
README.md
references/
cost-guide.md
firecrawl-endpoints.md
page-types.md
scripts/
firecrawl_scrape.py
sheets_writer.py
SKILL.md
04-crustdata-signals/
README.md
references/
enrich-api.md
person-search-api.md
scripts/
crustdata_signals.py
sheets_writer.py
SKILL.md
04-theirstack-jobs/
README.md
references/
jobs-api.md
scripts/
theirstack_jobs.py
SKILL.md
05-signal-builder/
README.md
references/
calibration-guide.md
signal-types-b2b-saas.md
signal-types-vertical-smb.md
scripts/
signal_io.py
SKILL.md
06-resolution-email-person/
README.md
references/
input-handling.md
providers.md
SKILL.md
07-campaign-sheet/
README.md
scripts/
campaign_sheet.py
SKILL.md
creative-variable/
reference/
extended-sources.md
prompt-design.md
source-selection.md
variable-archetypes.md
worked-example.md
SKILL.md
email-writer/
reference/
examples.md
sequence-framework.md
SKILL.md
gtm-context/
reference/
context-schema.md
SKILL.md
headless-gtm-shared/
common.py
CONVENTIONS.md
requirements.txt
schema.py
SKILL.md
prospect-posts/
scripts/
prospect_posts.py
SKILL.md
run-first-campaign/
README.md
reference/
examples/
happy-path.md
gotchas.md
presets/
dealer-services/
icp.md
offer.md
local-services/
icp.md
offer.md
SKILL.md© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic