aicrm-mcp 0.4.0 → 0.6.0
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 +18 -4
- package/dist/cli.js +622 -189
- package/package.json +11 -9
- package/skill/aicrm/SKILL.md +36 -30
- package/skill/aicrm-integrate/SKILL.md +130 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aicrm-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MCP server for AICRM — operate your CRM from Claude, Opencode and other MCP clients.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,25 +10,27 @@
|
|
|
10
10
|
"dist",
|
|
11
11
|
"skill"
|
|
12
12
|
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsup",
|
|
15
|
-
"dev": "tsx src/cli.ts",
|
|
16
|
-
"typecheck": "tsc --noEmit"
|
|
17
|
-
},
|
|
18
13
|
"dependencies": {
|
|
19
14
|
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
20
15
|
"papaparse": "^5.7.0",
|
|
21
16
|
"zod": "^4.6.7"
|
|
22
17
|
},
|
|
23
18
|
"devDependencies": {
|
|
24
|
-
"@aicrm/shared": "workspace:*",
|
|
25
19
|
"@types/node": "^22.20.5",
|
|
26
20
|
"@types/papaparse": "^5.3.16",
|
|
27
21
|
"tsup": "^9.0.0",
|
|
28
22
|
"tsx": "^4.23.15",
|
|
29
|
-
"typescript": "^5.9.3"
|
|
23
|
+
"typescript": "^5.9.3",
|
|
24
|
+
"vitest": "^5.0.5",
|
|
25
|
+
"@aicrm/shared": "0.1.0"
|
|
30
26
|
},
|
|
31
27
|
"engines": {
|
|
32
28
|
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"dev": "tsx src/cli.ts",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"test": "vitest run"
|
|
33
35
|
}
|
|
34
|
-
}
|
|
36
|
+
}
|
package/skill/aicrm/SKILL.md
CHANGED
|
@@ -48,7 +48,7 @@ npx -y aicrm-mcp skill > AGENTS-aicrm.md # imprime, para agentes que leem outro
|
|
|
48
48
|
|
|
49
49
|
### 1.5 Primeiro uso
|
|
50
50
|
|
|
51
|
-
1. `list_workspaces` — confirma quem está logado (`you`), o papel (admin
|
|
51
|
+
1. `list_workspaces` — confirma quem está logado (`you`), o papel (admin, manager = Master, member = vendedor) e o que existe.
|
|
52
52
|
2. Se for admin e a conta for nova, `get_setup_status` diz o que falta configurar e qual ferramenta resolve cada passo.
|
|
53
53
|
|
|
54
54
|
Se qualquer ferramenta responder "Não autenticado" ou "Sessão expirada", peça à pessoa para rodar o `login` de novo.
|
|
@@ -71,27 +71,33 @@ Se qualquer ferramenta responder "Não autenticado" ou "Sessão expirada", peça
|
|
|
71
71
|
|
|
72
72
|
O servidor aplica as regras do usuário logado. Nunca tente contornar uma negação.
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
|
77
|
-
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
|
|
|
82
|
-
|
|
|
83
|
-
|
|
|
84
|
-
|
|
|
85
|
-
|
|
|
86
|
-
|
|
|
87
|
-
|
|
|
88
|
-
|
|
|
89
|
-
|
|
|
74
|
+
Há também o papel **developer** (Desenvolvedor), que integra outros sistemas pela API e não vê leads nem o time. Logado com ele, o MCP mostra só as ferramentas de integração. Para esse trabalho, use o skill `aicrm-integrate` (`npx -y aicrm-mcp skill install aicrm-integrate --project`).
|
|
75
|
+
|
|
76
|
+
| Ação | member (vendedor) | manager (Master) — só nos workspaces dele | admin |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| Ver leads | dos workspaces em que está (só os próprios se visibilidade `own`) | todos, mesmo com `own` | todos |
|
|
79
|
+
| Criar lead | para si mesmo | para qualquer vendedor; sem `owner` vai para a distribuição | idem Master |
|
|
80
|
+
| Editar, mover, ganhar/perder, reabrir | os próprios e os sem responsável | todos | todos |
|
|
81
|
+
| Notas | em leads que vê | todos | todos |
|
|
82
|
+
| Importar CSV | com ele mesmo como responsável | qualquer modo; padrão `auto` | qualquer modo; padrão `auto` |
|
|
83
|
+
| Mover em massa | os próprios | todos, e reatribuir | todos, e reatribuir |
|
|
84
|
+
| Excluir lead | — | sim | sim |
|
|
85
|
+
| Distribuição (pausar/liberar, entregar sem dono), leads em risco | — | sim | sim |
|
|
86
|
+
| Plano do dia de outra pessoa | — | dos vendedores do time | de todos |
|
|
87
|
+
| Campos, campos padrão visíveis | só consulta | só consulta | criar, editar, remover |
|
|
88
|
+
| Modelos de importação | usa todos; altera/apaga os que criou | todos | todos |
|
|
89
|
+
| Workspaces, funis, etapas | só consulta | só consulta | tudo |
|
|
90
|
+
| Usuários e convites | só lista | convida **vendedores** para os workspaces dele; ajusta workspaces e desativa vendedores do time; não muda papel | convidar qualquer papel, alterar papel/workspaces, desativar |
|
|
91
|
+
| Metas e comissão | consulta e dashboard | define metas; planos de comissão só consulta | definir metas e planos |
|
|
92
|
+
| Modo TV | — | criar, listar, revogar links dos funis dele | criar, listar, revogar links |
|
|
93
|
+
| Tokens de API | os próprios | os próprios | os próprios |
|
|
94
|
+
|
|
95
|
+
**Quem recebe leads automaticamente:** só vendedores (`member`). Admins e Masters nunca entram na distribuição por desempenho nem no rodízio (`round_robin`); podem assumir um lead de propósito (`update_lead` com `owner` = eles mesmos).
|
|
90
96
|
|
|
91
97
|
Como ler as respostas de erro:
|
|
92
|
-
- **"… (seu usuário não tem permissão para isso — peça a um admin)"** → explique em uma frase que essa ação é de admin.
|
|
98
|
+
- **"… (seu usuário não tem permissão para isso — peça a um admin ou Master)"** → explique em uma frase que essa ação é de admin (ou de Master, se for operação do time).
|
|
93
99
|
- **"Lead não encontrado" / "Workspace não encontrado"** → pode não existir **ou** a pessoa não ter acesso (o servidor não diferencia, de propósito). Não insista.
|
|
94
|
-
- **"Só o responsável pelo lead (ou um admin) pode editá-lo"** → o lead é de outra pessoa.
|
|
100
|
+
- **"Só o responsável pelo lead (ou um admin/Master) pode editá-lo"** → o lead é de outra pessoa.
|
|
95
101
|
|
|
96
102
|
## 4. Regras de uso
|
|
97
103
|
|
|
@@ -121,12 +127,12 @@ Como ler as respostas de erro:
|
|
|
121
127
|
| `handoff_lead` | Continuar um lead **ganho** em outro funil (pós-venda, relacionamento): cria um lead novo ligado ao original, na 1ª etapa (ou `stage`), valor R$ 0 (ou `value`), mesmo responsável (ou `owner`). O `get_lead` mostra o vínculo em `came_from` / `continues_in`. |
|
|
122
128
|
| `add_note` | Registrar conversa, ligação, contexto. |
|
|
123
129
|
| `bulk_update_leads` | Mover e/ou reatribuir vários leads de uma vez (ids do `search_leads`). |
|
|
124
|
-
| `delete_lead` | Apagar com histórico (admin, destrutivo). |
|
|
130
|
+
| `delete_lead` | Apagar com histórico (admin ou Master, destrutivo). |
|
|
125
131
|
|
|
126
132
|
### Importação de CSV
|
|
127
133
|
| Ferramenta | Para quê |
|
|
128
134
|
|---|---|
|
|
129
|
-
| `import_leads_csv` | Importar um arquivo local. `dry_run: true` só mostra o plano; `columns` força o destino de colunas; `template_name` salva o mapeamento; `duplicate`: `skip` ou `update` (pelo email); `owner_mode`: `me`, `auto` (por desempenho
|
|
135
|
+
| `import_leads_csv` | Importar um arquivo local. `dry_run: true` só mostra o plano; `columns` força o destino de colunas; `template_name` salva o mapeamento; `duplicate`: `skip` ou `update` (pelo email); `owner_mode`: `me`, `auto` (por desempenho entre os vendedores), `round_robin` (igualmente entre os vendedores), `column`. Sem `owner_mode`, admin e Master usam `auto` (não ficam com a base) e vendedor usa `me`. |
|
|
130
136
|
| `rename_import_template` / `delete_import_template` | Manter os modelos salvos. |
|
|
131
137
|
|
|
132
138
|
### Campos do workspace
|
|
@@ -139,30 +145,30 @@ Como ler as respostas de erro:
|
|
|
139
145
|
### Metas, comissão e previsão
|
|
140
146
|
| Ferramenta | Para quê |
|
|
141
147
|
|---|---|
|
|
142
|
-
| `get_today_plan` | **Plano do dia**: os 5–10 leads abertos que mais ajudam a bater a meta hoje, em ordem, cada um com o motivo (`why`) e a ação sugerida (WhatsApp, próximo passo ou mover de etapa). Padrão: quem está logado; admins passam `seller`. |
|
|
148
|
+
| `get_today_plan` | **Plano do dia**: os 5–10 leads abertos que mais ajudam a bater a meta hoje, em ordem, cada um com o motivo (`why`) e a ação sugerida (WhatsApp, próximo passo ou mover de etapa). Padrão: quem está logado; admins e Masters passam `seller`. |
|
|
143
149
|
| `get_dashboard` | Mês do funil: realizado vs meta do time e de cada vendedor, chance de bater, projeção, cobertura de pipeline, taxa de conversão, comissão. |
|
|
144
150
|
| `get_forecast` | Detalhe de um vendedor: vai bater a meta? |
|
|
145
151
|
| `get_goals` / `set_goals` | Ver/definir metas por vendedor e mês (`target: 0` remove). |
|
|
146
152
|
| `list_commission_plans` / `save_commission_plan` / `delete_commission_plan` | Planos com faixas. `percent`: % da receita (funis de receita). `per_unit`: R$ por unidade (funis de quantidade). |
|
|
147
153
|
|
|
148
|
-
### Time e estrutura (admin)
|
|
154
|
+
### Time e estrutura (admin; Master: convites de vendedores, distribuição e riscos do time dele)
|
|
149
155
|
| Ferramenta | Para quê |
|
|
150
156
|
|---|---|
|
|
151
157
|
| `list_users` | Pessoas, papel, status (ativo, convite pendente, desativado), workspaces. |
|
|
152
158
|
| `invite_user` / `resend_invite` | Convidar e gerar link (vale 7 dias; gerar outro invalida o anterior). Entregue o link à pessoa que pediu — você não envia emails. |
|
|
153
|
-
| `update_user` | Nome, papel, workspaces (lista completa), ativar/desativar. |
|
|
159
|
+
| `update_user` | Nome, papel, workspaces (lista completa), ativar/desativar. Master: só vendedores do time, sem mudar papel; os workspaces fora do time dele são mantidos. |
|
|
154
160
|
| `create_workspace` / `update_workspace` / `delete_workspace` | Workspaces e visibilidade. |
|
|
155
161
|
| `create_funnel` / `update_funnel` / `delete_funnel` | Funis, etapas (com `was` para renomear sem perder leads) e KPI de meta. |
|
|
156
162
|
| `get_distribution` | Distribuição automática de leads no funil: a parte de cada vendedor e o motivo, quem não está recebendo e quantos leads esperam vendedor. Sem `funnel`, lista os bloqueios de todos os funis. |
|
|
157
163
|
| `release_seller` / `pause_seller` | Voltar a mandar (ou parar de mandar) leads novos para um vendedor no funil. Os leads que ele já tem não mudam. |
|
|
158
|
-
| `get_lead_risks` | Leads em risco: abertos que passaram do **dobro** do prazo da etapa (crítico), com valor em risco, onde trava (etapa), com quem (vendedor) e os mais atrasados; também conta quantos só passaram do prazo.
|
|
164
|
+
| `get_lead_risks` | Leads em risco: abertos que passaram do **dobro** do prazo da etapa (crítico), com valor em risco, onde trava (etapa), com quem (vendedor) e os mais atrasados; também conta quantos só passaram do prazo. Admins e Masters. |
|
|
159
165
|
| `assign_unowned_leads` | Entregar os leads abertos sem vendedor do funil, na proporção da distribuição. |
|
|
160
166
|
|
|
161
167
|
### Conta e operação
|
|
162
168
|
| Ferramenta | Para quê |
|
|
163
169
|
|---|---|
|
|
164
170
|
| `get_setup_status` | O que falta configurar (funil, leads, time, metas, TV). |
|
|
165
|
-
| `create_tv_link` / `list_tv_links` / `revoke_tv_link` | Dashboard ao vivo numa TV sem login (admin). O link funciona como senha. |
|
|
171
|
+
| `create_tv_link` / `list_tv_links` / `revoke_tv_link` | Dashboard ao vivo numa TV sem login (admin ou Master). O link funciona como senha. |
|
|
166
172
|
| `list_api_tokens` / `revoke_api_token` | Tokens do próprio usuário. Revogar o token em uso derruba esta conexão. |
|
|
167
173
|
|
|
168
174
|
## 6. Receitas
|
|
@@ -192,10 +198,10 @@ Como ler as respostas de erro:
|
|
|
192
198
|
2. Confirme com a pessoa quantos leads e para quem.
|
|
193
199
|
3. `bulk_update_leads` com os ids e o novo `owner`. Ao desligar alguém, faça isto **antes** de `update_user` com `active: false`.
|
|
194
200
|
|
|
195
|
-
### Distribuição automática de leads (admin)
|
|
196
|
-
- Ligar: `update_funnel` com `auto_assign: true`.
|
|
197
|
-
- Disciplina: todo dia útil o AICRM confere se cada vendedor com leads no funil fez **alguma ação** nele (nota, etapa, próximo passo, ganho/perda, lead novo). Quem não fez nada para de receber leads novos naquele funil até um admin liberar.
|
|
198
|
-
- "Quais leads estão parados?" / "Onde o funil trava?" → `get_lead_risks`. Cada etapa tem um **prazo em dias úteis** (`limit_days` em `update_funnel`; padrão 14). Passou do prazo, o vendedor é avisado; passou do dobro, o admin também. Só mudar de etapa zera a contagem.
|
|
201
|
+
### Distribuição automática de leads (admin e Master)
|
|
202
|
+
- Ligar: `update_funnel` com `auto_assign: true`. Leads que um admin ou Master cria (`create_lead` sem `owner`) ou importa (`owner_mode: "auto"`, o padrão deles) sem vendedor vão para os vendedores na proporção do desempenho: quem fecha mais (e, em funis de receita, negócios maiores) recebe mais; quem tem pouco histórico conta como a média; ninguém fica abaixo de uma parte mínima; carteira muito cheia recebe menos. Leads criados por um vendedor continuam dele. Admins e Masters nunca recebem.
|
|
203
|
+
- Disciplina: todo dia útil o AICRM confere se cada vendedor com leads no funil fez **alguma ação** nele (nota, etapa, próximo passo, ganho/perda, lead novo). Quem não fez nada para de receber leads novos naquele funil até um Master ou admin liberar.
|
|
204
|
+
- "Quais leads estão parados?" / "Onde o funil trava?" → `get_lead_risks`. Cada etapa tem um **prazo em dias úteis** (`limit_days` em `update_funnel`; padrão 14). Passou do prazo, o vendedor é avisado; passou do dobro, o Master e o admin também. Só mudar de etapa zera a contagem.
|
|
199
205
|
- "Quem está parado?" (vendedor sem ação) → `get_distribution` sem funil. Explique o motivo em uma frase e pergunte se deve liberar; só então `release_seller`.
|
|
200
206
|
- Férias ou folga: `pause_seller` (confirme antes) e, na volta, `release_seller`.
|
|
201
207
|
- Leads esperando vendedor (`leads_without_owner`): `assign_unowned_leads`.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aicrm-integrate
|
|
3
|
+
description: Integrar um sistema (site, landing page, formulário, checkout, webhook de pagamento, ERP, app) ao AICRM para que os leads caiam no funil de vendas, usando o SDK @aicrm/sdk e as ferramentas de integração do MCP aicrm (get_integration_schema, create_api_key, send_test_lead, list_api_logs). Use quando a pessoa pedir para mandar leads, contatos, cadastros ou pedidos para o AICRM ou para o CRM, conectar um formulário ao funil, ou criar/depurar uma integração com o AICRM, mesmo sem dizer "SDK" ou "API".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Integrar com o AICRM
|
|
7
|
+
|
|
8
|
+
O AICRM é um CRM de vendas. Workspaces têm **funis**, funis têm **etapas**, e cada lead entra numa etapa. A integração faz os leads do sistema da pessoa caírem no funil certo, identificados como vindos da API. Seu trabalho é entregar isso funcionando, com o mínimo de esforço para ela.
|
|
9
|
+
|
|
10
|
+
Regras que valem sempre:
|
|
11
|
+
- **Nunca peça, mostre ou escreva uma chave no código ou no chat.** Chaves só vão para o `.env`, pela ferramenta `create_api_key`.
|
|
12
|
+
- **Chave secreta (`aicrm_sk_`) só no servidor.** No navegador, use uma chave pública (`aicrm_pk_`). O SDK e a API recusam uma chave secreta no navegador.
|
|
13
|
+
- **Comece em modo teste.** Leads de teste caem no funil com o selo "Teste" e não atrapalham as metas do time. Produção só com o ok explícito da pessoa.
|
|
14
|
+
- **Mostre o mapeamento de campos antes de escrever o código** e espere a confirmação.
|
|
15
|
+
|
|
16
|
+
## 1. Conexão
|
|
17
|
+
|
|
18
|
+
Confira se as ferramentas `get_integration_schema` e `create_api_key` estão disponíveis. Se não estiverem, peça à pessoa para rodar no terminal dela (a senha não passa por você):
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx -y aicrm-mcp login --url https://aicrm.dev # ou o endereço do AICRM da empresa
|
|
22
|
+
claude mcp add aicrm -- npx -y aicrm-mcp
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Ela precisa estar convidada no AICRM com o papel **Desenvolvedor** (ou ser admin). Depois de conectar, o cliente MCP precisa ser reiniciado.
|
|
26
|
+
|
|
27
|
+
## 2. Roteiro
|
|
28
|
+
|
|
29
|
+
### Passo 1: entender o CRM
|
|
30
|
+
Rode `get_integration_schema`. Anote:
|
|
31
|
+
- o funil onde os leads devem entrar (pergunte se houver mais de um e o pedido não deixar claro);
|
|
32
|
+
- as etapas (o lead entra na primeira, a não ser que se mande `stage`);
|
|
33
|
+
- os campos **obrigatórios**, porque sem eles a API recusa o lead.
|
|
34
|
+
|
|
35
|
+
### Passo 2: achar de onde vêm os leads
|
|
36
|
+
Procure no código da pessoa o ponto em que um lead nasce:
|
|
37
|
+
- **Formulário no site** (contato, orçamento, newsletter): o handler de submit, a action, a rota de API que recebe o form.
|
|
38
|
+
- **Checkout ou pagamento:** o webhook do provedor (Stripe, Mercado Pago, Pagar.me, Asaas…), a criação de pedido.
|
|
39
|
+
- **Cadastro de usuário:** o signup, o onboarding.
|
|
40
|
+
- **Outro sistema:** jobs, filas, integrações com ERP.
|
|
41
|
+
|
|
42
|
+
Prefira integrar **no servidor** sempre que existir um backend: é mais seguro e permite atualizar o lead depois (pagamento aprovado → ganho). Use a chave pública só quando o site não tem backend (site estático, landing page).
|
|
43
|
+
|
|
44
|
+
### Passo 3: propor o mapeamento e confirmar
|
|
45
|
+
Mostre uma tabela curta e peça o ok:
|
|
46
|
+
|
|
47
|
+
| No sistema | No AICRM | Observação |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| `form.nome` | `name` | obrigatório |
|
|
50
|
+
| `form.email` | `email` | |
|
|
51
|
+
| `form.cidade` | `fields.Cidade` | obrigatório no workspace |
|
|
52
|
+
| `pedido.id` | `externalId` | evita duplicar em reenvios |
|
|
53
|
+
| `pedido.total` | `value` | em reais |
|
|
54
|
+
|
|
55
|
+
Se faltar um dado obrigatório no sistema, diga e sugira de onde tirar, ou um valor padrão combinado com a pessoa.
|
|
56
|
+
|
|
57
|
+
### Passo 4: chave de teste no `.env`
|
|
58
|
+
Chame `create_api_key` com `mode: "test"`:
|
|
59
|
+
- `kind: "secret"` para o servidor;
|
|
60
|
+
- `kind: "publishable"` com `funnel` (e `allowed_origins`, se já souber o domínio) para o navegador;
|
|
61
|
+
- `env_file` com o arquivo de variáveis do projeto (`.env`, `.env.local`…);
|
|
62
|
+
- `env_var` no padrão do framework quando a chave for usada no navegador (`VITE_AICRM_KEY`, `NEXT_PUBLIC_AICRM_KEY`).
|
|
63
|
+
|
|
64
|
+
A ferramenta grava a chave, grava `AICRM_API_URL` quando a API não é a padrão (`https://api.aicrm.dev`) e põe o `.env` no `.gitignore`. Você recebe só o prefixo. Se o projeto tiver um `.env.example`, acrescente lá o nome da variável **sem valor**.
|
|
65
|
+
|
|
66
|
+
### Passo 5: escrever o código
|
|
67
|
+
Instale com o gerenciador do projeto (`npm i @aicrm/sdk`, `pnpm add @aicrm/sdk`, `yarn add @aicrm/sdk` ou `bun add @aicrm/sdk`). Depois de instalar, a referência completa do SDK está em `node_modules/@aicrm/sdk/README.md`.
|
|
68
|
+
|
|
69
|
+
Servidor (Node, Next.js route handler, Express, edge):
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { AICRM } from "@aicrm/sdk";
|
|
73
|
+
|
|
74
|
+
const aicrm = new AICRM(); // lê AICRM_API_KEY (e AICRM_API_URL, se houver) do ambiente
|
|
75
|
+
|
|
76
|
+
export async function onLead(input: { nome: string; email: string; cidade: string; pedidoId: string; total: number }) {
|
|
77
|
+
const { data, error } = await aicrm.leads.create({
|
|
78
|
+
funnel: "Vendas", // nome ou id, do get_integration_schema
|
|
79
|
+
name: input.nome,
|
|
80
|
+
email: input.email,
|
|
81
|
+
value: input.total, // em reais
|
|
82
|
+
fields: { Cidade: input.cidade },
|
|
83
|
+
externalId: input.pedidoId, // mesmo id = mesmo lead
|
|
84
|
+
metadata: { origem: "checkout" },
|
|
85
|
+
});
|
|
86
|
+
if (error) console.error(`[aicrm] ${error.code}: ${error.message}`);
|
|
87
|
+
return data;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Navegador, com chave pública (o funil já vem da chave):
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import { AICRM } from "@aicrm/sdk";
|
|
95
|
+
const aicrm = new AICRM(import.meta.env.VITE_AICRM_KEY);
|
|
96
|
+
const { error } = await aicrm.leads.create({ name, email, phone, metadata: { pagina: location.pathname } });
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Boas práticas:
|
|
100
|
+
- O SDK **não lança exceção** por erro da API: confira `error` e registre `error.code`. Uma falha no CRM não deve quebrar o fluxo principal da pessoa, então não bloqueie o checkout por causa do lead.
|
|
101
|
+
- Use `externalId` sempre que houver um id estável. Webhooks são reenviados e isso evita duplicatas.
|
|
102
|
+
- Depois que o lead existe: `aicrm.leads.move(id, "Proposta")`, `aicrm.leads.win(id, { value })`, `aicrm.leads.lose(id, "price")` e `aicrm.leads.addNote(id, "texto")`. Para achar pelo id do sistema: `aicrm.leads.find({ externalId })`.
|
|
103
|
+
- Não envie dados que a pessoa não pediu para mandar ao CRM (senha, cartão, documentos).
|
|
104
|
+
|
|
105
|
+
### Passo 6: testar de verdade
|
|
106
|
+
Rode o fluxo real: o teste do projeto, o servidor local com um `curl` no endpoint, ou o próprio formulário. Em seguida chame `list_api_logs`:
|
|
107
|
+
- **201/200:** o lead entrou. Diga em que funil e etapa caiu.
|
|
108
|
+
- **Erro:** leia `error_code` e `how_to_fix`, corrija e rode de novo. Para ver o que foi enviado, use `get_api_log`.
|
|
109
|
+
|
|
110
|
+
Para conferir só a estrutura, sem o código, `send_test_lead` manda o payload de exemplo. Não use isso como prova de que o código funciona.
|
|
111
|
+
|
|
112
|
+
### Passo 7: produção (com o ok da pessoa)
|
|
113
|
+
Explique que os leads passarão a ir para o time de verdade e pergunte se pode. Com o sim:
|
|
114
|
+
1. Chame `create_api_key` com `mode: "live"` e `confirm_live: true`, gravando no arquivo de produção que a pessoa indicar, ou oriente-a a pôr a variável no provedor de hospedagem (Vercel, Railway…).
|
|
115
|
+
2. Ofereça `clear_test_leads` para tirar do funil os leads de teste.
|
|
116
|
+
3. Resuma o que foi feito, os arquivos alterados e como desligar (`revoke_api_key`).
|
|
117
|
+
|
|
118
|
+
## 3. Erros mais comuns
|
|
119
|
+
|
|
120
|
+
| `code` | O que fazer |
|
|
121
|
+
|---|---|
|
|
122
|
+
| `required_field_missing` | Mande o campo citado em `field`. Veja os obrigatórios em `get_integration_schema` |
|
|
123
|
+
| `field_not_found` / `stage_not_found` / `funnel_not_found` | Use os nomes listados na mensagem |
|
|
124
|
+
| `ambiguous_funnel` | Mande também `workspace` ou use o id do funil |
|
|
125
|
+
| `secret_key_in_browser` | Mova a chamada para o servidor, ou crie uma chave `publishable` |
|
|
126
|
+
| `origin_not_allowed` | O domínio não está na chave pública: crie uma com o domínio certo |
|
|
127
|
+
| `invalid_api_key` | Variável errada ou chave revogada: confira o `.env` e o nome da variável |
|
|
128
|
+
| `rate_limited` | Muitas chamadas por minuto: para cargas grandes, use a importação de planilha do CRM |
|
|
129
|
+
|
|
130
|
+
A lista completa, com como resolver cada um, também está em `how_to_fix` nos logs e em `https://aicrm.dev/llms.txt`.
|