GTM agents for the world
AGPL-3.0Self-hostedBring your own keys
The Clay alternative you can run on your own box.
Workbooks where every column does work: source companies, run enrichment waterfalls that try free providers before paid ones, let an agent browse the web and cite its sources, then push rows to your CRM. The bill is priced before a single row runs.
git clone https://github.com/debpalash/opengtm.git && cd opengtmcp .env.example .envdocker compose up # api · worker · postgres · redis · nginx → :3000| source Company | waterfall Email | waterfall Verify | research Uses Kubernetes? | output HubSpot |
|---|---|---|---|---|
| Aptita Consultingaptita.com | hello@aptita.comwebsite_scraper · free | validmailscout · 0.95 | Yes — careers page lists EKS2 fetches · $0.01 | pushedcontact 4128 |
| Benchirebenchire.com | r.mehta@benchire.comhunter_io · $0.04 | catch_allmailscout · 0.50 | searching…step 2 of 4 | waitingafter enrichment |
| Mindtree Labsmindtreelabs.in | trying ddg_email3 of 10 providers | pending | pending | waiting |
| Zenith Softechzenithsoftech.com | skippedspend ceiling reached | skippedno email | No evidence found4 fetches · $0.02 | waiting |
Before you run
The bill, itemised, before a single row executes.
Every workbook has an estimate endpoint. It multiplies rows by every paid provider in each column’s chain for the worst case, and by the cheapest paid provider for the best case. Free providers never appear on it. Set a ceiling and the planner drops paid providers from every chain the moment it is reached.
How spend transparency works{ "rows": 50, "worst_usd": 6.00, "best_usd": 1.00, "breakdown": [ { "column": "Email", "paid_providers": ["hunter_io", "apollo_io", "snovio", "prospeo"], "worst_usd": 6.00, "best_usd": 1.00 } ], "note": "worst = every paid provider tried per row; best = cheapest paid hit first."}How a workbook runs
Four kinds of column. One durable queue.
- 01
Source
An ideal-customer-profile query fans out over ~90 directories, review sites, registries and job boards. Runs page, checkpoint and resume; every row keeps its provider record id, so a re-run updates instead of duplicating.
Sourcing - 02
Enrich
A waterfall tries providers until one answers confidently. Free scrapers and open data go first; paid vendors on your own keys go last, reordered by measured hit-rate per dollar.
Waterfalls and the planner - 03
Research
A bounded agent searches and fetches behind the SSRF guard, answers a question per row, and cites only URLs it actually loaded. Agent columns choose their own tools inside a step and dollar budget and leave a trace.
Research and agent columns - 04
Push
Output columns run once per row after enrichment: HubSpot, Salesforce, Google Sheets, Airtable, a webhook, or an email sequence. Idempotent by default.
Outputs
lead_fieldsourceenrichmentwaterfallai_formularesearchagenthttpformulaconditionaloutput
Promises, in writing
Structural, not marketing.
A seat-priced, credit-metered incumbent cannot match these without undoing its own business model.
- The API is never plan-gated.
- REST, webhooks, MCP tools, the n8n node and the Chrome extension are first-class on every install. Automating OpenGTM is a use case, not an upsell.
- Your keys, vendor price, zero markup.
- You pay LLM and enrichment vendors directly. Any future managed-key option bills at cost plus one disclosed flat fee, never per credit.
- The bill before the run, always.
- The estimate, the ceiling and the per-provider cost ledger are core features on every tier there will ever be.
- Self-host is complete, forever.
- No feature is held back to force a cloud upgrade. If a paid line ever exists it will be governance: SSO, audit export, support.
What ships
- ~90 sourcing connectors with durable, resumable runs
- 36 enrichment providers plus declarative YAML manifests; most are free and keyless
- 9 LLM providers with automatic failover; several have free tiers
- 8 buying-signal types, scheduled watches, trigger rules
- 19 validated workbook recipes in the template gallery
- 189 documented REST endpoints, generated from the running app
How it is built
- FastAPI and SQLAlchemy 2 on PostgreSQL with fail-closed row-level security per workspace
- A PostgreSQL job queue; workers claim with
FOR UPDATE SKIP LOCKEDand commit each page with its cursor - Every user-supplied URL passes an SSRF guard that rejects private, loopback and metadata ranges and re-checks redirects
- Per-workspace secrets encrypted at rest; tokens stored hashed and shown once
- React 19 and Vite front end; MCP server; n8n node; Chrome capture extension
Run it this afternoon.
One LLM key gets you AI, research and agent columns. Everything else is optional and configured at runtime.