GTM Engineering
Signal-to-CRM Growth Automation
Self-directed · trial-tier · non-productionA GTM pipeline that turns a raw account list into a prioritized, CRM-ready book: enrich → score by ICP-fit and buying intent → sync to the CRM → alert sales on the hottest, plus a Claude agent that reads the scored book and briefs leadership with a weekly RevOps digest and auto-generated PowerPoint slides.
Built on trial accounts with real companies from public sources; the agent runs on the live CRM data.
Clay · HubSpot · Zapier · Slack · Python · Claude API (tool-use agent) · python-pptx · enrichment waterfalls · ICP/intent scoring · webhooks
System overview
Source → Enrich → Score → Sync → Route (Hot → Slack) → Brief (AI agent → Slack digest + Markdown + .pptx)
I built this to demonstrate signal-based account prioritization end-to-end: find the accounts that are both the right fit and showing buying signals right now, get them in front of sales automatically, and then put an AI agent on top of it. A list of 32 real companies flows through a Clay enrichment waterfall, gets scored on ICP-fit and intent, and routes through Zapier into HubSpot with Slack alerts on the hottest tier. A Claude agent then reads the scored book back out of HubSpot, reasons over it, and posts a decision-ready leadership digest to Slack. The same structured digest also renders to Markdown and a decision-ready PowerPoint deck: no second LLM call, pure templated slides from the agent’s output.
Results: 32 sourced → 30 synced (11 Hot · 15 MQL · 3 Nurture · 1 Low), 2 disqualified. Weekly leadership digest + deck generated by a Claude tool-use agent (Slack + Markdown + PowerPoint).
Key decisions: pipeline
Enrichment waterfall
Primary firmographics missed the youngest seed startups that form my ICP core. An AI classifier runs only on thin rows and coalesces into one clean scoring input set. Primary-then-fallback, not a single lookup.
Fit gates intent
An ICP score (industry, stage, size, geo) gates every account before expensive signal enrichment. Credits go only to accounts that clear fit, so a non-ICP company with hot signals still can't route to sales.
Credit discipline
Gated expensive enrichments behind the ICP gate, tested every column on 3–5 rows before the full table, and kept scoring in free formula columns. Full enrichment of 32 accounts used ~233 of 2,000 trial credits.
Data-quality catches
Caught a wrong domain that would have enriched the wrong company, a funding tracker's placeholder dates posing as real announcement dates, and a provider returning arrays where I expected strings. Each issue was documented and handled.
Sync gate vs. alert gate
All non-disqualified accounts sync to the CRM (the working book); only the Hot tier triggers Slack. The CRM holds the full pipeline while alerts stay signal, not noise.
Threshold calibration
Retuned the Hot cutoff when too many accounts cleared it. Hot has to mean call today, or a team learns to ignore it.
AI reporting agent
A weekly RevOps digest written by a Claude agent that reasons over the live scored book: which accounts to prioritize and why, what changed since last week, what to do next. Not a templated recap. On its first real run it clustered three accounts (BackOps AI, Jazz, Onyx) into a security/AI-software vertical and recommended a shared outbound motion, and flagged the one Hot account that qualified on intent despite a below-ICP fit score as an edge case to sanity-check. Patterns nobody encoded.
Agentic where it adds value
Python owns the HubSpot read and the run-over-run diff: deterministic, reliable, no LLM in the data path. Claude runs a bounded tool-use loop: it decides which accounts are noteworthy, calls a drill-down tool to investigate the signal drivers, then calls a submit tool to return a schema-validated digest. Reasoning where reasoning helps; determinism where reliability matters.
Deck from structure, not another prompt
Once the agent submits a schema-validated digest, a separate renderer turns it into leadership slides (pipeline chart, TL;DR, priorities, themes, changes, full-book appendix). Deterministic, offline-testable, same path in dry-run and live.
Memory via run-over-run state
Each run snapshots segments and scores, so the next digest reports real movement: new Hot accounts, segment upgrades and downgrades, score swings. Not a re-description of a static list.
Scope + data quality at the reporting layer
The CRM held 17 companies predating the pipeline. I scoped the agent to pipeline-owned records via their structured record_id rather than a segment proxy, so the digest reports the scored book, not incidental CRM history. Also caught a state bug where mock and live runs shared a baseline and fabricated changes.
Production-minded
Retries with backoff on the model call, a clear auth error on a bad token, an empty-book short-circuit that skips the model entirely, and a Slack failure-alert on any fatal error: the same alert-on-failure pattern as the upstream pipeline. Runs on a schedule or trigger.
In the tools
Scored Clay table
32 real accounts · Clay waterfall + ICP/intent scoring · HubSpot sync · Slack Hot alerts · Claude tool-use agent · auto-generated leadership deck · ~233 / 2,000 Clay trial credits.





