@lionchat/mcp-server 1.15.0 → 1.17.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/dist/docs/instructions.md +12 -1
- package/dist/docs/prompts/create_flow_brainstorm.json +1 -1
- package/dist/docs/prompts/customer_health.json +1 -1
- package/dist/docs/prompts/productivity_report.json +1 -1
- package/dist/docs/prompts/quality_audit.json +1 -1
- package/dist/docs/prompts/stuck_leads.json +1 -1
- package/dist/docs/prompts/team_load_balance.json +1 -1
- package/dist/docs/prompts/weekly_recap.json +1 -1
- package/dist/docs/prompts/whatsapp_template_usage.json +1 -1
- package/dist/docs/resources/api-conventions.md +20 -1
- package/dist/docs/resources/best-practices.md +9 -3
- package/dist/docs/resources/conversation-flows.md +12 -0
- package/dist/docs/resources/data-model.md +87 -20
- package/dist/docs/resources/filtros-e-relatorios.md +7 -2
- package/dist/docs/resources/flowbuilder-design-guide.md +179 -32
- package/dist/docs/resources/flowbuilder-patterns.md +20 -5
- package/dist/docs/resources/formularios-publicos.md +110 -28
- package/dist/docs/resources/glossary.md +26 -1
- package/dist/docs/resources/kanban-deep-dive.md +19 -1
- package/dist/docs/resources/reports-guide.md +108 -10
- package/dist/docs/resources/troubleshooting.md +110 -1
- package/dist/tools.js +179 -38
- package/dist/tools.js.map +1 -1
- package/endpoints.json +3343 -42
- package/package.json +1 -1
|
@@ -120,7 +120,11 @@ marcar supervisor num lugar protege no outro.
|
|
|
120
120
|
|
|
121
121
|
### Datas
|
|
122
122
|
- **Formato:** ISO 8601 com timezone, ex: `"2026-05-18T14:32:00-03:00"`
|
|
123
|
-
- **Timezone
|
|
123
|
+
- **Timezone:** a CONTA tem fuso próprio — leia `timezone` em `lionchat_account_show` (IANA, ex.
|
|
124
|
+
`America/Sao_Paulo`, `America/Campo_Grande`) e use ELE em filtros de data, `timezone_offset` de
|
|
125
|
+
relatórios e ao escrever horários. O padrão da plataforma é `America/Sao_Paulo` (UTC-3), mas
|
|
126
|
+
Mato Grosso, Mato Grosso do Sul, Amazonas e Acre são outro fuso e há cliente fora do Brasil.
|
|
127
|
+
Nunca chute -3.
|
|
124
128
|
- **Timestamps Unix** aparecem em alguns campos (ex: `last_activity_at`) — sempre em segundos, não milissegundos
|
|
125
129
|
|
|
126
130
|
### Paginação
|
|
@@ -269,6 +273,8 @@ teams, conversations_summary) exigem as DUAS pontas; nos demais, `since` ou `unt
|
|
|
269
273
|
2. lionchat_campaigns_estimate_audience (MESMO audience+mode) → mostrar contagem ao usuário
|
|
270
274
|
3. CONFIRMAR com o usuário (é envio em massa — seção 7b)
|
|
271
275
|
4. lionchat_campaigns_create (inbox_id define o tipo: WhatsApp oficial, QR Code/WAHA, SMS, Website)
|
|
276
|
+
Modelo oficial com variáveis: `template_params.processed_params.body` precisa ter TODAS as
|
|
277
|
+
posições (`"1"`, `"2"`...) preenchidas — posição vazia NÃO falha, sai como "." pra todo mundo.
|
|
272
278
|
5. Acompanhar com lionchat_campaigns_statistics (sent/delivered/read/failed)
|
|
273
279
|
```
|
|
274
280
|
Estrutura do audience: `[{type:'Label', id}, {type:'Funnel', id, stages:[], include_won, include_lost}, {type:'ConversationAttribute', key, value}]`.
|
|
@@ -352,6 +358,9 @@ Antes de QUALQUER ação que escreve, modifica, apaga ou envia, pare e avalie se
|
|
|
352
358
|
**Aja sem perguntar apenas em operações idempotentes:** leitura, busca, resumo, classificação.
|
|
353
359
|
|
|
354
360
|
**Excluir agente/usuário (`lionchat_agents_destroy`) — SEMPRE pergunte o destino primeiro.** Se o agente tem recursos vinculados (conversas, tarefas — inclusive as que ele **criou** —, cards do Kanban, campanhas, agendamentos), o sistema EXIGE um destino de reatribuição. Antes de excluir: consulte `lionchat_agents_assigned_resources` (o retorno inclui `tasks_created`, tarefas criadas por ele); se houver QUALQUER recurso, **pergunte pra qual agente transferir tudo** e passe `reassign_to_agent_id` no destroy. Nunca tente excluir sem o destino — o sistema recusa e o trabalho do agente ficaria órfão. Ao excluir, tudo passa pro agente escolhido; o excluído fica só no histórico.
|
|
361
|
+
Quando o pedido for "fulano saiu e ciclano entrou no lugar", prefira `lionchat_agents_replace` a
|
|
362
|
+
`destroy` + `create`: a troca é uma só, a carteira vai inteira pro novo e a vaga do plano não
|
|
363
|
+
trava a criação.
|
|
355
364
|
|
|
356
365
|
**NUNCA sobrescreva por inferência dados já preenchidos.** Em especial, **NUNCA sobrescreva telefone ou e-mail existente de um contato** — se já há valor preenchido, pergunte antes de alterar.
|
|
357
366
|
|
|
@@ -372,6 +381,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
372
381
|
| Criar/editar **formulário público de captação** (página de captura própria) | `lionchat_lead_forms_create` / `_update` | Leia `lionchat://docs/formularios-publicos` ANTES — o desenho vai em `form_data` e só entra no ar depois do `publish` (que valida o desenho e pode voltar 422 com a lista de pendências). Caixa de WhatsApp vinculada (`inbox_id`) é obrigatória pra publicar. Escrita é só de administrador |
|
|
373
382
|
| **Testar um formulário** antes de publicar | `lionchat_lead_forms_test_run` | Roda o RASCUNHO no motor real e desfaz tudo no fim — zero rastro. Mande `answers: [{node_id, value}]` (até 60) pra reproduzir um caminho; a resposta traz o bloco atual + o log do percurso |
|
|
374
383
|
| Conferir se um site **aceita ser exibido dentro do formulário** (bloco Página externa) | `lionchat_lead_forms_check_embed` | Body `{url}`; devolve `{status: allowed\|blocked\|unknown, reason}`. Grave o veredito em `embed_allowed` do bloco. Admin-only |
|
|
384
|
+
| Ver **tudo que uma pessoa preencheu** (nosso formulário, anúncio do Meta, Webhook Universal, fluxo) | `lionchat_contacts_form_entries_list` / `_show` | Por CONTATO, sem paginação (teto 250 por origem, `meta.truncated`). O detalhe de Meta/webhook mostra SÓ os campos vinculados e gravados — nunca o payload cru. `show` exige `source` + `id` da mesma linha |
|
|
375
385
|
| Anexar arquivo a uma mensagem | `lionchat_upload_create` primeiro, depois usar o retorno em `lionchat_conversations_messages_create` | Confira `lionchat_upload_limits` se o arquivo for grande |
|
|
376
386
|
| Marcar conversa como **lida** | `lionchat_conversations_update_last_seen` | NÃO use `unread` (esse marca como NÃO-lida) |
|
|
377
387
|
| Criar/gerenciar **campanha** (disparo WhatsApp/SMS) | `lionchat_campaigns_*` (criar, estatísticas) | SEMPRE rode `campaigns_estimate_audience` antes de criar e mostre a contagem. Disparo em massa = confirmação obrigatória (seção 7b) |
|
|
@@ -392,6 +402,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
392
402
|
| **Mudar o modo de distribuição do time** (Rodízio × Equilibrado) | `lionchat_teams_update` (`assignment_order`: `round_robin` \| `balanced`) | **`null` é valor válido e significa "o time não escolheu"** — a decisão herda da política da caixa, depois do `auto_assignment_config` da caixa, e por fim rodízio. NUNCA gravar `round_robin` só para "preencher": isso rebaixa em silêncio uma caixa que roda Equilibrado por política. `balanced` exige o recurso `advanced_assignment` na conta |
|
|
393
403
|
| **Mudar o modo de distribuição da caixa** (Rodízio × Equilibrado) | `lionchat_inboxes_update` (`auto_assignment_config.assignment_order`) | Só vale quando a caixa NÃO tem política vinculada (com política, a política manda). O jsonb é SUBSTITUÍDO, não mesclado: releia o `auto_assignment_config` atual e reenvie as outras chaves junto, senão apaga o `assign_offline_agents` e o freio |
|
|
394
404
|
| **Criar/atualizar time** | `lionchat_teams_create` / `_update` | **Preencha `description`**: desde 03/08 é ela que o AI Agente lê pra decidir o roteamento por time. Descreva QUANDO mandar pra lá, não o que o time é |
|
|
405
|
+
| **Trocar um atendente por outro** ("fulano saiu, entrou ciclano") | `lionchat_agents_replace` (`POST /agents/{id}/replace`, body `agent: {email, name, role}`; `inherit_memberships` default `true`) | Faz os dois passos de uma vez: cria o novo (passa pelo limite de vagas do plano por 30 min), manda a carteira inteira (conversas, cards, tarefas, agendamentos) e exclui o antigo em segundo plano. Responde **202** com `new_agent` — o antigo some da lista quando a transferência termina (`replacing: true` em `agents_list` enquanto roda). **Confirme antes** (seção 7a: é exclusão). Recusas 422: substituir a si mesmo, agente de suporte, e-mail já membro, e o **único administrador confirmado só troca por usuário já confirmado** (convide e espere aceitar). `agents_destroy` recusa quem está ENTRANDO numa substituição viva. Admin-only |
|
|
395
406
|
| **Pausar a automação no meio** (esperar atribuição/card antes da próxima ação) | ação `wait` em `lionchat_automation_rules_create` / `_update` | Segundos, teto 300. Acima disso é caso de FlowBuilder. Ver `lionchat://docs/conversation-flows` |
|
|
396
407
|
| **Buscar contato/conversa/card** | `lionchat_search_*`, `lionchat_contacts_search` | **Termo com letra exige 3+ caracteres** (dígito é isento). Menos que isso volta VAZIO sem erro — não conclua que o registro não existe. Ver `lionchat://docs/api-conventions` |
|
|
397
408
|
| **Migrar conversas** de uma caixa WhatsApp pra outra (ex.: QR Code → Oficial) | `lionchat_inboxes_inbox_migration_list` (prévia) → `_execute` → acompanhar status | Admin-only e IRREVERSÍVEL: sempre mostre os números da prévia e confirme (seção 7a). Grupos não vão pro canal oficial — ficam na caixa de origem |
|
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
"arguments": [
|
|
6
6
|
{ "name": "goal_hint", "description": "O que o cliente ja disse que quer (ex: 'fluxo de captura de lead')", "required": false }
|
|
7
7
|
],
|
|
8
|
-
"template": "Cliente quer criar um fluxo no FlowBuilder do LionChat.\n\nObjetivo declarado: {{goal_hint|Nao informado}}\n\nINSTRUCAO: avalie o que o cliente JA disse e o que ainda falta saber. Pergunte SO o que falta. Nao force checklist. Em fluxo simples, 2-3 perguntas bastam. Em fluxo complexo, aprofunde.\n\nABAIXO esta o BANCO de perguntas sugeridas por categoria. ESCOLHA SO AS RELEVANTES.\n\n## Categoria A — Proposito e gatilho (quase sempre necessario)\n- Qual o objetivo do fluxo? (saudacao, qualificacao, captura, suporte, pos-venda, CSAT, agendamento, re-engajamento, outro)\n- Quando dispara? (mensagem recebida com palavra-chave, conversa criada, conversa resolvida, label aplicada,
|
|
8
|
+
"template": "Cliente quer criar um fluxo no FlowBuilder do LionChat.\n\nObjetivo declarado: {{goal_hint|Nao informado}}\n\nINSTRUCAO: avalie o que o cliente JA disse e o que ainda falta saber. Pergunte SO o que falta. Nao force checklist. Em fluxo simples, 2-3 perguntas bastam. Em fluxo complexo, aprofunde.\n\nABAIXO esta o BANCO de perguntas sugeridas por categoria. ESCOLHA SO AS RELEVANTES.\n\n## Categoria A — Proposito e gatilho (quase sempre necessario)\n- Qual o objetivo do fluxo? (saudacao, qualificacao, captura, suporte, pos-venda, CSAT, agendamento, re-engajamento, outro)\n- Quando dispara? (mensagem recebida com palavra-chave, conversa criada, conversa resolvida, label aplicada, data na ficha do contato, webhook externo)\n- O gatilho e um agendamento (criado / cancelado / remarcado / concluido)? Se sim, sao os gatilhos booking_* do Booking nativo (nao e e-Clinica)\n- Se palavra-chave: quais palavras? Match exact ou contains?\n\n## Categoria B — Canal e escopo\n- Em qual canal vai rodar? (WAHA, WhatsApp Cloud, Webwidget, Telegram, Email, Twitter, Facebook, Instagram, Line, SMS, API, Voz, WhatsApp Business)\n- Em qual(is) inbox(es) especifica(s)? (peca o ID via inboxes_list se nao soube)\n- Tem filtro de quem entra? (so leads novos, so clientes existentes, so quem tem label X)\n\n## Categoria C — Conteudo da conversa\n- Vai mandar quais mensagens? Texto livre, templates WhatsApp aprovados, midia (imagem/audio/video), lista de botoes interativos?\n- Vai fazer perguntas pro cliente? Quantas? Quais?\n- Para cada pergunta: aceita qualquer resposta livre, opcoes fixas (ex: 1/2/3), ou regex (ex: CPF, email, telefone)?\n- Quanto tempo espera por cada resposta? (default sensato: 30-60 min)\n- O que mandar se nao responder no tempo? (mensagem de timeout, encerrar, escalar pra humano) — a espera tem tempo? Sem fio no timeout, o fluxo TERMINA quando o tempo estoura\n\n## Categoria D — Captura, ramificacao e logica\n- Onde salva as respostas? Em variavel temporaria do flow, atributo da conversa, atributo do contato, custom_attributes\n- Tem ramificacao por condicao? Quais criterios? (ex: 'se valor > 1000 vai pra time premium')\n- Vai chamar API externa? (URL, metodo, headers, body, autenticacao)\n- Vai usar IA (Captain Assistant)? Em que momento? Pra que?\n * generate = gerar resposta natural\n * intent = classificar intencao da mensagem\n * sentiment = analisar sentimento\n * extract = extrair info estruturada (CPF, valor, etc)\n- Tem teste A/B? (randomizer — divide na proporcao configurada, 50/50 alterna; nao e sorteio)\n- Toda saida de bloco vai ter fio? Saida sem fio ENCERRA o fluxo (nao \"cai no proximo\")\n- Se for fluxo de grupo: quer convite no privado pra quem nao entrar no grupo? (groupInviteOnFailure + groupInviteMessage)\n\n## Categoria E — Acoes finais\n- No fim do fluxo: criar card no Kanban? (em qual funil/etapa?) Atribuir agente/time? (ID) Adicionar/remover label? Mudar status/prioridade? Disparar webhook externo?\n- Tem criterio pra encerrar antes? (exit_conditions: ex: 'conversa marcada como resolvida' ou 'label X aplicada')\n\n## Antes de chamar flows_create\n1. Se faltou info CRITICA (ex: canal, gatilho, conteudo basico): pergunte agora\n2. Se a info que falta e mero detalhe: assuma defaults sensatos\n - maxRetries: 3\n - waitTime: 60min para resposta, 30min para timeouts\n - sem ramificacao se cliente nao mencionou\n3. Apresente um RESUMO em linguagem natural do fluxo. Exemplo: 'Beleza, vou criar um fluxo assim: quando alguem mandar oi no WhatsApp, manda saudacao, pergunta se quer vendas/suporte, se vendas atribui ao time 1, se suporte ao time 2. Confirma?'\n4. Espere o cliente confirmar OU pedir ajustes\n5. So depois da confirmacao, chame flows_create\n6. ANTES de gerar o JSON: consulte lionchat://docs/flowbuilder-design-guide pra schema/handles/layout e lionchat://docs/flowbuilder-patterns pra ver se algum template ja resolve\n7. Apos gerar JSON, valide pelo checklist da secao 6 do design guide\n8. NUNCA crie node sem position. NUNCA invente sourceHandle.\n\nDEFAULTS SENSATOS quando cliente nao especificar:\n- channel_type: pergunte sempre, nao chute\n- inbox_ids: pergunte sempre\n- waitTime: 60 minutes\n- maxRetries: 3\n- waitUnit: minutes\n- saveTo: 'conversation_attr' (atributo da conversa) na duvida — NUNCA use 'attribute' (valor inexistente, nao salva nada)\n- match_mode: 'contains' pra keywords"
|
|
9
9
|
}
|
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
"required": true
|
|
10
10
|
}
|
|
11
11
|
],
|
|
12
|
-
"template": "Gere visão **360° do cliente** identificado por: **{{contact_identifier}}**\n\n## Passos\n\n1. **Localize o contato** (use `lionchat_contacts_search` com `q={{contact_identifier}}`):\n - Se múltiplos resultados, mostre os top 3 e peça confirmação\n - Se nenhum, reporte e pare\n\n2. **Detalhes do contato** (use `lionchat_contacts_show`):\n - Nome, email, telefone, identifier\n - custom_attributes (importante! pode ter dados de negócio)\n - Empresa vinculada (se houver)\n - Data de criação no LionChat\n\n3. **Histórico de conversas** (use `lionchat_contacts_list_1` — GET /contacts/{id}/conversations — passando o `id` do contato):\n - Total de conversas com esse cliente\n - Status atual: quantas abertas, resolvidas, pendentes\n - Últimas 5 conversas (com data e display_id)\n\n4. **Conversa mais recente** (use `lionchat_conversations_messages_list` da última conversa):\n - Pegue as últimas 10 mensagens pra contexto\n - Identifique tom (cordial, irritado, satisfeito)\n - Status atual e último agente atribuído\n\n5. **Cards Kanban vinculados** (use `lionchat_kanban_items_filter` por conversation_display_ids):\n - Em quais funis está\n - Etapas atuais\n - Valor total no pipeline\n\n6. **CSAT histórico** (use `lionchat_csat_list` filtrando por contact_id se possível, senão por conversas dele):\n - Notas recebidas, feedbacks\n - Tendência (melhorando/piorando)\n\n7. **Engajamento** (calcule a partir dos dados):\n - Frequência de interação (conversas/mês)\n - Tempo desde última conversa (sinal de churn?)\n - Taxa de resposta dele (incoming vs outgoing)\n\n## Apresentação\n\n```markdown\n# 👤 Cliente: [Nome] — Visão 360°\n\n## 📇 Identificação\n- **Email:** ...\n- **Telefone:** ...\n- **Empresa:** ...\n- **Cadastrado em:** DD/MM/YYYY (X meses atrás)\n- **Custom:** [campos relevantes do custom_attributes]\n\n## 📊 Status\n- **Health Score:** 🟢 Saudável / 🟡 Atenção / 🔴 Risco\n- **Última interação:** DD/MM/YYYY (X dias atrás)\n- **Conversas totais:** N | Abertas: M | Resolvidas: K\n- **CSAT médio:** X⭐ (baseado em N respostas)\n\n## 💰 Pipeline (Kanban)\n- **Funil [X]:** Etapa Y — R$ Z (parado há W dias)\n- **Funil [X2]:** Etapa Y2 — R$ Z2\n\n## 💬 Última Conversa (#display_id)\n- **Data:** DD/MM HH:MM\n- **Status:** Aberta/Resolvida\n- **Agente:** Nome\n- **Resumo (2-3 linhas):** O que aconteceu na última interação\n- **Tom percebido:** Cordial / Frustrado / Satisfeito\n\n## ⚠️ Sinais de Alerta\n[Lista sinais detectados:]\n- Sem interação há >30 dias\n- Última CSAT foi 2⭐\n- Card parado em \"Negociação\" há 21 dias\n- Cliente comentou \"vou avaliar concorrentes\"\n\n## 💡 Próximos Passos Sugeridos\n[2-3 ações concretas:]\n1. Ligar pra entender por que parou de responder\n2. Mover card pra etapa \"Em risco\"\n3. Enviar pesquisa de feedback\n```\n\n## Health Score (como calcular)\n\n- 🟢 **Saudável:** última interação <30d + CSAT ≥4 + sem sinais negativos\n- 🟡 **Atenção:** última interação 30-90d OU CSAT 3-3.9 OU card parado >14d\n- 🔴 **Risco:** última interação >90d OU CSAT <3 OU múltiplos cards parados OU mensagens frustradas recentes\n\n## Importante\n\n- Seja honesto no Health Score. Não infle: 🟢 só se realmente saudável.\n- **Não invente sinais.** Só liste o que viu nos dados.\n- Se cliente é novo (<30 dias), avise: \"Pouco histórico, score preliminar\".\n- Se múltiplos contatos com o mesmo nome, peça pra desambiguar antes de continuar.\n- Datas em PT-BR (DD/MM/YYYY)."
|
|
12
|
+
"template": "Gere visão **360° do cliente** identificado por: **{{contact_identifier}}**\n\n## Passos\n\n1. **Localize o contato** (use `lionchat_contacts_search` com `q={{contact_identifier}}`):\n - Se múltiplos resultados, mostre os top 3 e peça confirmação\n - Se nenhum, reporte e pare\n\n2. **Detalhes do contato** (use `lionchat_contacts_show`):\n - Nome, email, telefone, identifier\n - custom_attributes (importante! pode ter dados de negócio)\n - Empresa vinculada (se houver)\n - Data de criação no LionChat\n\n3. **Histórico de conversas** (use `lionchat_contacts_list_1` — GET /contacts/{id}/conversations — passando o `id` do contato):\n - Total de conversas com esse cliente\n - Status atual: quantas abertas, resolvidas, pendentes\n - Últimas 5 conversas (com data e display_id)\n\n4. **Conversa mais recente** (use `lionchat_conversations_messages_list` da última conversa):\n - Pegue as últimas 10 mensagens pra contexto\n - Mensagem com `content_attributes.deleted: true` foi APAGADA pelo cliente (não cite o texto como se estivesse de pé); `edited: true` = o `content` já é a versão editada\n - Identifique tom (cordial, irritado, satisfeito)\n - Status atual e último agente atribuído\n\n5. **Cards Kanban vinculados** (use `lionchat_kanban_items_filter` por conversation_display_ids):\n - Em quais funis está\n - Etapas atuais\n - Valor total no pipeline\n\n6. **CSAT histórico** (use `lionchat_csat_list` filtrando por contact_id se possível, senão por conversas dele):\n - Notas recebidas, feedbacks\n - Tendência (melhorando/piorando)\n\n7. **Preenchimentos e agendamentos**:\n - Histórico de formulários (use `lionchat_contacts_form_entries_list` — nosso formulário, anúncio do Meta, Webhook Universal e fluxo, numa lista só; `_show` abre o detalhe)\n - Agendamentos: leia pela TAREFA da Agenda (`lionchat_tasks_list` filtrando tarefas com booking) — `bookings.status` NÃO diz se o agendamento aconteceu (fica `confirmed` mesmo depois de concluído/cancelado pela Agenda)\n\n8. **Engajamento** (calcule a partir dos dados):\n - Frequência de interação (conversas/mês)\n - Tempo desde última conversa (sinal de churn?)\n - Taxa de resposta dele (incoming vs outgoing)\n\n## Apresentação\n\n```markdown\n# 👤 Cliente: [Nome] — Visão 360°\n\n## 📇 Identificação\n- **Email:** ...\n- **Telefone:** ...\n- **Empresa:** ...\n- **Cadastrado em:** DD/MM/YYYY (X meses atrás)\n- **Custom:** [campos relevantes do custom_attributes]\n\n## 📊 Status\n- **Health Score:** 🟢 Saudável / 🟡 Atenção / 🔴 Risco\n- **Última interação:** DD/MM/YYYY (X dias atrás)\n- **Conversas totais:** N | Abertas: M | Resolvidas: K\n- **CSAT médio:** X⭐ (baseado em N respostas)\n\n## 💰 Pipeline (Kanban)\n- **Funil [X]:** Etapa Y — R$ Z (parado há W dias)\n- **Funil [X2]:** Etapa Y2 — R$ Z2\n\n## 💬 Última Conversa (#display_id)\n- **Data:** DD/MM HH:MM\n- **Status:** Aberta/Resolvida\n- **Agente:** Nome\n- **Resumo (2-3 linhas):** O que aconteceu na última interação\n- **Tom percebido:** Cordial / Frustrado / Satisfeito\n\n## ⚠️ Sinais de Alerta\n[Lista sinais detectados:]\n- Sem interação há >30 dias\n- Última CSAT foi 2⭐\n- Card parado em \"Negociação\" há 21 dias\n- Cliente comentou \"vou avaliar concorrentes\"\n\n## 💡 Próximos Passos Sugeridos\n[2-3 ações concretas:]\n1. Ligar pra entender por que parou de responder\n2. Mover card pra etapa \"Em risco\"\n3. Enviar pesquisa de feedback\n```\n\n## Health Score (como calcular)\n\n- 🟢 **Saudável:** última interação <30d + CSAT ≥4 + sem sinais negativos\n- 🟡 **Atenção:** última interação 30-90d OU CSAT 3-3.9 OU card parado >14d\n- 🔴 **Risco:** última interação >90d OU CSAT <3 OU múltiplos cards parados OU mensagens frustradas recentes\n\n## Importante\n\n- Seja honesto no Health Score. Não infle: 🟢 só se realmente saudável.\n- **Não invente sinais.** Só liste o que viu nos dados.\n- Se cliente é novo (<30 dias), avise: \"Pouco histórico, score preliminar\".\n- Se múltiplos contatos com o mesmo nome, peça pra desambiguar antes de continuar.\n- Datas em PT-BR (DD/MM/YYYY)."
|
|
13
13
|
}
|
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
"required": false
|
|
10
10
|
}
|
|
11
11
|
],
|
|
12
|
-
"template": "Gere um **Relatório de Produtividade da Equipe** dos últimos {{period_days|7}} dias.\n\n## Passos a executar\n\n1. **Calcule o período:** since = {{period_days|7}} dias atrás (Unix timestamp em segundos), until = agora
|
|
12
|
+
"template": "Gere um **Relatório de Produtividade da Equipe** dos últimos {{period_days|7}} dias.\n\n## Passos a executar\n\n1. **Calcule o período:** since = {{period_days|7}} dias atrás (Unix timestamp em segundos), until = agora. Leia `timezone` em `lionchat_account_show` e mande `timezone_offset` (em horas, derivado desse fuso) nas chamadas de relatório — não assuma -3 (MS/MT/AM são -4 e há cliente fora do Brasil).\n\n2. **Resumo geral da conta** (use `lionchat_reports_summary` com type='account', business_hours=true):\n - Total de conversas, taxa de resolução, tempo médio de primeira resposta e resolução\n - Compare com período anterior (campo `previous` da resposta)\n\n3. **Performance por agente** (use `lionchat_reports_list` com type='agent', mesmo since/until):\n - Liste cada agente com: conversas atendidas, avg_first_response_time, avg_resolution_time\n - ATENÇÃO: o relatório por agente NÃO traz CSAT médio nem status online. Pegue o CSAT por agente separadamente: `lionchat_csat_list` filtrando por `user_ids` (id do agente) no mesmo período e calcule a média das notas dele.\n - Identifique TOP 3 (por volume + qualidade combinados)\n - Identifique 3 com maior tempo de resposta (potenciais gargalos)\n\n4. **CSAT** (use `lionchat_csat_metrics` com mesmo período):\n - Média geral, distribuição (5⭐, 4⭐, ...)\n - Taxa de resposta CSAT\n\n5. **SLA** (use `lionchat_sla_metrics` se disponível):\n - Hit rate, breach count\n - Nota: o prazo é conferido a cada 5 min, espalhado em até 2 min — um estouro pode aparecer até ~7 min depois do horário-limite. Não conclua que o SLA não está rodando por isso.\n\n## Como apresentar\n\nFormate em **markdown** com:\n\n```markdown\n# 📊 Relatório de Produtividade — Últimos {{period_days|7}} dias\n\n## Visão Geral\n| Métrica | Esta semana | Semana anterior | Variação |\n|---|---|---|---|\n| Conversas | X | Y | +/-Z% |\n| Tempo médio 1ª resposta | X min | Y min | +/-Z% |\n| Tempo médio resolução | X h | Y h | +/-Z% |\n| Taxa de resolução | X% | Y% | +/-Z% |\n\n## Top 3 Agentes\n1. **Nome** — X conversas, Y min 1ª resposta, CSAT Z⭐\n2. ...\n3. ...\n\n## Pontos de Atenção\n- Agente XYZ com tempo de resposta 3x acima da média\n- Inbox WhatsApp com volume crescendo\n\n## CSAT\n- Média: X⭐ (anterior: Y⭐)\n- Taxa de resposta: Z%\n\n## SLA\n- Hits: X% (meta 95%)\n- Breaches: Y conversas\n```\n\n## Conversões importantes\n\n- TODOS os tempos retornados estão em **segundos**. Converta:\n - < 60s → mostre em segundos\n - 60-3600s → mostre em minutos (`X min`)\n - 3600-86400s → mostre em horas (`X h Y min`)\n - \\> 86400s → mostre em dias\n- Datas: use formato brasileiro (DD/MM ou DD/MM HH:MM)\n- Taxas (CSAT, SLA hit rate): mostre como %\n\n## Importante\n\n- Se não tiver dados suficientes (período sem atividade), diga claramente em vez de inventar números\n- Se algum agente tem 0 conversas, OMITA da listagem em vez de mostrar zerado (não inflar lista)\n- Use emojis com moderação (📊 ⭐ 🚨) — máximo 1 por seção"
|
|
13
13
|
}
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
"required": false
|
|
25
25
|
}
|
|
26
26
|
],
|
|
27
|
-
"template": "Faça uma auditoria de qualidade do atendimento nos últimos {{period_days|7}} dias.\n\nFiltros opcionais:\n- Agente: {{agent_id|todos}}\n- Inbox: {{inbox_id|todas}}\n\nAmostrar {{sample_size|20}} conversas RESOLVIDAS aleatoriamente desse período.\n\nPra cada conversa analisar:\n\n### Métricas Quantitativas\n- Tempo da primeira resposta (em minutos)\n- Tempo total de resolução\n- Número de mensagens trocadas\n- CSAT (se houver)\n- Foi reaberta depois? (indicador de problema mal resolvido)\n\n### Análise Qualitativa\n- Tom adequado? (formal/informal alinhado ao canal)\n- Cliente foi cumprimentado adequadamente?\n- Problema foi entendido na primeira interação?\n- Resposta foi clara e resolveu o problema?\n- Houve follow-up ou despedida adequada?\n- Erros gramaticais ou de português?\n\n### Red Flags a destacar\n- Tempo de primeira resposta > 30 min em horário comercial\n- Mais de 10 mensagens pra resolver questão simples\n- Resolução sem confirmação do cliente\n- Mensagens automáticas/copy-paste óbvios sem personalização\n- Tom inadequado (rude, robótico, condescendente)\n\n### Output\n\n## Sumário\n- Conversas auditadas: X\n- Qualidade Geral (1-10): Y\n- Tempo médio de primeira resposta\n- Taxa de reabertura\n\n## Top Problemas Encontrados\n(3-5 padrões recorrentes, com exemplos)\n\n## Top Boas Práticas Identificadas\n(2-3 exemplos pra replicar)\n\n## Recomendações\n- Treinamento focado em: ...\n- Templates de resposta padronizados pra: ...\n- Automações sugeridas: ...\n\nNão expor nomes de agentes em críticas públicas — apenas IDs em report interno."
|
|
27
|
+
"template": "Faça uma auditoria de qualidade do atendimento nos últimos {{period_days|7}} dias.\n\nFiltros opcionais:\n- Agente: {{agent_id|todos}}\n- Inbox: {{inbox_id|todas}}\n\nAmostrar {{sample_size|20}} conversas RESOLVIDAS aleatoriamente desse período.\n\nPra cada conversa analisar (pule mensagens com `content_attributes.deleted: true` — texto apagado pelo cliente — e sinalize conversas cujo último envio está com `status: failed`):\n\n### Métricas Quantitativas\n- Tempo da primeira resposta (em minutos)\n- Tempo total de resolução\n- Número de mensagens trocadas\n- CSAT (se houver)\n- Foi reaberta depois? (indicador de problema mal resolvido)\n\n### Análise Qualitativa\n- Tom adequado? (formal/informal alinhado ao canal)\n- Cliente foi cumprimentado adequadamente?\n- Problema foi entendido na primeira interação?\n- Resposta foi clara e resolveu o problema?\n- Houve follow-up ou despedida adequada?\n- Erros gramaticais ou de português?\n\n### Red Flags a destacar\n- Tempo de primeira resposta > 30 min em horário comercial\n- Mais de 10 mensagens pra resolver questão simples\n- Resolução sem confirmação do cliente\n- Mensagens automáticas/copy-paste óbvios sem personalização\n- Tom inadequado (rude, robótico, condescendente)\n\n### Output\n\n## Sumário\n- Conversas auditadas: X\n- Qualidade Geral (1-10): Y\n- Tempo médio de primeira resposta\n- Taxa de reabertura\n\n## Top Problemas Encontrados\n(3-5 padrões recorrentes, com exemplos)\n\n## Top Boas Práticas Identificadas\n(2-3 exemplos pra replicar)\n\n## Recomendações\n- Treinamento focado em: ...\n- Templates de resposta padronizados pra: ...\n- Automações sugeridas: ...\n\nNão expor nomes de agentes em críticas públicas — apenas IDs em report interno."
|
|
28
28
|
}
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
"required": false
|
|
15
15
|
}
|
|
16
16
|
],
|
|
17
|
-
"template": "Encontre **leads parados no Kanban há mais de {{days_stuck|7}} dias** e gere um plano de ação.\n\n## Passos\n\n1. **Lista funis ativos** (use `lionchat_funnels_list`):\n - Se {{funnel_id}} foi passado, filtra só ele\n - Senão, lista todos não-arquivados\n\n2. **Para cada funil, lista cards** (use `lionchat_kanban_items_list` ou `lionchat_kanban_items_filter`):\n - Filtre por `stage_entered_at` < {{days_stuck|7}} dias atrás\n - Ordene por `item_details.value` desc (maiores valores primeiro)\n - Pegue top 20 (não inunde o usuário)\n\n3. **Para cada card relevante, busque contexto** (se houver `conversation_display_id`):\n - Use `lionchat_conversations_show` pra pegar última atividade\n - Verifique se conversa ainda está ativa\n\n4. **Categorize por gravidade**:\n - 🔴 CRÍTICO: parado >14 dias E valor > R$ 5.000\n - 🟡 ATENÇÃO: parado >7 dias E valor > R$ 1.000\n - 🟢 MONITORAR: parado >7 dias E valor < R$ 1.000\n\n## Apresentação\n\n```markdown\n# 🚨 Leads Parados — Kanban\n\n**Critério:** parados há mais de {{days_stuck|7}} dias.\n**Encontrados:** N cards.\n\n## 🔴 Críticos (urgente)\n\n### Lead: [Nome do contato] — R$ X.XXX\n- **Funil:** Nome do funil\n- **Etapa:** Nome da etapa (parado há X dias)\n- **Última conversa:** Y dias atrás\n- **Ação sugerida:** Reabrir conversa / Ligar / Mover pra Perdido\n\n## 🟡 Atenção\n...\n\n## 🟢 Monitorar\n...\n\n## Resumo\n- Total parado: N cards (R$ X em valor combinado)\n- Tempo médio parado: Y dias\n- Etapa com mais parados: [nome]\n```\n\n## Ações sugeridas (escolha com base no contexto)\n\n- **Última conversa <7 dias:** Reabra a conversa e dê follow-up\n- **Última conversa 7-30 dias:** Envie mensagem de reengajamento\n- **Última conversa >30 dias:** Considere mover pra etapa \"Perdido\" (não vale manter no funil)\n- **Sem conversa nenhuma:** Crie conversa de outreach\n- **Valor alto + parado >14 dias:** Sinalize pra você (o usuário) ligar pessoalmente\n\n## Importante\n\n- Não execute ações automaticamente — apenas SUGIRA. O usuário decide.\n- Se a quantidade for grande (>50 cards), peça permissão antes de listar todos.\n- Use valores reais (não invente). Se um card não tem `value`, mostre \"sem valor\".\n- Datas em formato brasileiro (DD/MM/YYYY)."
|
|
17
|
+
"template": "Encontre **leads parados no Kanban há mais de {{days_stuck|7}} dias** e gere um plano de ação.\n\n## Passos\n\n1. **Lista funis ativos** (use `lionchat_funnels_list`):\n - Se {{funnel_id}} foi passado, filtra só ele\n - Senão, lista todos não-arquivados\n\n2. **Para cada funil, lista cards** (use `lionchat_kanban_items_list` ou `lionchat_kanban_items_filter`):\n - Filtre por `stage_entered_at` < {{days_stuck|7}} dias atrás\n - Ordene por `item_details.value` desc (maiores valores primeiro)\n - Pegue top 20 (não inunde o usuário)\n\n3. **Para cada card relevante, busque contexto** (se houver `conversation_display_id`):\n - Use `lionchat_conversations_show` pra pegar última atividade\n - Verifique se conversa ainda está ativa\n\n4. **Categorize por gravidade**:\n - 🔴 CRÍTICO: parado >14 dias E valor > R$ 5.000\n - 🟡 ATENÇÃO: parado >7 dias E valor > R$ 1.000\n - 🟢 MONITORAR: parado >7 dias E valor < R$ 1.000\n\n## Apresentação\n\n```markdown\n# 🚨 Leads Parados — Kanban\n\n**Critério:** parados há mais de {{days_stuck|7}} dias.\n**Encontrados:** N cards.\n\n## 🔴 Críticos (urgente)\n\n### Lead: [Nome do contato] — R$ X.XXX\n- **Funil:** Nome do funil\n- **Etapa:** Nome da etapa (parado há X dias)\n- **Última conversa:** Y dias atrás\n- **Ação sugerida:** Reabrir conversa / Ligar / Mover pra Perdido\n\n## 🟡 Atenção\n...\n\n## 🟢 Monitorar\n...\n\n## Resumo\n- Total parado: N cards (R$ X em valor combinado)\n- Tempo médio parado: Y dias\n- Etapa com mais parados: [nome]\n```\n\n## Ações sugeridas (escolha com base no contexto)\n\n- **Última conversa <7 dias:** Reabra a conversa e dê follow-up\n- **Última conversa 7-30 dias:** Envie mensagem de reengajamento\n- **Última conversa >30 dias:** Considere mover pra etapa \"Perdido\" (não vale manter no funil) — cite o slug REAL da etapa lido em `lionchat_funnels_show`, nunca um nome chutado\n- **Sem conversa nenhuma:** Crie conversa de outreach\n- **Valor alto + parado >14 dias:** Sinalize pra você (o usuário) ligar pessoalmente\n\n## Importante\n\n- Não execute ações automaticamente — apenas SUGIRA. O usuário decide.\n- Card \"invisível\" por estar numa etapa que o funil não tem NÃO existe mais (desde 19/08/2026 o card é redirecionado na gravação). Se o cliente reclamar de lead sumido, a causa é outra: arquivado ou em outro funil.\n- Se a quantidade for grande (>50 cards), peça permissão antes de listar todos.\n- Use valores reais (não invente). Se um card não tem `value`, mostre \"sem valor\".\n- Datas em formato brasileiro (DD/MM/YYYY)."
|
|
18
18
|
}
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
"required": false
|
|
15
15
|
}
|
|
16
16
|
],
|
|
17
|
-
"template": "Analise a carga de trabalho da equipe no período: {{period|week}}.\n\n{{team_id|Para todos os times.}}\nFiltrar por team_id={{team_id}} se especificado.\n\nDados a coletar pra cada agente:\n1. Conversas atribuídas (open + pending)\n2. Conversas resolvidas no período\n3. Tempo médio de primeira resposta\n4. Tempo médio de resolução\n5. % de conversas com CSAT (se houver) — NÃO vem do relatório por agente; pegue via `lionchat_csat_list` filtrando por `user_ids` (id do agente) no período\n6. Status atual: online / offline / busy — NÃO vem do relatório por agente; pegue via `lionchat_agent_availability_list`\n\nApresentar:\n\n## Visão Geral\n- Total de conversas ativas\n- Agentes online vs offline\n- Conversas sem atribuição (backlog)\n\n## Distribuição por Agente (tabela)\n| Agente | Ativas | Resolvidas | T. Resposta | T. Resolução | Status |\n\n## Identificar:\n- **Sobrecarregados**: > 1.5x média de conversas ativas → risco de queda na qualidade\n- **Subutilizados**: < 0.5x média → podem absorver mais\n- **Agentes offline com conversas pendentes**: redistribuir urgente\n- **Conversas órfãs**: sem assignee há > 1h → atribuir agora\n\n## Recomendações de ação\n- Lista de conversas pra reatribuir (com de → para)\n- Sugestão de revisão de assignment policy se houver desbalanceamento crônico\n- Conversas que talvez devam ser fechadas (sem resposta do cliente há > 7 dias)\n\nFinalizar perguntando se o usuário quer aplicar as redistribuições sugeridas."
|
|
17
|
+
"template": "Analise a carga de trabalho da equipe no período: {{period|week}}.\n\n{{team_id|Para todos os times.}}\nFiltrar por team_id={{team_id}} se especificado.\n\nDados a coletar pra cada agente:\n1. Conversas atribuídas (open + pending)\n2. Conversas resolvidas no período\n3. Tempo médio de primeira resposta\n4. Tempo médio de resolução\n5. % de conversas com CSAT (se houver) — NÃO vem do relatório por agente; pegue via `lionchat_csat_list` filtrando por `user_ids` (id do agente) no período\n6. Status atual: online / offline / busy — NÃO vem do relatório por agente; pegue via `lionchat_agent_availability_list`\n\nIgnore agentes com `replacing: true` em `lionchat_agents_list` (estão saindo — uma substituição está transferindo a carteira deles). A lista já exclui o agente de suporte da plataforma: ele não conta como membro da equipe.\n\nApresentar:\n\n## Visão Geral\n- Total de conversas ativas\n- Agentes online vs offline\n- Conversas sem atribuição (backlog)\n\n## Distribuição por Agente (tabela)\n| Agente | Ativas | Resolvidas | T. Resposta | T. Resolução | Status |\n\n## Identificar:\n- **Sobrecarregados**: > 1.5x média de conversas ativas → risco de queda na qualidade\n- **Subutilizados**: < 0.5x média → podem absorver mais\n- **Agentes offline com conversas pendentes**: redistribuir urgente\n- **Conversas órfãs**: sem assignee há > 1h → atribuir agora\n\n## Recomendações de ação\n- Lista de conversas pra reatribuir (com de → para)\n- Sugestão de revisão de assignment policy se houver desbalanceamento crônico\n- Se a causa do desbalanceamento for \"fulano saiu da empresa\", ofereça `lionchat_agents_replace` (troca o agente por outro e leva a carteira inteira) em vez de excluir + criar\n- Conversas que talvez devam ser fechadas (sem resposta do cliente há > 7 dias)\n\nFinalizar perguntando se o usuário quer aplicar as redistribuições sugeridas."
|
|
18
18
|
}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
"title": "Resumo Semanal Executivo",
|
|
4
4
|
"description": "Resumo executivo de tudo que aconteceu na semana: atendimento, vendas (Kanban), IA, gargalos. Pensado pra quem precisa de visão rápida pra decidir.",
|
|
5
5
|
"arguments": [],
|
|
6
|
-
"template": "Gere um **Resumo Executivo da Semana** — visão rápida pra tomar decisões.\n\n## Passos\n\n1. **Calcule período:** since = 7 dias atrás, until = agora
|
|
6
|
+
"template": "Gere um **Resumo Executivo da Semana** — visão rápida pra tomar decisões.\n\n## Passos\n\n1. **Calcule período:** since = 7 dias atrás, until = agora. Leia `timezone` em `lionchat_account_show` e mande `timezone_offset` (em horas, derivado desse fuso) em toda chamada de relatório — não assuma -3.\n\n2. **Relatório personalizado salvo?** (use `lionchat_custom_dashboards_list`): se a conta tem um relatório montado, leia os blocos dele com `lionchat_custom_dashboards_widget_data` passando `time_range: last_7_days` (e o `timezone_offset` da conta) em vez de remontar os números a partir de dez ferramentas.\n\n3. **Atendimento** (use `lionchat_reports_summary`, business_hours=true):\n - Total de conversas, resolvidas, abertas, pendentes\n - Comparativo com semana anterior\n - Tempo médio de resposta e resolução\n\n4. **Pipeline Kanban** (use `lionchat_funnels_list` + `lionchat_kanban_items_counts` por funil):\n - Para cada funil: total de cards e valor total no funil — `kanban_items_counts` é a FOTO atual, não \"da semana\"\n - \"Cards entrados na semana\": `lionchat_custom_dashboards_preview_widget` com `widget_type: stage_entries` (conta card DISTINTO que ENTROU na etapa; `funnel_stages` subconta ~25%)\n - \"Movidos pra Fechado\" e faturamento: `preview_widget` com `widget_type: funnel_stages` + `status: won` + `date_basis: closed` (+ `measure: value` pra somar o valor)\n - Calcular taxa de conversão (fechados / total entrados)\n\n5. **IA** (use `lionchat_captain_assistants_list`):\n - Quantos assistentes ativos\n - Conversas atendidas pela IA (campo `active_conversations_count`)\n\n6. **CSAT** (use `lionchat_csat_metrics`):\n - Média da semana, comparativo com anterior\n\n7. **SLA** (use `lionchat_sla_metrics`):\n - Hits e breaches\n\n8. **Top 3 Inboxes** (use `lionchat_reports_list_2`):\n - Quais canais mais movimentaram\n\n## Apresentação\n\n```markdown\n# 📅 Resumo da Semana — DD/MM a DD/MM\n\n## 🎯 Destaque da Semana\n[Uma frase com o ponto mais importante: \"Crescemos 20% em conversas mas CSAT caiu 0.3⭐\" ou \"Funil Vendas com R$ 50K parados na etapa Proposta\"]\n\n## 📞 Atendimento\n- **N conversas** (vs N anterior, +/- X%)\n- **N resolvidas** (taxa: X%)\n- **Tempo médio 1ª resposta:** X min\n- **CSAT:** X⭐ (anterior: Y⭐)\n\n## 💰 Vendas (Pipeline)\n- **Funil [Nome]:** N cards (R$ XK total)\n - Entraram: N | Fechados: M | Conversão: Z%\n - Em risco (parados >7d): K cards\n\n## 🤖 IA\n- **N agentes ativos**\n- **N conversas atendidas** pela IA esta semana\n- Conversas resolvidas pela IA sem handoff: M (estimativa)\n\n## ⚠️ Pontos de Atenção\n- [3 alertas concretos, ex:]\n - SLA: X conversas estouraram\n - Funil Y com gargalo na etapa Z\n - Agente W com tempo médio 2x acima da equipe\n\n## 💡 Recomendações\n[2-3 ações concretas pra próxima semana]\n```\n\n## Importante\n\n- **Seja conciso.** Resumo executivo = 1 página, não 5. Cortar > inflar.\n- **Compare sempre com semana anterior** (campo `previous` dos endpoints).\n- **Destaque tendências, não números crus.** \"Crescemos 20%\" > \"De 100 pra 120\".\n- **3 atenções, 3 recomendações.** Se quiser mais, peça permissão.\n- Use emojis (📅 📞 💰 🤖 ⚠️ 💡) — 1 por seção pra escaneabilidade rápida.\n- Datas em PT-BR (DD/MM/YYYY).\n- Valores em R$ (formato brasileiro: R$ 1.234,56)."
|
|
7
7
|
}
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
"required": false
|
|
15
15
|
}
|
|
16
16
|
],
|
|
17
|
-
"template": "Analise o uso de templates WhatsApp Business nos últimos {{period_days|30}} dias.\n\nInbox: {{inbox_id|todas as inboxes WhatsApp Cloud}}\n\nDados a levantar:\n\n## 1. Inventário de Templates\n- Total de templates aprovados (status: APPROVED)\n- Pendentes de aprovação (PENDING)\n- Rejeitados (REJECTED) — listar motivos\n- Templates por categoria (UTILITY, MARKETING, AUTHENTICATION)\n- Templates por idioma\n\n## 2. Uso no Período\nPra cada template usado:\n- Nome do template\n- Quantas vezes foi enviado\n- Quantas conversas geraram resposta dentro de 24h\n- Taxa de resposta (% que responderam)\n- Taxa de conversão (se for marketing — virou venda/lead qualificado?)\n\n## 3. Templates Inativos\nListar templates aprovados HÁ MAIS DE 30 DIAS que NÃO foram usados no período.\n- Por quê? Esquecidos? Substituídos por novo?\n- Sugestão: arquivar / atualizar / promover uso\n\n## 4. Performance dos Top Templates\nTop 5 mais enviados — analisar:\n- Texto do template\n- Taxa de resposta\n- Tempo médio até resposta\n- Tem variáveis personalizadas? ({{nome}}, etc)\n- Categoria correta? (errar categoria = risco de banimento)\n\n## 5. Red Flags\n- Templates marketing sendo usados em janela 24h (deveriam ser utility)\n- Templates rejeitados não removidos\n- Templates aprovados há > 90 dias e nunca usados\n- Templates duplicados (mesma intenção, várias versões)\n\n## Recomendações\n- Templates a criar (gap identificado)\n- Templates a remover (desuso ou redundância)\n- Templates a otimizar (baixa conversão)\n- Sugestão de A/B test entre 2 versões de um mesmo template\n\nFinalizar com sugestão de criar nova campanha usando o template com melhor performance."
|
|
17
|
+
"template": "Analise o uso de templates WhatsApp Business nos últimos {{period_days|30}} dias.\n\nInbox: {{inbox_id|todas as inboxes WhatsApp Cloud}}\n\nDados a levantar:\n\n## 1. Inventário de Templates\n- Total de templates aprovados (status: APPROVED)\n- Pendentes de aprovação (PENDING)\n- Rejeitados (REJECTED) — listar motivos\n- Templates por categoria (UTILITY, MARKETING, AUTHENTICATION)\n- Templates por idioma\n\n## 2. Uso no Período\nPra cada template usado:\n- Nome do template\n- Quantas vezes foi enviado\n- Quantas conversas geraram resposta dentro de 24h\n- Taxa de resposta (% que responderam)\n- Taxa de conversão (se for marketing — virou venda/lead qualificado?)\n\n## 3. Templates Inativos\nListar templates aprovados HÁ MAIS DE 30 DIAS que NÃO foram usados no período.\n- Por quê? Esquecidos? Substituídos por novo?\n- Sugestão: arquivar / atualizar / promover uso\n\n## 4. Performance dos Top Templates\nTop 5 mais enviados — analisar:\n- Texto do template\n- Taxa de resposta\n- Tempo médio até resposta\n- Tem variáveis personalizadas? ({{nome}}, etc)\n- Categoria correta? (errar categoria = risco de banimento)\n\n## 5. Red Flags\n- Templates marketing sendo usados em janela 24h (deveriam ser utility)\n- Templates rejeitados não removidos\n- Templates aprovados há > 90 dias e nunca usados\n- Templates duplicados (mesma intenção, várias versões)\n- Mensagens com `additional_attributes.template_param_fallback` preenchido = clientes que receberam \".\" no lugar da variável (posição vazia não falha mais — sai como ponto)\n- Falhas classificadas como `account_locked` (erro 131031) NÃO são do template — é a conta comercial trancada na Meta\n\n## Recomendações\n- Templates a criar (gap identificado)\n- Templates a remover (desuso ou redundância)\n- Templates a otimizar (baixa conversão)\n- Sugestão de A/B test entre 2 versões de um mesmo template\n\nFinalizar com sugestão de criar nova campanha usando o template com melhor performance."
|
|
18
18
|
}
|
|
@@ -101,7 +101,7 @@ Aceita: letras, números, underscore, hífen e ponto. Sem espaço. Convenção:
|
|
|
101
101
|
|
|
102
102
|
`+<código país><DDD><número>`. Brasil: `+5511999999999` (13 dígitos com 9). Sem espaços, sem parênteses, sem hífen.
|
|
103
103
|
|
|
104
|
-
WAHA tem endpoint `/integrations/waha/check_phone?phone=+55...` que retorna o número CORRIGIDO (especialmente útil pra fixar o 9º dígito BR).
|
|
104
|
+
WAHA tem endpoint `/integrations/waha/check_phone?phone=+55...` que retorna o número CORRIGIDO (especialmente útil pra fixar o 9º dígito BR). O valor de `phone` é sempre E.164 (`+55...`) — nunca um id interno `@lid` (o servidor WAHA 2026.8+ responde com `@lid`, e o sistema traduz pelo campo `pn`).
|
|
105
105
|
|
|
106
106
|
### `funnel.stages` — keys snake_case
|
|
107
107
|
|
|
@@ -462,6 +462,25 @@ O `field_mapping` do webhook personalizado aceita caminhos com índice de array:
|
|
|
462
462
|
mesmo caminho captura valores diferentes. Campo `flow_id` na criação liga o webhook a um flow
|
|
463
463
|
(webhook embutido — ver resource de fluxos).
|
|
464
464
|
|
|
465
|
+
**Destino "atributo da CONVERSA" no `field_mapping` (2026-08-21 — entra com o próximo deploy do
|
|
466
|
+
app depois de 21/08/2026):** além de `contact_attr_<chave>`, o valor de um campo pode ser
|
|
467
|
+
`conversation_attr_<chave>` — vale no Webhook Universal, no webhook embutido de flow E no formulário
|
|
468
|
+
do Meta Lead Ads (mesmo mapeador). O atributo é gravado na conversa que a automação/fluxo mapeado
|
|
469
|
+
ABRIR para aquele lead (sem automação/fluxo não nasce conversa e o valor é descartado). Serve pro
|
|
470
|
+
que muda a cada atendimento (produto comprado agora, valor, formulário de hoje); no contato a 2ª
|
|
471
|
+
compra apaga a 1ª.
|
|
472
|
+
|
|
473
|
+
Regras do gravador (valem pra Webhook Universal, Meta Lead e os 9 gateways de pagamento):
|
|
474
|
+
- **Chave reservada é recusada**: as `captain_*` (caderno da IA) e as de sistema `imported_from`,
|
|
475
|
+
`import_digits`, `mail_subject`, `type`, `in_reply_to`, `initiated_by`, `auto_reply`,
|
|
476
|
+
`original_channel_type`, `conversation_language`, `agent_reply_time_window`, `conference_sid`,
|
|
477
|
+
`call_status`, `tiktok_capabilities`, `captain_media_asset_id`. Nunca mapeie pra elas —
|
|
478
|
+
`imported_from` sobrescrita fazia a conversa SUMIR das telas.
|
|
479
|
+
- **Converte pelo TIPO do atributo** (data em formato brasileiro, decimal com vírgula ou ponto,
|
|
480
|
+
sim/não) e **descarta** o que não entende — texto num atributo de Número não é gravado (e não dá
|
|
481
|
+
erro: aparece só no log do servidor). Confira o tipo em `custom_attributes_list` antes de mapear.
|
|
482
|
+
- **Silencioso**: atributo gravado por integração NÃO dispara automação, flow nem webhook de saída.
|
|
483
|
+
|
|
465
484
|
### Import de histórico do WhatsApp Cloud (2026-06)
|
|
466
485
|
|
|
467
486
|
Caixas WhatsApp Cloud API podem importar o histórico de conversas via QR Code. Tools sob
|
|
@@ -559,12 +559,18 @@ opcional `variable_mapping` junto.
|
|
|
559
559
|
|
|
560
560
|
1. **Tira o modelo do alcance do AI Agente.** Basta UMA variável sem mapping para o modelo inteiro
|
|
561
561
|
deixar de ser oferecido no follow-up automático fora da janela de 24h.
|
|
562
|
-
2. **Faz
|
|
562
|
+
2. **Faz a mensagem sair com um PONTO no lugar da variável.** Desde 04/08/2026 posição sem valor
|
|
563
|
+
não derruba mais o envio (antes era `#132000`): o sistema preenche `.` e entrega — "Olá ., sua
|
|
564
|
+
consulta é dia ." chega assim pro cliente, marcado como sucesso. Rastro:
|
|
565
|
+
`additional_attributes.template_param_fallback` na mensagem (lista das posições preenchidas com
|
|
566
|
+
o piso). Numa campanha isso vira dezenas de clientes recebendo ponto (caso real 21/08: 65
|
|
567
|
+
pessoas).
|
|
563
568
|
|
|
564
569
|
Vale para os dois formatos de marcador: posicional (`{{1}}`) e nomeado (`{{nome_cliente}}`).
|
|
565
570
|
|
|
566
|
-
> Ao registrar modelo por API, **mapeie todas as variáveis do corpo** — ou preencha
|
|
567
|
-
>
|
|
571
|
+
> Ao registrar modelo por API, **mapeie todas as variáveis do corpo** — ou preencha TODAS as
|
|
572
|
+
> posições em `processed_params` na hora do envio/campanha, e confira antes de criar a campanha que
|
|
573
|
+
> nenhuma está vazia. Modelo com variável órfã é modelo que a IA não usa e que entrega ponto.
|
|
568
574
|
|
|
569
575
|
Confira o que ficou de fora lendo o modelo com `lionchat_inboxes_whatsapp_templates_list` e
|
|
570
576
|
comparando os `{{...}}` do texto do BODY com as chaves do `variable_mapping`.
|
|
@@ -282,6 +282,18 @@ valor**. A conversa mantém a origem com que nasceu e só ganha o que ainda não
|
|
|
282
282
|
notificação e a Agenda não rodam. Se o seu fluxo depende de um desses, ele não vai acontecer
|
|
283
283
|
quando houver reuso.
|
|
284
284
|
|
|
285
|
+
**Caixa de rede social só é "contactável" se a pessoa já falou por ela (desde 19/08/2026).**
|
|
286
|
+
`lionchat_contacts_list_3` (`/contacts/{id}/contactable_inboxes`) lista Facebook, Instagram,
|
|
287
|
+
Telegram, Line, TikTok e X **apenas quando o contato já tem crachá naquela caixa** — nesses canais
|
|
288
|
+
não existe "começar conversa pelo telefone" (a Meta recusa). Se a caixa social não aparece na lista,
|
|
289
|
+
não tente `conversations_create` nela: a conversa nasceria e nunca entregaria. WhatsApp (oficial e
|
|
290
|
+
QR Code), SMS e e-mail continuam contactáveis pelo telefone/e-mail da ficha.
|
|
291
|
+
|
|
292
|
+
**Telefone com ou sem o 9º dígito na caixa OFICIAL (desde 19/08/2026):** criar conversa pra um
|
|
293
|
+
contato cuja ficha está sem o 9 (ou com) REUSA o endereço que a caixa já tem pra essa pessoa, em vez
|
|
294
|
+
de abrir um segundo — era isso que partia a conversa em duas (lembrete numa, resposta do paciente
|
|
295
|
+
em outra). O `source_id` devolvido pode vir no outro formato do que você mandou; é o mesmo cliente.
|
|
296
|
+
|
|
285
297
|
## Estado relacional
|
|
286
298
|
|
|
287
299
|
```
|
|
@@ -364,24 +364,48 @@ AccountTask (agenda interna)
|
|
|
364
364
|
├── conversation_id / contact_id / linked_kanban_item_id (FK opcionais)
|
|
365
365
|
└── assignees (has_many → User, via account_task_assignments)
|
|
366
366
|
|
|
367
|
-
BookingEventType (template de agendamento
|
|
367
|
+
BookingEventType (template de agendamento — tools `booking_event_types_*`; colunas de
|
|
368
|
+
db/schema.rb, tabela booking_event_types)
|
|
369
|
+
├── id (PK) / account_id (FK) / user_id (FK → agente padrão)
|
|
370
|
+
├── title (ex: "Demo 30min") / description / slug (endereço público próprio)
|
|
371
|
+
├── duration_minutes / slot_granularity_minutes / buffer_minutes
|
|
372
|
+
├── min_notice_hours / max_advance_days / max_per_day / available_from / available_until
|
|
373
|
+
├── task_type (meeting/video_call — `video_call` gera Meet)
|
|
374
|
+
├── timezone (IANA — o fuso dos horários é SEMPRE o do tipo, nunca o do navegador)
|
|
375
|
+
├── color (hex `#RRGGBB`, opcional — cor dos compromissos desse tipo no calendário; vazio = cor do
|
|
376
|
+
│ agente; 2026-08-19)
|
|
377
|
+
├── active / ask_email / ask_description
|
|
378
|
+
├── confirmation_* (mensagem de confirmação própria: enabled, inbox_id, channel_type,
|
|
379
|
+
│ template_name, blocks). Variáveis nos textos de confirmação E de lembrete (interpolador único):
|
|
380
|
+
│ {{nome}} {{email}} {{telefone}} {{data}} {{horario}} {{dia_semana}} (NOVO 24/08 — dia por
|
|
381
|
+
│ extenso em pt: "terça-feira"; irmã do {{booking.weekday}} do FlowBuilder, mesma grafia)
|
|
382
|
+
│ {{tipo_evento}} {{titulo}} {{duracao}} {{agente}} {{descricao}} {{meet_link}}
|
|
383
|
+
│ {{link_cancelar}} {{link_remarcar}} {{horas_ate_evento}} {{horas_desde_evento}}
|
|
384
|
+
└── booking_availabilities (has_many — dias/horários; `booking_availabilities_attributes` no create)
|
|
385
|
+
|
|
386
|
+
Booking (agendamento confirmado — tabela bookings)
|
|
368
387
|
├── id (PK)
|
|
369
|
-
├── account_id (FK)
|
|
370
|
-
├──
|
|
371
|
-
├── duration_minutes
|
|
372
|
-
├──
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
├──
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
388
|
+
├── account_id (FK) / booking_event_type_id (FK) / account_task_id (FK 1:1 → AccountTask)
|
|
389
|
+
├── contact_id (FK) / guest_name / guest_email / guest_phone / guest_description
|
|
390
|
+
├── scheduled_at / duration_minutes
|
|
391
|
+
├── status (confirmed/cancelled/completed) — **NÃO acompanha a Agenda**: concluir ou cancelar pela
|
|
392
|
+
│ tela da Agenda (o caminho normal da equipe) deixa o booking em `confirmed`. A situação real é
|
|
393
|
+
│ `account_tasks.status` (pending/completed/cancelled/snoozed) da tarefa vinculada — é ela que o
|
|
394
|
+
│ relatório de Agendamentos e os gatilhos `booking_*` do FlowBuilder leem
|
|
395
|
+
├── cancelled_at / cancellation_reason / confirmation_sent_at / utm_params
|
|
396
|
+
└── (o agente responsável e o `meeting_url` moram na TAREFA: `account_tasks.user_id` e
|
|
397
|
+
`account_tasks.meeting_url`)
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Duração sob medida (2026-08-19):** ao marcar pelo painel/API (`lionchat_tasks_create` com
|
|
401
|
+
`booking_event_type_id`) pode-se mandar `duration_minutes` diferente do tipo (5 a 1440; fora da
|
|
402
|
+
faixa o sistema usa a do tipo). A lista de horários livres aceita o mesmo parâmetro
|
|
403
|
+
(`lionchat_booking_event_types_slots?date=AAAA-MM-DD&duration_minutes=60`) e **os horários mudam**
|
|
404
|
+
— 60 min num tipo de 30 some com os encaixes que não cabem. Sempre peça os slots com a MESMA duração
|
|
405
|
+
que vai gravar. A página pública e a IA não têm essa opção (duração do tipo, sempre).
|
|
406
|
+
|
|
407
|
+
**Cor por tipo (2026-08-19):** `booking_event_types.color` (hex `#RRGGBB`) pinta os compromissos
|
|
408
|
+
daquele tipo no calendário; vazio = cor do agente. A tarefa devolve `booking_color` já resolvido.
|
|
385
409
|
|
|
386
410
|
**Atributos de sistema do Booking no CONTATO (novo 2026-07-06):** ao confirmar um agendamento,
|
|
387
411
|
8 custom attributes protegidos são gravados no contato — usáveis como variável
|
|
@@ -423,7 +447,7 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
|
|
|
423
447
|
| `eclinica_data_consulta` | date | Data da consulta, ISO |
|
|
424
448
|
| `eclinica_hora_consulta` | **time** | Hora da consulta 24h `"HH:MM"` (novo 2026-07-06) |
|
|
425
449
|
| `eclinica_hora_final` | **time** | Hora final da consulta (novo 2026-07-27) |
|
|
426
|
-
| `eclinica_status_agendamento` | text | agendado / aguardando (paciente chegou) / no_show / atendido / desmarcado.
|
|
450
|
+
| `eclinica_status_agendamento` | text | `agendado` / `aguardando` (paciente chegou) / `no_show` / `atendido` / `desmarcado`. Vem do TIPO do evento, nunca da letra da situação. **Estado terminal do MESMO agendamento não volta pra `agendado`** (2026-08-20): a e-Clínica manda `agendamento_alterado` a cada edição da consulta, inclusive depois da chegada/atendimento, e isso NÃO reabre o status. Consulta com `eclinica_idagenda` DIFERENTE nasce `agendado` |
|
|
427
451
|
| `eclinica_situacao` | text | Situação do agendamento no painel, **POR EXTENSO** (2026-08-21, legenda oficial da e-Clínica): AGUARDANDO, NA CADEIRA, PASSAR FINANCEIRO, AGENDAR RETORNO, ATENDIDO, CONFIRMADO, CONFIRMADO PELO LINK, CONFIRMADO PELA API, FALTA, DESMARCADO, CANCELADO PELO LINK, CANCELADO PELA API. Antes guardava a letra crua (`A`, `C`…). Código nunca visto aparece como veio |
|
|
428
452
|
| `eclinica_compromisso` | text | Tipo da consulta — TEXTO LIVRE da recepção (ex: Consulta, Retorno) |
|
|
429
453
|
| `eclinica_agendatipo` | text | Tipo de Agendamento — NOME da lista fixa do painel, resolvido por unidade (novo 2026-07-28). **Filtrar sempre pelo NOME, nunca pelo número: os números colidem entre filiais** |
|
|
@@ -458,6 +482,23 @@ Atributos de sistema no CONTATO (prefixo `eclinica_`, protegidos, usáveis como
|
|
|
458
482
|
| `eclinica_ultima_cobranca_vencimento` | date | Vencimento da última cobrança |
|
|
459
483
|
| `eclinica_ultima_cobranca_descricao` | text | Descrição da última cobrança |
|
|
460
484
|
|
|
485
|
+
**Regras de atualização que enganam na leitura (2026-08-20/21):**
|
|
486
|
+
|
|
487
|
+
- `eclinica_situacao` e `eclinica_cor` são **esparsas**: evento de agenda que vem SEM o campo
|
|
488
|
+
**apaga a chave** (vazio = "a recepção ainda não marcou", não "sem dado"). `agendamento_novo`
|
|
489
|
+
nunca traz situação — logo depois de marcar, a situação fica vazia de propósito.
|
|
490
|
+
`agendamento_atendido` e `agendamento_desmarcado` **atualizam** a situação (ATENDIDO, DESMARCADO);
|
|
491
|
+
antes de 21/08 a ficha ficava "NA CADEIRA" depois do atendimento (conserto de 21/08/2026 — entra
|
|
492
|
+
com o próximo deploy do app depois de 21/08/2026).
|
|
493
|
+
- Códigos com mais de uma letra pro mesmo estado: `O`/`OK` = CONFIRMADO, `D`/`W` = DESMARCADO.
|
|
494
|
+
Código fora da legenda fica gravado como veio (nunca vazio, nunca palpite).
|
|
495
|
+
- `agendamento_aguardando` (paciente chegou) grava a chegada por cima do agendamento, mas **não
|
|
496
|
+
agenda nem cancela lembrete** (chegada não é consulta nova) e **não apaga** cor/situação quando
|
|
497
|
+
vem sem elas.
|
|
498
|
+
- `eclinica_ultima_chegada_*`, `eclinica_ultimo_pagamento*` e `eclinica_odontograma_*` guardam o
|
|
499
|
+
ÚLTIMO evento; paciente com 3 consultas tem sempre a última na ficha (não há histórico no contato —
|
|
500
|
+
use `lionchat_eclinica_reminder_history_list` e o log de eventos da tela).
|
|
501
|
+
|
|
461
502
|
**Lembretes automáticos (Integrações > e-Clínica > Lembretes).** Cada linha tem um **tipo de
|
|
462
503
|
evento** que decide de qual data a contagem parte: `agendamento` (data da consulta, padrão),
|
|
463
504
|
`controle_laboratorio_novo` (previsão de entrega da medicação) e `cliente_inclusao_pagamento`
|
|
@@ -524,7 +565,8 @@ LeadForm (Formulário público de captação — feature flag lead_forms, por co
|
|
|
524
565
|
├── account_id (FK)
|
|
525
566
|
├── name / slug (8 chars, gerado na criação e imutável) / display_mode (cards|chat) / active
|
|
526
567
|
├── form_data (jsonb: o desenho do construtor) — published_data (a FOTO publicada, que a página usa)
|
|
527
|
-
├── settings (jsonb: primary_color, theme, abandon_minutes, button_label
|
|
568
|
+
├── settings (jsonb: primary_color, theme, abandon_minutes, button_label, resume, chat_avatar,
|
|
569
|
+
│ public_title — título que o LEAD vê, 2026-08-21) / published_at
|
|
528
570
|
└── counts: views / responses / completed (contadores) + lead_form_responses (has_many)
|
|
529
571
|
|
|
530
572
|
LeadFormResponse (um preenchimento do formulário)
|
|
@@ -537,10 +579,24 @@ LeadFormResponse (um preenchimento do formulário)
|
|
|
537
579
|
CustomWebhookIntegration (Webhook Universal — entrada)
|
|
538
580
|
├── account_id (FK)
|
|
539
581
|
├── name / token (URL única) / active
|
|
540
|
-
├── field_mapping (jsonb —
|
|
582
|
+
├── field_mapping (jsonb — caminho do payload → destino: campo nativo, `contact_attr_<k>`,
|
|
583
|
+
│ `conversation_attr_<k>` (2026-08-21 — entra com o próximo deploy do app depois de 21/08/2026),
|
|
584
|
+
│ `cadastral_<k>`, `social_<k>`; aceita índice de array: messages.0.content)
|
|
541
585
|
├── event_automation_mapping (jsonb)
|
|
542
586
|
└── flow_id (FK opcional → Flow; presente = webhook EMBUTIDO de flow, oculto da listagem standalone)
|
|
543
587
|
|
|
588
|
+
Gateways de pagamento (GuruWebhook, HotmartWebhook, KiwifyWebhook, EduzzWebhook, TictoWebhook,
|
|
589
|
+
MonetizzeWebhook, GreennWebhook, ContaAzulIntegration, OmieIntegration — tools
|
|
590
|
+
`lionchat_ecommerce_webhooks_*`, `conta_azul_integrations_*`, `omie_integrations_*`)
|
|
591
|
+
├── event_automation_mapping (jsonb) — uma entrada por evento do gateway:
|
|
592
|
+
│ { "<evento>": { automation_id, flow_id, first_purchase_only } }
|
|
593
|
+
│ (Conta Azul/Omie usam `event_mapping`, por categoria).
|
|
594
|
+
│ ATENÇÃO (26/08/2026): `conversation_attribute_keys` foi REMOVIDA dos gateways de pagamento
|
|
595
|
+
│ (existiu de 21 a 26/08) — o backend IGNORA a chave se gravada. Atributo de conversa mapeado
|
|
596
|
+
│ continua existindo SÓ no Meta Lead e no Webhook Universal.
|
|
597
|
+
└── Leia o mapeamento atual antes de gravar: o `update` SUBSTITUI o jsonb INTEIRO (não mescla) —
|
|
598
|
+
mande todos os eventos de volta, senão os outros somem.
|
|
599
|
+
|
|
544
600
|
LiontrackJourneyStage (regras de fase da Jornada do Lead — feature flag liontrack)
|
|
545
601
|
├── account_id (FK)
|
|
546
602
|
├── stage (nome da fase, ex: Topo/Meio/Fundo/Compra)
|
|
@@ -565,6 +621,17 @@ ContactDocument (aba Documentos do contato, 2026-06-11)
|
|
|
565
621
|
└── ações: preview, download, renomear, favoritar, excluir (conversas são só-leitura)
|
|
566
622
|
```
|
|
567
623
|
|
|
624
|
+
**Histórico de preenchimentos por CONTATO (2026-08-21 — entra com o próximo deploy do app depois
|
|
625
|
+
de 21/08/2026):** `GET /contacts/{id}/form_entries` (aba "Preenchimentos" da ficha; tools
|
|
626
|
+
`lionchat_contacts_form_entries_list` / `_show`) junta, em ordem de data, o que a pessoa preencheu
|
|
627
|
+
em nosso formulário, no formulário nativo do Meta, no Webhook Universal e no webhook de flow (origem
|
|
628
|
+
`flow`, com o nome do fluxo) — cada item `{source, id, title, status, at, count, conversation}` e
|
|
629
|
+
`/form_entries/{source}/{id}` abre o detalhe. Como cada preenchimento SOBRESCREVE os atributos do
|
|
630
|
+
contato, a ficha só mostra o último — esta lista guarda todos. Origens de fora exibem SÓ os campos
|
|
631
|
+
vinculados a atributos daqui e realmente gravados (nada do payload cru). Ao mesclar contatos, as
|
|
632
|
+
origens vão pro contato vencedor. Os eventos do Meta Lead **não são mais expurgados após 90 dias**
|
|
633
|
+
(decisão do dono, 21/08).
|
|
634
|
+
|
|
568
635
|
### Google Contatos (integração nativa)
|
|
569
636
|
|
|
570
637
|
Salva contatos do LionChat no **Google Contatos** da conta Google conectada pelo admin (etiqueta "LionChat"), fazendo o celular/WhatsApp exibirem o nome do cliente. Conexão é **uma por conta**, feita **somente pela interface** (Configurações → Integrações → Google Contatos → "Conectar conta Google" — é OAuth no navegador, **não há tool MCP** para conectar). Comportamento: contato novo com telefone sobe automático (~1 min); botão "Enviar contatos existentes" manda a base antiga (vira "Ressincronizar contatos" depois — idempotente, nunca duplica); rename aqui propaga pro Google só em contatos criados pelo sistema; nunca apaga nem altera a agenda pessoal do cliente. Quando o usuário perguntar "dá pra salvar os contatos no celular/Google?", oriente esse caminho de tela.
|
|
@@ -36,6 +36,10 @@ E/OU é encadeado condição a condição (sem parênteses).
|
|
|
36
36
|
Atributo personalizado: informe `custom_attribute_type` na condição — `'conversation_attribute'`
|
|
37
37
|
(atributo da conversa) ou `'contact_attribute'`. Sem ele o escopo pode sair errado.
|
|
38
38
|
|
|
39
|
+
- `chat_type` em `conversations_filter` funciona desde 19/08/2026 (antes respondia 500). `group` =
|
|
40
|
+
conversa de grupo de WhatsApp; `individual` cobre também canal, transmissão e status. Com
|
|
41
|
+
`not_equal_to`, conversa sem contato vinculado NÃO some do resultado.
|
|
42
|
+
|
|
39
43
|
### Data relativa — "Hoje", "Ontem", "últimos X dias" (novo 2026-08-01)
|
|
40
44
|
|
|
41
45
|
Não calcule data no seu lado pra perguntar "quantas conversas entraram hoje". Existem operadores
|
|
@@ -273,8 +277,9 @@ custom_dashboards_preview_widget
|
|
|
273
277
|
```
|
|
274
278
|
> ⚠️ `numerator` é **lista de IDs de etiqueta** (`[5]`), nunca nome de métrica. Mandar
|
|
275
279
|
> `["label_count"]` faz a coluna de conversão **sumir em silêncio**.
|
|
276
|
-
> ⚠️ `time_range=custom` aceita no máximo **92 dias
|
|
277
|
-
>
|
|
280
|
+
> ⚠️ `time_range=custom` aceita no máximo **92 dias** e vale em qualquer tipo de bloco (desde
|
|
281
|
+
> 19/08/2026). Pedir "esse ano" volta 422 com a explicação. Para relatório diário use
|
|
282
|
+
> `today`/`yesterday` em vez de datas fixas, que envelhecem.
|
|
278
283
|
> ⚠️ O `total` da tabela **não é a soma das linhas** — cada métrica tem contagem própria.
|
|
279
284
|
|
|
280
285
|
**R9 — Salvar isso como relatório na tela do cliente:** teste com o R8, mostre o número, confirme
|