gtm
gtm lets any coding agent (Claude Code, Codex, Cursor or a Slack agent) set up and run a company's
go-to-market work as an ordinary Next.js project on Vercel. The company's know-how (ICPs, personas, voice) is
Markdown in its own repo, its workflows are Workflow SDK code the agent writes, and non-technical GTM people
get one Console to read what the agent knows, see what is running, browse the data and add API keys. Locally
it needs no sign-ups: a built-in Postgres, the Workflow SDK's local world, and AI steps on your own
claude/codex. Live, the same project is one Vercel project behind Vercel's own login, with AI steps on AI
Gateway. Nothing is hosted by us; the keys and services are the company's own.
Get started
-
Skill, for any agent:
npx skills add eliasstravik/gtm -g, then ask your agent to "set up GTM for Acme" (it runsnpx @eliasstravik/gtm init --company Acme, which creates./gtm-acmewith the base files only, then asks what to add). For a demo,init --company Acme --exampleadds one small marked example workflow. -
Claude Code plugin:
/plugin marketplace add eliasstravik/gtmthen/plugin install gtm@eliasstravik(ornpx plugins add eliasstravik/gtm). -
Deploy button: deploys the starter at
v0.0.4as a new Vercel project with Neon, suggested asgtm-company: put the company's name in place ofcompany(gtm-acme) for both the repo and the project (no Slack agent; add it later withnpx @eliasstravik/gtm init --slack). The Console fails closed, showing "Turn on Vercel Authentication → All Deployments", until production protection is on; follow docs/deploy.md.
What you get
One repo per company, named gtm-<company> (gtm-acme): context/ (Markdown), .agents/skills/ (the company's
skills, one <name>/SKILL.md each, for Claude Code, Codex, the Slack agent and workflow agent() steps),
workflows/ (the registry in workflows/index.ts), db/ (workflow-owned tables), app/ (the Console and webhooks), AGENTS.md with a managed
block, .env.example listing every connection, and vercel.json for schedules. The full layout is in
docs/layout.md; the template itself is starter/.
The Console is the web UI the GTM team uses: a sidebar with the company and its environment, then Context (what the agent knows), Workflows with their Runs, Data (every workflow table, searchable, with CSV and JSON export) and Connections (which API keys are set; add or replace one). Risky or costly runs start only after a yes in chat; the Console has no start or approve buttons.
Docs
The docs match the installed version: npx @eliasstravik/gtm docs [topic], or
node_modules/@eliasstravik/gtm/docs/ in a project.
| Topic | |
|---|---|
| layout | the project layout and what the Console reads |
| recipes | ready-made workflows to copy: import a list, enrich companies, a weekly scheduled job |
| context | the basics at setup, and a suggested layout for company facts, members, ICPs, personas |
| interaction | how agents talk to the GTM team: plain replies, one question at a time, what needs a yes |
| workflows | the registry, preview → yes in chat → run, gtm run, run size |
| data | db(), migrations, the production stamp, local data |
| connections | .env.example, saving keys locally and live |
| local | zero-sign-up local work, AI step backends, switching to real services |
| deploy | going live on Vercel |
| webhooks | inbound webhooks |
| slack | the optional Slack agent |
Future direction
Not built yet, but the layout leaves room for them: built-in CRM and sequencer parts, and Artifacts, pages the agent makes for the company (reports, dashboards) listed in the Console's sidebar.
Releasing
One version for the package, the starter's pin, the plugin manifests and the Deploy button's tag. Releases publish from GitHub Actions (release.yml) through npm trusted publishing, so no npm token lives on any machine and every version carries provenance:
- Set
versioninpackage.json(andpackage-lock.json) to the release candidate, for example0.0.5-rc.1, merge tomain, then push the tag:git tag v0.0.5-rc.1 && git push origin v0.0.5-rc.1. A pre-release tag publishes undernext; mark its GitHub release as a pre-release. - Check the candidate in a project made with
npx @eliasstravik/gtm@next init, which pins the candidate (^0.0.5-rc.1), and in a Vercel deploy of such a project. Not the starter or the Deploy button: their^0.0.4pin never matches a pre-release, so they would still install the previous version. - Set
versionto0.0.5inpackage.json,package-lock.json,plugin.jsonand.claude-plugin/plugin.json, the MCP client version insrc/ai/tools.ts, the starter's pin to^0.0.5and the Deploy button's tag tov0.0.5; merge, push tagv0.0.5(publishes underlatest) and make its GitHub release.
The tag must match package.json, or the workflow refuses. The trust between npm and this repo's release.yml was
set once with npm trust github @eliasstravik/gtm --repo eliasstravik/gtm --file release.yml --allow-publish;
renaming the workflow file breaks it.