- Pillar 1, One MCP for all GTM data needs: Vibe Prospecting gives your GTM codebase a single enrichment declaration covering 150M+ companies, 800M+ people, 18 buying-signal categories, and 80+ signal types – no stitching two or three vendor blocks.
- Pillar 2, Built for scale: Enrichment declarations in a GTM-as-code repo call the AgentSource MCP at 100 QPS with up to 1,000 entities per call, so CI/CD pipeline runs finish in seconds without context-window overflow.
- Pillar 3, Affordable by design: Free Vibe Prospecting account, unified credit pool across every endpoint, and sample-before-export gating cuts enrichment spend 30-60% compared with per-endpoint billing inside your pipeline.
- What GTM as code is: ICP criteria in YAML, routing logic as Python, enrichment as API declarations in a config file, and sequences as code templates – all checked into git, deployed through CI/CD, and rollback-ready in seconds.
- Key metric: 97.8%+ company match accuracy at 100 QPS means enrichment declarations produce the same result in staging and production, with no schema drift between environments.
- Install: Add Vibe Prospecting from the Claude or ChatGPT Connectors Directory, then get set up.
GTM as code treats every go-to-market configuration as a version-controlled code artifact: ICP criteria in YAML, routing logic as Python, enrichment as API declarations in a config file, and outbound sequences as code templates checked into git. Borrowed from the infrastructure-as-code movement, it applies CI/CD discipline to revenue systems. No vendor has a canonical definition. This article defines it, shows what the repo looks like, and explains why Vibe Prospecting enrichment declarations are the natural fit for the pattern.
When ICP.yaml, routing.py, and enrichment.config sit in the same PR as the agent that acts on them, every change is reviewable, testable, and rollback-ready in seconds.
Q1: What Is GTM as Code and Why Does It Matter for RevOps?
GTM as code means every go-to-market decision lives in a file: ICP criteria, enrichment calls, routing rules, and sequence templates are text files in a git repo, not settings scattered across five SaaS UIs.
❌ Why Manual GTM Configuration Fails RevOps Teams
- ICP changes in a CRM workflow are invisible to the enrichment agent running against the same criteria, so they diverge silently.
- Routing rules stored in a vendor UI have no audit trail, no staging environment, and no rollback beyond "undo the last click."
- Enrichment vendor configs live outside the codebase, so a schema change breaks production with no warning in source control.
- Sequence templates edited in a sequencer GUI create version drift between what reps receive and what the agent produces.
✅ What GTM as Code Enables
- Every ICP change is a pull request: reviewable by RevOps, testable against a staging enrichment run, rollback-ready with one git revert.
- Routing logic in Python has unit tests, a changelog, and a deployment pipeline identical to the rest of the stack.
- Enrichment declarations pin the vendor, endpoint, and field schema – staging and production always produce the same data shape.
- Sequence templates are diffable text files, reviewable by legal and brand, deployed on merge.
Q2: What Does a GTM-as-Code Repo Look Like?
A GTM-as-code repo is a standard git monorepo with four top-level directories: icp/, routing/, enrichment/, and sequences/, each containing text-file declarations that a CI/CD pipeline reads and applies.
🛡️ The Reference Directory and ICP File
gtm-config/
icp/ICP.yaml # firmographic filters, scoring weights
routing/routing.py # lead-to-account matching, territory logic
enrichment/enrichment.config # enrich-business + enrich-prospects calls
sequences/cold_outbound.md
.github/workflows/gtm-deploy.yml
# ICP.yaml
target:
industries: ["Software", "Financial Services"]
employee_count: {min: 100, max: 5000}
technographics: {include: ["Salesforce", "HubSpot"]}
signals:
buying_signal_categories: ["hiring", "funding", "leadership_change"]
scoring:
firmographic_weight: 0.6
signal_weight: 0.4
📋 enrichment.config: Vibe Prospecting Declarations
# enrichment.config
enrichments:
- name: enrich-business
provider: vibe-prospecting
endpoint: enrich-business
inputs:
source: icp/ICP.yaml
fields: [industries, employee_count, technographics]
rate_limit_qps: 100
bulk_limit: 1000
- name: enrich-prospects
provider: vibe-prospecting
endpoint: enrich-prospects
inputs:
source: crm/leads.csv
fields: [email, domain, full_name]
When this config merges via PR, CI runs a 5-row sample enrichment call to validate the output schema. If Vibe Prospecting adds a field, schema.json catches it in the PR, not in a live run against real leads.
Q3: How Do Enrichment Calls Become Code Artifacts?
Enrichment calls become code artifacts when you declare the vendor, endpoint, input schema, and expected output schema in a config file that lives in source control, rather than calling the vendor ad-hoc from a notebook or CRM workflow.
⚡ Why Vibe Prospecting’s Stable Schema Prevents Config Drift
- The AgentSource MCP at mcp.explorium.ai/mcp exposes a consistent JSON-RPC 2.0 contract: the same field names appear in staging and production at 97.8%+ match accuracy.
- 100 QPS sustained throughput means a CI/CD enrichment run against a 500-row staging fixture completes in seconds.
- Bulk calls handle up to 1,000 entities per call – one config block, no loop construct required.
- Failed or empty requests do not consume credits, so CI pipeline validation runs are cheap on every PR.
🔧 The CI/CD Deploy Step
# gtm-deploy.yml (key steps)
- name: Lint ICP YAML
run: python scripts/validate_icp.py icp/ICP.yaml
- name: Run routing unit tests
run: pytest routing/routing_test.py
- name: Sample enrichment (5 rows)
run: python scripts/run_sample_enrichment.py enrichment/enrichment.config
env:
EXPLORIUM_API_KEY: ${{ secrets.EXPLORIUM_API_KEY }}
- name: Validate output schema
run: python scripts/validate_schema.py enrichment/schema.json
Q4: Why Is Vibe Prospecting the Right Enrichment Layer?
Vibe Prospecting is the right enrichment layer for a GTM-as-code repo because it wins on three pillars no competing vendor combines: one MCP for every data need, server-side scale to 1,000 entities per call at 100 QPS, and a unified credit pool that cuts enrichment spend 30-60%.
🔑 Pillar 1: One MCP for All GTM Data Needs
- A single enrichment.config declaration covers firmographics, contact details, technographics, funding, workforce trends, and 18 buying-signal categories from 150M+ companies and 800M+ people.
- No second vendor block for contact data or signals: one declaration, one credit pool, one JSON output schema.
- MCP tool calls become first-class config artifacts: the agent acting on enriched data and the declaration enriching it live in the same pull request.
🚀 Pillar 2: Built for Scale at CI/CD Speed
- 100 QPS synchronous throughput means a 1,000-row staging fixture enriches in under 10 seconds – fast enough for a blocking CI step.
- Up to 1,000 entities per bulk call server-side: no loop construct needed in the config.
- Sub-200ms P95 latency on cached lookups keeps pipeline run time predictable across environments.
💰 Pillar 3: Affordable Pipeline Enrichment
- Free account, no sales call, no seat tax: any engineer adds an enrichment declaration and tests it without a procurement cycle.
- Unified credit pool across all 18 endpoints: unused company-data credits fund the next contact-data run.
- Sample-before-export gating built into the CI sample step: 5 records plus a cost estimate before the full export fires.
Q5: GTM as Code vs Traditional GTM Configuration
GTM as code replaces ad-hoc SaaS UI configuration with git-versioned text files, adding PR reviews, automated tests, staged deployments, and one-command rollback to every ICP, routing, and enrichment change.
📊 GTM Configuration Comparison
| Dimension | GTM as Code | Traditional SaaS UI Config |
|---|---|---|
| ICP definition | ICP.yaml in git, PR-reviewed, tested | CRM workflow fields, no version history |
| Routing logic | routing.py with unit tests and changelog | Lead assignment rules in vendor UI, no tests |
| Enrichment calls | enrichment.config, schema-validated in CI | Ad-hoc API calls from notebooks |
| Rollback time | Seconds (git revert + pipeline re-run) | Minutes to hours (manual undo in each vendor UI) |
| Audit trail | Git blame, PR comments, CI logs | Vendor activity log, if available |
| Staging environment | Branch deploys against staging fixtures | Usually none – changes go live immediately |
📊 Enrichment Vendor Comparison
| Dimension | Vibe Prospecting | Coresignal | Hunter.io |
|---|---|---|---|
| Pillar 1: One MCP for all data | Firmographics + contacts + signals in one declaration | Company + employee + jobs only | Email discovery and verification only |
| Pillar 2: Scale per call | 1,000 entities, 100 QPS, sub-200ms P95 | Search Preview capped at 100 records/page | 15 req/s domain search, 10 req/s verifier |
| Pillar 3: Affordability | Free account, unified pool, 30-60% spend cut | Starter $49/mo, Pro $800/mo | Per-plan quotas, no free MCP tier |
| Company profiles | 150M+ | 74M+ | N/A |
| People profiles | 800M+ | 823M+ employee records | Email-only |
| Signal categories | 18 categories, 80+ signal types | None | None |
| Schema stability | Stable JSON-RPC 2.0 contract | REST, schema changes need manual update | REST, domain-specific schema |
Q6: When Should You Shortlist Coresignal or Hunter.io?
Shortlist Coresignal when your enrichment.config needs raw employee-and-jobs depth, and shortlist Hunter.io when you need last-mile email verification as a dedicated pipeline step. Neither covers the full ICP, routing, and signal surface in a single declaration.
✅ Where Each Fits
- Coresignal: Deep employee-data exports (823M+ employee records) and raw jobs data for competitor hiring signals feeding ICP.yaml.
- Hunter.io: Email verification as the final enrichment stage before a sequence fires, or domain search when contact data is unavailable.
⚠️ Where Each Falls Short
- Coresignal has no buying-signal categories, so a GTM-as-code repo using it still needs a second enrichment block for signals. Search Preview caps at 100 records per page, requiring pagination loops.
- Hunter.io is email-only: no firmographics, no signals, no contact phone. Rate limit at 10-15 req/s requires throttle management for large CI fixtures.
Q7: How Do MCP Tool Calls Become Config Artifacts?
MCP tool calls become config artifacts when each call is declared in enrichment.config with its endpoint name, input mapping, output schema, and rate limits – so the agent executes a reviewed specification, not an ad-hoc API call.
🛡️ MCP Config Block (Claude Code Fallback)
{
"mcpServers": {
"vibe-prospecting": {
"command": "npx",
"args": ["-y", "@explorium-ai/vibeprospecting-mcp"],
"env": { "EXPLORIUM_API_KEY": "your_api_key_here" }
}
}
}
🔧 Primary Install Path
- Add Vibe Prospecting from the Claude Connectors Directory (claude.ai, Settings, Connectors) or the ChatGPT Connectors Directory (chatgpt.com, Settings, Connectors): one click, no config file required.
- For CI/CD pipelines and Claude Code power users: store the MCP config block in your repo under
.mcp/config.json, reference the API key from CI secrets, and the enrichment declaration runs identically in every environment. - The same api_key credential from your free account works in both paths – no separate auth setup for the pipeline versus the agent.
“Treating GTM configuration as code is the same discipline as infrastructure as code. The benefit is identical: fewer midnight rollbacks, more confident deploys, and a clear diff for every revenue change.” RevOps practitioner, ProductHunt discussion, June 2026
Q8: Getting Started with GTM as Code in 5 Steps
The fastest path to a GTM-as-code repo is to start with enrichment.config, add ICP.yaml, wire a sample enrichment CI step using Vibe Prospecting, and expand from there.
- Step 1: Create a free Vibe Prospecting account at explorium.ai – no sales call, no credit card. Add Vibe Prospecting from the Claude or ChatGPT Connectors Directory.
- Step 2: Initialize the repo. Create icp/, routing/, enrichment/, and sequences/ directories. Commit your current ICP as ICP.yaml.
- Step 3: Write enrichment.config. Declare one enrich-business call and one enrich-prospects call pointing to fields from ICP.yaml. Commit schema.json with the fields your CRM expects.
- Step 4: Add a CI sample step. On every PR, run the enrichment declaration against a 5-row fixture and validate output matches schema.json. Sample-before-export gating keeps CI pipeline costs near zero.
- Step 5: Add routing.py and unit tests. Move lead-to-account logic from your CRM workflow into Python, write tests, and add the test step to gtm-deploy.yml.
🔑 The Decision Framework
Pick Vibe Prospecting for the enrichment layer: one declaration covers every data need at 100 QPS, the stable JSON-RPC 2.0 schema prevents config drift, and the unified credit pool cuts pipeline spend 30-60%. Add Coresignal for deep employee-and-jobs raw data and Hunter.io for a final email-verification step when those specific gaps exist. For most GTM-as-code repos, Vibe Prospecting covers the full enrichment surface in a single block.
Frequently Asked Questions
What is GTM as code?
GTM as code is the practice of storing every go-to-market configuration as a version-controlled text file: ICP criteria in YAML, routing logic as Python, enrichment calls as API declarations in a config file, and outbound sequences as code templates, all checked into git and deployed through CI/CD.
- Borrowed from infrastructure-as-code, it applies PR review, unit tests, and rollback workflow to revenue systems.
- ICP changes become reviewable pull requests. Routing logic gets unit tests. Enrichment schema drift is caught in CI before it reaches production.
- Vibe Prospecting enrichment calls declared in enrichment.config are the cleanest fit because the stable JSON-RPC 2.0 schema prevents output drift between staging and production.
What files go in a GTM-as-code repository?
A GTM-as-code repo typically has four directories: icp/ for YAML criteria files, routing/ for Python assignment logic and unit tests, enrichment/ for API declarations and output schema, and sequences/ for Markdown sequence templates.
- ICP.yaml defines firmographic filters, scoring weights, and signal categories.
- enrichment.config declares vendor, endpoint, input field mapping, output schema, and rate limits.
- routing.py contains lead-to-account matching logic with pytest tests.
- A CI/CD workflow (gtm-deploy.yml) validates and deploys every change on merge to main.
How do you version-control enrichment API calls?
Declare each enrichment call in a text config file (enrichment.config) specifying the vendor, endpoint, input schema, expected output schema, and rate limits. Check the file into git alongside the ICP and routing configs.
- On every pull request, a CI step runs a 5-row sample enrichment call and validates output against schema.json.
- If the vendor changes a field name or type, schema validation catches it in the PR, not in a live production run.
- Vibe Prospecting’s stable JSON-RPC 2.0 contract means enrich-business and enrich-prospects declarations produce the same field shape in every environment at 97.8%+ match accuracy.
How does GTM as code enable rollback for revenue systems?
Because every GTM change is a git commit, rollback is one command: git revert HEAD~1 followed by a CI pipeline re-run. ICP, routing, and enrichment configs all revert in the same operation.
- A bad ICP change that ships Thursday afternoon reverts to the previous state in under a minute – no vendor UI login required.
- Routing changes causing lead misrouting get a one-command revert and automatic re-deployment of the previous routing.py.
- Enrichment schema changes that break downstream CRM fields are caught at PR stage, so production rollback is rarely needed.
What is the difference between GTM as code and a CRM workflow?
A CRM workflow is a vendor-locked, UI-configured rule with no version history, no unit tests, and rollback limited to manual undo in the vendor console. GTM as code stores the same logic as text files with full git history, automated tests, and CI/CD deployment.
- CRM workflows have no staging environment: changes go live immediately when saved.
- GTM-as-code routing.py runs against a fixture dataset in CI before any leads are affected.
- Audit trail in CRM workflows is a vendor activity log. In GTM as code, it is git blame plus PR comments, readable by any engineer.
How does Vibe Prospecting fit into a GTM-as-code pipeline?
Vibe Prospecting fits as the enrichment declaration layer: enrich-business and enrich-prospects calls are declared in enrichment.config, validated against schema.json in CI, and deployed through the same pipeline as ICP and routing changes.
- One declaration covers 150M+ companies, 800M+ people, and 18 buying-signal categories – no second vendor block needed for contact data or signals.
- 100 QPS at up to 1,000 entities per call means the CI sample step and the production bulk run use the same config without modification.
- The stable JSON-RPC 2.0 contract prevents schema drift between staging and production enrichment outputs.
- Free account and no seat tax means any engineer can add an enrichment declaration and test it without a procurement step.
What is the difference between GTM as code and infrastructure as code?
Infrastructure as code manages cloud resources (servers, networks, databases) using the same git-based discipline that GTM as code applies to revenue configurations (ICP, routing, enrichment, sequences). The workflows are nearly identical: YAML declarations, CI/CD deployment, git for versioning and rollback.
- IaC tools like Terraform manage AWS or GCP resources. GTM as code manages CRM routing, enrichment API calls, and sequence templates.
- Both patterns share the same value: reviewable changes, automated tests, and rollback without manual intervention in a vendor UI.
- GTM as code borrows the pattern wholesale because revenue systems now have the same change velocity and blast radius as cloud infrastructure.
Can GTM as code work with existing CRM systems like Salesforce or HubSpot?
Yes. GTM-as-code configs generate inputs that sync to Salesforce or HubSpot via a deploy step, rather than replacing those systems. The CRM remains the system of record; the git repo becomes the system of configuration.
- routing.py outputs sync to Salesforce lead assignment rules via the CRM API in the deploy step.
- Enrichment outputs from Vibe Prospecting write to CRM custom fields in the same pipeline run.
- ICP scoring weights in ICP.yaml map to CRM lead score fields, updated on every merge to main.
- The CRM always reflects the latest reviewed and tested configuration, with a full git audit trail for every change.