@growthub/cli 0.3.54 → 0.3.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -156
- package/assets/worker-kits/growthub-ai-website-cloner-v1/.env.example +7 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/QUICKSTART.md +116 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/brands/NEW-CLIENT.md +22 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/brands/_template/brand-kit.md +27 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/brands/growthub/brand-kit.md +26 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/bundles/growthub-ai-website-cloner-v1.json +53 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/ai-website-cloner-fork-integration.md +118 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/design-token-system.md +135 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/multi-phase-pipeline.md +129 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/docs/parallel-builder-dispatch.md +103 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/clone-brief-sample.md +54 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/component-spec-sample.md +123 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/platform-handoff-sample.md +102 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/examples/visual-qa-sample.md +119 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/growthub-meta/README.md +71 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/growthub-meta/kit-standard.md +47 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/kit.json +105 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/output/README.md +26 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/output-standards.md +75 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/runtime-assumptions.md +70 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/setup/check-deps.sh +50 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/setup/clone-fork.sh +66 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/setup/verify-env.mjs +78 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/skills.md +186 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/asset-manifest.md +57 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/builder-dispatch-plan.md +92 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/clone-brief.md +59 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/component-spec.md +124 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/design-token-extraction.md +89 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/platform-handoff.md +114 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/reconnaissance-report.md +77 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/visual-qa-checklist.md +107 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/validation-checklist.md +76 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/workers/ai-website-cloner-operator/CLAUDE.md +256 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/.env.example +40 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/QUICKSTART.md +114 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/brands/NEW-CLIENT.md +42 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/brands/_template/brand-kit.md +49 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/brands/growthub/brand-kit.md +50 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/bundles/growthub-open-montage-studio-v1.json +55 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/cms-node-bridge.md +152 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/open-montage-fork-integration.md +120 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/pipeline-reference.md +147 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/docs/provider-adapter-layer.md +105 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/cms-node-video-gen-sample.md +109 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/pipeline-selection-sample.md +67 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/platform-ready-handoff-sample.md +101 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/examples/video-production-brief-sample.md +68 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/growthub-meta/README.md +7 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/growthub-meta/kit-standard.md +45 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/kit.json +107 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/output/README.md +34 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/output-standards.md +79 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/runtime-assumptions.md +86 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/setup/check-deps.sh +43 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/setup/clone-fork.sh +53 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/setup/verify-env.mjs +102 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/skills.md +254 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/asset-tracking.md +46 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/cms-node-pipeline-mapping.md +64 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/generation-batch-plan.md +70 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/pipeline-selection-brief.md +67 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/platform-ready-execution-handoff.md +103 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/prompt-matrix.md +48 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/provider-selection-brief.md +86 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/review-qa-checklist.md +59 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/scene-plan.md +65 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/video-production-brief.md +58 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/validation-checklist.md +46 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/workers/open-montage-studio-operator/CLAUDE.md +304 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/.env.example +15 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/QUICKSTART.md +90 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/brands/NEW-CLIENT.md +57 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/brands/_template/brand-kit.md +88 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/brands/growthub/brand-kit.md +92 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/bundles/growthub-twenty-crm-v1.json +56 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/docs/api-and-webhooks.md +296 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/docs/data-model-layer.md +172 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/docs/twenty-fork-integration.md +213 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/crm-playbook-sample.md +172 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/crm-setup-sample.md +100 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/lead-enrichment-sample.md +117 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/examples/pipeline-automation-sample.md +132 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/growthub-meta/README.md +114 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/growthub-meta/kit-standard.md +61 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/kit.json +108 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/output/README.md +46 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/output-standards.md +175 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/runtime-assumptions.md +150 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/setup/check-deps.sh +56 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/setup/clone-fork.sh +77 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/setup/verify-env.mjs +105 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/skills.md +401 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/api-query-plan.md +179 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/crm-playbook.md +155 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/crm-setup-brief.md +94 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/custom-object-design.md +115 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/data-model-design.md +112 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/enrichment-field-map.md +100 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/import-mapping.md +139 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/integration-handoff.md +190 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/lead-enrichment-pipeline.md +128 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/pipeline-automation-brief.md +88 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/webhook-integration-spec.md +129 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/workspace-config-checklist.md +129 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/validation-checklist.md +115 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/workers/twenty-crm-operator/CLAUDE.md +310 -0
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Quick Start — Twenty CRM Worker Kit
|
|
2
|
+
|
|
3
|
+
This folder is your self-contained agent working directory for Twenty CRM implementation, enrichment pipeline design, and CRM playbook production.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Step 1 — Point your Working Directory at this folder
|
|
8
|
+
|
|
9
|
+
**Growthub local (primary):** Open Growthub local and set the **Working Directory** to this folder in your project settings. Every run you start from this working directory will load the Twenty CRM operator agent automatically.
|
|
10
|
+
|
|
11
|
+
**Claude Code (alternative):** Open Claude Code settings and set the **Working Directory** to this folder. The operator agent loads from `workers/twenty-crm-operator/CLAUDE.md` on session start.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Step 2 — Configure your Twenty credentials
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
cp .env.example .env
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Open `.env` and fill in:
|
|
22
|
+
- `TWENTY_API_TOKEN` — your Twenty app token (generate in Twenty Settings > API)
|
|
23
|
+
- `TWENTY_API_URL` — your workspace API URL (e.g. `https://api.twenty.com` for cloud, or `http://localhost:3000` for local)
|
|
24
|
+
|
|
25
|
+
The agent checks for these values at the start of every session (Step 0 of the workflow). It will not proceed without them in API-connected mode. Agent-only mode does not require credentials.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Step 3 — Verify your environment
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
node setup/verify-env.mjs
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Confirms that `TWENTY_API_TOKEN` is set, tests connectivity to the Twenty API, and prints available workspace info. Exits 0 on success.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Step 4 — Check local dependencies
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
bash setup/check-deps.sh
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Checks for `node`, `npm`, `git`, and `docker`. Docker is required for self-hosted mode. All are recommended for local-fork development.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Step 5 — Boot the local fork (local-fork mode only)
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
bash setup/clone-fork.sh
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Clones the Twenty repo to `~/twenty`, installs dependencies, and starts the development environment (PostgreSQL, Redis, and the Twenty server + frontend) via Docker Compose.
|
|
56
|
+
|
|
57
|
+
Skip this step if you are using Twenty Cloud or have an existing self-hosted deployment.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Step 6 — Start a new session
|
|
62
|
+
|
|
63
|
+
**Growthub local:** Start a new run from this working directory. The agent loads automatically.
|
|
64
|
+
|
|
65
|
+
**Claude Code:** Open a new session with this folder as the Working Directory. The agent reads `skills.md` and the methodology automatically.
|
|
66
|
+
|
|
67
|
+
In both cases the agent will ask you 3 clarifying questions before generating any CRM artifacts.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Execution modes
|
|
72
|
+
|
|
73
|
+
| Mode | When to use |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `local-fork` | Local Twenty checkout running via Docker at localhost:3000 |
|
|
76
|
+
| `self-hosted` | Twenty deployed on your own infrastructure |
|
|
77
|
+
| `cloud` | Twenty Cloud workspace at app.twenty.com |
|
|
78
|
+
| `agent-only` | No live Twenty instance — produce planning artifacts only |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## First-run checklist
|
|
83
|
+
|
|
84
|
+
See `validation-checklist.md` for the full pre-session checklist before your first CRM implementation run.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Creating a brand kit for a new client
|
|
89
|
+
|
|
90
|
+
See `brands/NEW-CLIENT.md`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# New Client — Brand Kit Setup Guide
|
|
2
|
+
|
|
3
|
+
Use this guide to create a brand kit for a new client before running the Twenty CRM operator.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Step 1 — Create the brand kit folder
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
mkdir -p brands/<client-slug>
|
|
11
|
+
cp brands/_template/brand-kit.md brands/<client-slug>/brand-kit.md
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Replace `<client-slug>` with the client's slug — lowercase, hyphenated (e.g. `acme-corp`, `growth-agency`).
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Step 2 — Fill in the brand kit
|
|
19
|
+
|
|
20
|
+
Open `brands/<client-slug>/brand-kit.md` and fill in:
|
|
21
|
+
|
|
22
|
+
1. **IDENTITY** — client name, slug, industry, company size, primary offer, campaign owner, date onboarded
|
|
23
|
+
2. **CRM OBJECTIVE** — what problem they are solving with Twenty, deployment mode, go-live target
|
|
24
|
+
3. **AUDIENCE AND PIPELINE** — primary persona, pipeline stages in order
|
|
25
|
+
4. **TECH STACK** — current tools, enrichment providers, data sources
|
|
26
|
+
5. **TEAM** — CRM admin, team sizes, admin capacity
|
|
27
|
+
|
|
28
|
+
Leave `DELIVERABLES LOG` empty for now. The operator will append a line after each session.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Step 3 — Tell the agent
|
|
33
|
+
|
|
34
|
+
When you start a new session, point the agent to the brand kit:
|
|
35
|
+
|
|
36
|
+
> "Load `brands/<client-slug>/brand-kit.md` as the active client context."
|
|
37
|
+
|
|
38
|
+
The agent loads it in Step 1 of the workflow and uses it to name outputs, set the pipeline stage vocabulary, and calibrate proposal scope.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Naming convention
|
|
43
|
+
|
|
44
|
+
- `client_name`: Full name (e.g. `Acme Corporation`)
|
|
45
|
+
- `slug`: lowercase, hyphenated, no spaces (e.g. `acme-corporation`)
|
|
46
|
+
- Output files use PascalCase ClientSlug (e.g. `AcmeCorporation_DataModelDesign_v1_20260415.md`)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Required fields (session will not proceed without these)
|
|
51
|
+
|
|
52
|
+
- `client_name`
|
|
53
|
+
- `slug`
|
|
54
|
+
- `primary_crm_objective`
|
|
55
|
+
- `deployment_mode`
|
|
56
|
+
- `pipeline_stages` (at least 3 stages)
|
|
57
|
+
- `data_sources` (at least one)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Brand Kit — [CLIENT NAME]
|
|
2
|
+
|
|
3
|
+
Copy to `brands/<client-slug>/brand-kit.md` and fill before producing outputs.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## IDENTITY
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
client_name: "[CLIENT NAME]"
|
|
11
|
+
slug: "[client-slug]"
|
|
12
|
+
industry: "[industry]"
|
|
13
|
+
company_size: "[e.g. 10-50 employees]"
|
|
14
|
+
primary_offer: "[offer]"
|
|
15
|
+
campaign_owner: "[owner]"
|
|
16
|
+
date_onboarded: "YYYY-MM-DD"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## CRM OBJECTIVE
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
primary_crm_objective: "[e.g. lead pipeline management / customer success tracking / partner CRM]"
|
|
23
|
+
current_crm_tool: "[e.g. Salesforce / HubSpot / Airtable / none]"
|
|
24
|
+
reason_for_switching: "[reason or first-time adoption]"
|
|
25
|
+
deployment_mode: "[cloud / self-hosted / local-fork]"
|
|
26
|
+
go_live_target: "YYYY-MM-DD"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## AUDIENCE AND PIPELINE
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
primary_persona:
|
|
33
|
+
role: "[role]"
|
|
34
|
+
company_type: "[company type]"
|
|
35
|
+
pain_point: "[pain]"
|
|
36
|
+
desired_outcome: "[desired outcome]"
|
|
37
|
+
awareness_level: "[awareness]"
|
|
38
|
+
|
|
39
|
+
pipeline_stages:
|
|
40
|
+
- "[Stage 1 — e.g. Lead]"
|
|
41
|
+
- "[Stage 2 — e.g. Qualified]"
|
|
42
|
+
- "[Stage 3 — e.g. Demo]"
|
|
43
|
+
- "[Stage 4 — e.g. Proposal]"
|
|
44
|
+
- "[Stage 5 — e.g. Closed Won]"
|
|
45
|
+
- "[Stage 6 — e.g. Closed Lost]"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## TECH STACK
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
current_tools:
|
|
52
|
+
email_provider: "[e.g. Gmail / Outlook]"
|
|
53
|
+
enrichment_providers:
|
|
54
|
+
- "[Apollo / Clearbit / Clay / Hunter / none]"
|
|
55
|
+
product_analytics: "[Segment / Amplitude / Mixpanel / none]"
|
|
56
|
+
billing: "[Stripe / Chargebee / none]"
|
|
57
|
+
support: "[Intercom / Zendesk / none]"
|
|
58
|
+
marketing: "[HubSpot / Mailchimp / none]"
|
|
59
|
+
data_sources:
|
|
60
|
+
- "[CSV exports from ...]"
|
|
61
|
+
- "[API connection from ...]"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## TEAM
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
team:
|
|
68
|
+
crm_admin: "[name or role]"
|
|
69
|
+
sales_team_size: "[number]"
|
|
70
|
+
cs_team_size: "[number]"
|
|
71
|
+
admin_capacity: "[hours/week available for CRM maintenance]"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## MESSAGING
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
voice_and_tone:
|
|
78
|
+
- "[direct]"
|
|
79
|
+
- "[data-driven]"
|
|
80
|
+
messaging_guardrails:
|
|
81
|
+
- "[no-go claim or data privacy rule]"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## DELIVERABLES LOG
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
- YYYY-MM-DD | Twenty CRM Package v<N> — <Project Name> | output/<client-slug>/<project-slug>/
|
|
88
|
+
```
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Brand Kit — Growthub
|
|
2
|
+
|
|
3
|
+
Public example brand kit for the Twenty CRM Worker Kit.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## IDENTITY
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
client_name: "Growthub"
|
|
11
|
+
slug: "growthub"
|
|
12
|
+
industry: "B2B SaaS / Growth Platform"
|
|
13
|
+
company_size: "10-50 employees"
|
|
14
|
+
primary_offer: "AI-native local intelligence platform for growth teams"
|
|
15
|
+
campaign_owner: "Growthub Growth Team"
|
|
16
|
+
date_onboarded: "2026-04-15"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## CRM OBJECTIVE
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
primary_crm_objective: "lead pipeline management and partner CRM"
|
|
23
|
+
current_crm_tool: "none (first-time CRM adoption)"
|
|
24
|
+
reason_for_switching: "first-time adoption — scaling GTM motion requires structured CRM"
|
|
25
|
+
deployment_mode: "cloud"
|
|
26
|
+
go_live_target: "2026-05-01"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## AUDIENCE AND PIPELINE
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
primary_persona:
|
|
33
|
+
role: "Head of Growth / GTM Lead"
|
|
34
|
+
company_type: "B2B SaaS startup (Series A–B)"
|
|
35
|
+
pain_point: "scattered lead data across spreadsheets, no pipeline visibility, no enrichment"
|
|
36
|
+
desired_outcome: "structured pipeline with automated enrichment and clear stage ownership"
|
|
37
|
+
awareness_level: "high — already evaluating CRM options"
|
|
38
|
+
|
|
39
|
+
pipeline_stages:
|
|
40
|
+
- "Lead — new contact captured"
|
|
41
|
+
- "Qualified — ICP-fit confirmed"
|
|
42
|
+
- "Demo — intro call scheduled or completed"
|
|
43
|
+
- "Proposal — commercial terms under discussion"
|
|
44
|
+
- "Closed Won — deal signed"
|
|
45
|
+
- "Closed Lost — deal lost with reason recorded"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## TECH STACK
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
current_tools:
|
|
52
|
+
email_provider: "Gmail (Google Workspace)"
|
|
53
|
+
enrichment_providers:
|
|
54
|
+
- "Apollo (primary outbound lead source)"
|
|
55
|
+
- "Clay (enrichment waterfall)"
|
|
56
|
+
product_analytics: "Segment"
|
|
57
|
+
billing: "Stripe"
|
|
58
|
+
support: "Intercom"
|
|
59
|
+
marketing: "none (using direct outbound only)"
|
|
60
|
+
data_sources:
|
|
61
|
+
- "Apollo CSV exports (contacts + companies)"
|
|
62
|
+
- "Stripe webhook events (customer created, subscription updated)"
|
|
63
|
+
- "Intercom webhook events (conversation started, resolved)"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## TEAM
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
team:
|
|
70
|
+
crm_admin: "Head of Growth"
|
|
71
|
+
sales_team_size: "3"
|
|
72
|
+
cs_team_size: "2"
|
|
73
|
+
admin_capacity: "4 hours/week available for CRM maintenance"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## MESSAGING
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
voice_and_tone:
|
|
80
|
+
- "direct"
|
|
81
|
+
- "data-driven"
|
|
82
|
+
- "operator-first"
|
|
83
|
+
messaging_guardrails:
|
|
84
|
+
- "do not overstate pipeline values in examples"
|
|
85
|
+
- "do not log client data in shared artifacts"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## DELIVERABLES LOG
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
- 2026-04-15 | Twenty CRM Package v1 — Growthub GTM Stack | output/growthub/gtm-crm-v1/
|
|
92
|
+
```
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"bundle": {
|
|
4
|
+
"id": "growthub-twenty-crm-v1",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"kitId": "growthub-twenty-crm-v1",
|
|
7
|
+
"workerId": "twenty-crm-operator"
|
|
8
|
+
},
|
|
9
|
+
"briefType": "twenty-crm-growth-stack",
|
|
10
|
+
"publicExampleBrandPaths": [
|
|
11
|
+
"brands/growthub/brand-kit.md"
|
|
12
|
+
],
|
|
13
|
+
"requiredFrozenAssets": [
|
|
14
|
+
"QUICKSTART.md",
|
|
15
|
+
".env.example",
|
|
16
|
+
"skills.md",
|
|
17
|
+
"output-standards.md",
|
|
18
|
+
"runtime-assumptions.md",
|
|
19
|
+
"validation-checklist.md",
|
|
20
|
+
"workers/twenty-crm-operator/CLAUDE.md",
|
|
21
|
+
"brands/_template/brand-kit.md",
|
|
22
|
+
"brands/growthub/brand-kit.md",
|
|
23
|
+
"brands/NEW-CLIENT.md",
|
|
24
|
+
"setup/clone-fork.sh",
|
|
25
|
+
"setup/verify-env.mjs",
|
|
26
|
+
"setup/check-deps.sh",
|
|
27
|
+
"output/README.md",
|
|
28
|
+
"templates/crm-setup-brief.md",
|
|
29
|
+
"templates/data-model-design.md",
|
|
30
|
+
"templates/lead-enrichment-pipeline.md",
|
|
31
|
+
"templates/pipeline-automation-brief.md",
|
|
32
|
+
"templates/webhook-integration-spec.md",
|
|
33
|
+
"templates/api-query-plan.md",
|
|
34
|
+
"templates/crm-playbook.md",
|
|
35
|
+
"templates/custom-object-design.md",
|
|
36
|
+
"templates/import-mapping.md",
|
|
37
|
+
"templates/workspace-config-checklist.md",
|
|
38
|
+
"templates/integration-handoff.md",
|
|
39
|
+
"templates/enrichment-field-map.md",
|
|
40
|
+
"examples/crm-setup-sample.md",
|
|
41
|
+
"examples/lead-enrichment-sample.md",
|
|
42
|
+
"examples/pipeline-automation-sample.md",
|
|
43
|
+
"examples/crm-playbook-sample.md",
|
|
44
|
+
"docs/twenty-fork-integration.md",
|
|
45
|
+
"docs/api-and-webhooks.md",
|
|
46
|
+
"docs/data-model-layer.md",
|
|
47
|
+
"growthub-meta/README.md",
|
|
48
|
+
"growthub-meta/kit-standard.md"
|
|
49
|
+
],
|
|
50
|
+
"optionalPresets": [],
|
|
51
|
+
"export": {
|
|
52
|
+
"folderName": "growthub-agent-worker-kit-twenty-crm-v1",
|
|
53
|
+
"zipFileName": "growthub-agent-worker-kit-twenty-crm-v1.zip"
|
|
54
|
+
},
|
|
55
|
+
"activationModes": ["export"]
|
|
56
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# API and Webhooks — Twenty CRM
|
|
2
|
+
|
|
3
|
+
**Kit:** `growthub-twenty-crm-v1`
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## OVERVIEW
|
|
8
|
+
|
|
9
|
+
Twenty CRM exposes two API surfaces:
|
|
10
|
+
|
|
11
|
+
1. **GraphQL API** at `<TWENTY_API_URL>/graphql` — the primary data access surface for queries and mutations
|
|
12
|
+
2. **REST API** at `<TWENTY_API_URL>/api/objects/<object-name>` — simpler CRUD operations
|
|
13
|
+
|
|
14
|
+
Both require a Bearer token authentication header.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## AUTHENTICATION
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Authorization: Bearer <TWENTY_API_TOKEN>
|
|
22
|
+
Content-Type: application/json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Tokens are workspace-scoped and generated in:
|
|
26
|
+
**Settings > API > Tokens > Generate API Token**
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## GRAPHQL API
|
|
31
|
+
|
|
32
|
+
### Endpoint
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
POST <TWENTY_API_URL>/graphql
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Common query patterns
|
|
39
|
+
|
|
40
|
+
#### List all People
|
|
41
|
+
|
|
42
|
+
```graphql
|
|
43
|
+
query {
|
|
44
|
+
people {
|
|
45
|
+
edges {
|
|
46
|
+
node {
|
|
47
|
+
id
|
|
48
|
+
name { firstName lastName }
|
|
49
|
+
emails { primaryEmail }
|
|
50
|
+
position
|
|
51
|
+
company { name domain }
|
|
52
|
+
createdAt
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
totalCount
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### Filter People by email domain
|
|
61
|
+
|
|
62
|
+
```graphql
|
|
63
|
+
query {
|
|
64
|
+
people(filter: {
|
|
65
|
+
emails: { primaryEmail: { like: "%@acme.com" } }
|
|
66
|
+
}) {
|
|
67
|
+
edges {
|
|
68
|
+
node {
|
|
69
|
+
id
|
|
70
|
+
name { firstName lastName }
|
|
71
|
+
emails { primaryEmail }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### Get open Opportunities by stage
|
|
79
|
+
|
|
80
|
+
```graphql
|
|
81
|
+
query {
|
|
82
|
+
opportunities(filter: {
|
|
83
|
+
stage: { in: ["LEAD", "QUALIFIED", "DEMO", "PROPOSAL"] }
|
|
84
|
+
}, orderBy: { closeDate: AscNullsLast }) {
|
|
85
|
+
edges {
|
|
86
|
+
node {
|
|
87
|
+
id
|
|
88
|
+
name
|
|
89
|
+
stage
|
|
90
|
+
amount { amountMicros currencyCode }
|
|
91
|
+
closeDate
|
|
92
|
+
assignee { name { firstName lastName } }
|
|
93
|
+
pointOfContact { name { firstName lastName } emails { primaryEmail } }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
totalCount
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Create a Person
|
|
102
|
+
|
|
103
|
+
```graphql
|
|
104
|
+
mutation {
|
|
105
|
+
createPerson(data: {
|
|
106
|
+
name: { firstName: "Jane", lastName: "Doe" }
|
|
107
|
+
emails: { primaryEmail: "jane@example.com" }
|
|
108
|
+
position: "Head of Growth"
|
|
109
|
+
linkedInLink: { url: "https://linkedin.com/in/janedoe", label: "LinkedIn" }
|
|
110
|
+
companyId: "<company-uuid>"
|
|
111
|
+
}) {
|
|
112
|
+
id
|
|
113
|
+
name { firstName lastName }
|
|
114
|
+
createdAt
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### Update an Opportunity stage
|
|
120
|
+
|
|
121
|
+
```graphql
|
|
122
|
+
mutation {
|
|
123
|
+
updateOpportunity(
|
|
124
|
+
id: "<opportunity-uuid>"
|
|
125
|
+
data: { stage: "CLOSED_WON" }
|
|
126
|
+
) {
|
|
127
|
+
id
|
|
128
|
+
stage
|
|
129
|
+
updatedAt
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### Create a Note linked to a Person
|
|
135
|
+
|
|
136
|
+
```graphql
|
|
137
|
+
mutation {
|
|
138
|
+
createNote(data: {
|
|
139
|
+
body: "Spoke on 2026-04-15 — interested in Growthub platform for their outbound motion."
|
|
140
|
+
noteTargets: {
|
|
141
|
+
createMany: {
|
|
142
|
+
data: [{ personId: "<person-uuid>" }]
|
|
143
|
+
skipDuplicates: true
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}) {
|
|
147
|
+
id
|
|
148
|
+
body
|
|
149
|
+
createdAt
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## REST API
|
|
157
|
+
|
|
158
|
+
### Endpoint
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
GET/POST/PATCH/DELETE <TWENTY_API_URL>/api/objects/<object-name>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Object name is the plural lowercase form (e.g. `people`, `companies`, `opportunities`).
|
|
165
|
+
|
|
166
|
+
### Examples
|
|
167
|
+
|
|
168
|
+
#### List companies
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
curl -X GET "<TWENTY_API_URL>/api/objects/companies" \
|
|
172
|
+
-H "Authorization: Bearer $TWENTY_API_TOKEN"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
#### Create a company via REST
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
curl -X POST "<TWENTY_API_URL>/api/objects/companies" \
|
|
179
|
+
-H "Authorization: Bearer $TWENTY_API_TOKEN" \
|
|
180
|
+
-H "Content-Type: application/json" \
|
|
181
|
+
-d '{"name": "Acme Corp", "domainName": {"primaryLinkUrl": "acme.com"}}'
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### Update an opportunity
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
curl -X PATCH "<TWENTY_API_URL>/api/objects/opportunities/<id>" \
|
|
188
|
+
-H "Authorization: Bearer $TWENTY_API_TOKEN" \
|
|
189
|
+
-H "Content-Type: application/json" \
|
|
190
|
+
-d '{"stage": "PROPOSAL"}'
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## WEBHOOKS
|
|
196
|
+
|
|
197
|
+
### Outbound webhooks (Twenty → external)
|
|
198
|
+
|
|
199
|
+
Twenty can fire outbound webhooks on object lifecycle events. Configure in:
|
|
200
|
+
**Settings > API > Webhooks > Add Webhook**
|
|
201
|
+
|
|
202
|
+
Or create via the workflow engine using the `SEND_HTTP_REQUEST` action type.
|
|
203
|
+
|
|
204
|
+
**Event naming convention:** `<object>.<event>` (e.g. `opportunity.created`, `person.updated`)
|
|
205
|
+
|
|
206
|
+
**Outbound webhook payload schema:**
|
|
207
|
+
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"targetUrl": "https://your-endpoint.com/webhook",
|
|
211
|
+
"eventName": "opportunity.created",
|
|
212
|
+
"workspaceId": "<workspace-uuid>",
|
|
213
|
+
"webhookId": "<webhook-uuid>",
|
|
214
|
+
"eventDate": "2026-04-15T10:00:00.000Z",
|
|
215
|
+
"objectMetadata": {
|
|
216
|
+
"id": "<object-uuid>",
|
|
217
|
+
"nameSingular": "opportunity"
|
|
218
|
+
},
|
|
219
|
+
"record": {
|
|
220
|
+
"id": "<record-uuid>",
|
|
221
|
+
"name": "Acme Corp — Deal",
|
|
222
|
+
"stage": "LEAD",
|
|
223
|
+
"createdAt": "2026-04-15T10:00:00.000Z"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Note:** The exact `record` payload structure depends on the object and Twenty version. Inspect the actual webhook in the Twenty UI or via a test event before finalizing payload parsing.
|
|
229
|
+
|
|
230
|
+
### Inbound webhooks (external → Twenty)
|
|
231
|
+
|
|
232
|
+
Twenty does not natively receive inbound webhooks — you must build a webhook receiver that:
|
|
233
|
+
1. validates the incoming event signature (from the source system)
|
|
234
|
+
2. transforms the payload to the Twenty GraphQL mutation format
|
|
235
|
+
3. calls the Twenty API to create or update the relevant record
|
|
236
|
+
|
|
237
|
+
See `docs/twenty-fork-integration.md` for the workflow engine's inbound webhook trigger, which can be used to trigger automations from external systems.
|
|
238
|
+
|
|
239
|
+
### Retry policy
|
|
240
|
+
|
|
241
|
+
Twenty's outbound webhooks retry on failure with exponential backoff. The default retry count and backoff schedule depend on the Twenty version. Check the workflow logs in Settings > Workflows for retry status.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## METADATA API
|
|
246
|
+
|
|
247
|
+
Used to create and manage custom objects and fields programmatically.
|
|
248
|
+
|
|
249
|
+
### Endpoint
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
POST <TWENTY_API_URL>/metadata
|
|
253
|
+
Authorization: Bearer <TWENTY_API_TOKEN>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Introspect existing metadata
|
|
257
|
+
|
|
258
|
+
```graphql
|
|
259
|
+
query {
|
|
260
|
+
objects {
|
|
261
|
+
edges {
|
|
262
|
+
node {
|
|
263
|
+
id
|
|
264
|
+
nameSingular
|
|
265
|
+
labelSingular
|
|
266
|
+
isActive
|
|
267
|
+
fields {
|
|
268
|
+
edges {
|
|
269
|
+
node {
|
|
270
|
+
id
|
|
271
|
+
name
|
|
272
|
+
type
|
|
273
|
+
isNullable
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## ERROR HANDLING
|
|
286
|
+
|
|
287
|
+
| HTTP Status | Meaning | Action |
|
|
288
|
+
|---|---|---|
|
|
289
|
+
| 200 | Success | Check `errors` array in GraphQL response body |
|
|
290
|
+
| 401 | Unauthorized | Token is missing, expired, or wrong workspace |
|
|
291
|
+
| 403 | Forbidden | Token valid but lacks access to the resource |
|
|
292
|
+
| 404 | Not found | Object ID does not exist |
|
|
293
|
+
| 429 | Rate limited | Back off and retry after the period indicated in headers |
|
|
294
|
+
| 500 | Server error | Log and retry; contact workspace admin if persistent |
|
|
295
|
+
|
|
296
|
+
**GraphQL errors** are returned with HTTP 200 but include an `errors` array. Always check `body.errors` after parsing the response.
|