@lionchat/mcp-server 1.32.0 → 1.34.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/client.d.ts +1 -0
- package/dist/client.js +24 -0
- package/dist/client.js.map +1 -1
- package/dist/docs/instructions.md +25 -4
- package/dist/docs/resources/agenda-multiplas-unidades.md +39 -1
- package/dist/docs/resources/api-conventions.md +27 -0
- package/dist/docs/resources/assinatura-eletronica.md +135 -10
- package/dist/docs/resources/best-practices.md +32 -10
- package/dist/docs/resources/data-model.md +1 -1
- package/dist/docs/resources/filtros-e-relatorios.md +25 -7
- package/dist/docs/resources/flowbuilder-design-guide.md +63 -15
- package/dist/docs/resources/formularios-publicos.md +3 -2
- package/dist/docs/resources/glossary.md +9 -0
- package/dist/docs/resources/kanban-deep-dive.md +129 -15
- package/dist/docs/resources/reports-guide.md +37 -7
- package/dist/docs/resources/troubleshooting.md +2 -2
- package/dist/tools.js +68 -22
- package/dist/tools.js.map +1 -1
- package/endpoints.json +889 -111
- package/package.json +1 -1
|
@@ -752,7 +752,7 @@ Pra auditar o que foi/será disparado, use `lionchat_eclinica_reminder_history_l
|
|
|
752
752
|
**Um aviso por CONSULTA (desde 2026-09-17).** A regra antiga "um lembrete por dia" saiu: paciente com duas
|
|
753
753
|
consultas no mesmo dia — ou duas pessoas no mesmo celular (mãe e filho) — recebe um lembrete para CADA
|
|
754
754
|
consulta, cada um com o seu nome, horário, profissional e link. Eles não saem juntos: sai o da consulta
|
|
755
|
-
mais cedo e, ~
|
|
755
|
+
mais cedo e, ~2 minutos depois (desde 26/10/2026 a rotina roda de minuto em minuto; o irmão espera a janela de 120 s), o da próxima. No histórico
|
|
756
756
|
(`lionchat_eclinica_reminder_history_list`) isso aparece assim: o que espera a vez fica `pending` com
|
|
757
757
|
`fire_at` no passado por alguns minutos (normal); `skip_reason = outra_consulta_no_mesmo_dia` só existe em
|
|
758
758
|
linhas ANTIGAS (até 17/09); e `fail_reason = fluxo_ainda_em_andamento_com_este_contato` significa que o
|
|
@@ -197,16 +197,29 @@ SEM mudar nenhum número antigo (Ganhos e Receita continuam do vendedor):
|
|
|
197
197
|
|---|---|---|
|
|
198
198
|
| `any` (PADRÃO) | criado no período **OU** fechado no período | É a régua histórica e a mais larga. **Omitir mantém exatamente os números de sempre.** É a certa pra RECEITA: com qualquer outra, venda fechada no período de um lead antigo some (medido 07/08: 17% dos ganhos da frota) |
|
|
199
199
|
| `created` | só quando o card nasceu | "quantos leads entraram" |
|
|
200
|
-
| `moved` |
|
|
200
|
+
| `moved` | quando entrou numa etapa (período até hoje: a etapa atual, mesma expressão do `stage_date_*` da seção 3; período que já terminou: qualquer entrada registrada no período, mesmo que o card tenha andado de novo depois) | "o que se mexeu no período" |
|
|
201
201
|
| `closed` | só ganhos/perdidos no período | **a pergunta de receita** — é a régua certa pra "quanto vendemos em julho" |
|
|
202
202
|
|
|
203
203
|
**Ganho/perda pela DATA DO FECHAMENTO (23/09/2026).** Com a régua `any` o relatório traz também cards que
|
|
204
204
|
nasceram no período mas fecharam DEPOIS dele. Por isso, para "quanto ganhamos/perdemos em julho", leia
|
|
205
|
-
`wonInPeriod`/`wonValueInPeriod` e `lostInPeriod`/`lostValueInPeriod` (este último é campo NOVO)
|
|
206
|
-
`statusDistribution`, que é a foto do status de HOJE (serve só para "negócios abertos agora"). Desde 23/09 os
|
|
205
|
+
`wonInPeriod`/`wonValueInPeriod` e `lostInPeriod`/`lostValueInPeriod` (este último é campo NOVO). Desde 23/09 os
|
|
207
206
|
motivos de ganho/perda, os perdidos recentes, a receita por semana e o ranking de vendedores também contam só
|
|
208
207
|
o que FECHOU no período — antes somavam por status de hoje e divergiam do quadro de Ganhos na mesma tela.
|
|
209
208
|
|
|
209
|
+
**Situação no FIM do período (19/10/2026).** Num período que JÁ TERMINOU (pelo dia da conta), tudo que é
|
|
210
|
+
SITUAÇÃO sai como o card estava no último instante do período: `statusDistribution` (aberto/ganho/perdido/adiado),
|
|
211
|
+
`itemsByStage`/`itemsByStageSlug` (o "Funil — ocupação por etapa"), `stageMetrics.valueByStage`, `forecast`,
|
|
212
|
+
`topDeals`, `staleCards`, `agingAnalysis` e `stageVelocityData` (só abertos) e os "parados" por etapa. Período que
|
|
213
|
+
vai até HOJE = o estado de agora (números de sempre). Por isso `statusDistribution.won` passa a bater com
|
|
214
|
+
`wonInPeriod`. Campo NOVO `periodEndState` `{past, unknownStageCount, removedStageCount}`: se `unknownStageCount > 0`,
|
|
215
|
+
avise que esses cards aparecem como "Etapa desconhecida" (sem histórico daquela época — o histórico de etapas
|
|
216
|
+
começou em julho de 2026); as chaves cruas `:etapa_desconhecida`/`:etapa_removida` NUNCA devem ser mostradas ao
|
|
217
|
+
cliente — traduza para "Etapa desconhecida"/"Etapa removida". Card ganho/perdido conta no funil onde a venda
|
|
218
|
+
aconteceu (também quando foi transferido depois). `taskMetrics.overdue`/`upcoming7days` vêm `null` num período
|
|
219
|
+
passado — NÃO diga "nenhuma atrasada", diga que esse número só existe para períodos que vão até hoje. Ciclo de vendas
|
|
220
|
+
e "Tempo médio" só com ganhos do período; checklist e follow-up só com o que fechou no período (follow-up = ações
|
|
221
|
+
feitas por pessoa até ganhar/perder, não dias).
|
|
222
|
+
|
|
210
223
|
O relatório de UMA etapa — tool `lionchat_funnels_stage_report` (`GET /funnels/:id/stage_report`, o
|
|
211
224
|
painel que abre dentro do quadro) — tem as MESMAS 4 opções de régua, mesmo parâmetro `date_basis` e as
|
|
212
225
|
MESMAS expressões da seção 3, mas o **padrão dele é `moved`**, não `any`. Não é inconsistência: ele
|
|
@@ -216,7 +229,9 @@ que as duas telas não batem, a resposta é: escolha a MESMA régua nas duas.
|
|
|
216
229
|
|
|
217
230
|
Ela devolve números calculados no SERVIDOR (total de cards da etapa, faixa de valores, ganhos/perdidos,
|
|
218
231
|
distribuição por prioridade, ranking de vendedores da etapa) — antes a tela só somava os cards já
|
|
219
|
-
carregados na coluna.
|
|
232
|
+
carregados na coluna. Num período que JÁ TERMINOU (19/10/2026) ela responde quantos cards ESTAVAM na etapa no fim do
|
|
233
|
+
período, e os botões `show_*`/`statuses`/`stages` valem pela situação naquele dia (um card aberto no fim do período e
|
|
234
|
+
ganho depois aparece com o padrão "só abertos").
|
|
220
235
|
|
|
221
236
|
**Parâmetros de `lionchat_funnels_stage_report`:**
|
|
222
237
|
|
|
@@ -250,9 +265,12 @@ categoria: 15/página (kanban: primeiros 15, sem paginação).
|
|
|
250
265
|
lista/show pesadas). Anexos de mensagem (data_url/download_url) NUNCA são podados.
|
|
251
266
|
- **Segredos:** chaves de credencial (api_key, tokens, senhas) saem SEMPRE como `[REDACTED]` —
|
|
252
267
|
sem exceção, nem com full_response. Precisa de um token? Painel, não robô.
|
|
253
|
-
- **Paginação:** os DOIS conectores
|
|
254
|
-
total_count,has_more}` — pagine até `has_more=false`. (No
|
|
255
|
-
do shape original.)
|
|
268
|
+
- **Paginação:** nas listas que paginam por página, os DOIS conectores informam
|
|
269
|
+
`pagination.{current_page,total_pages,total_count,has_more}` — pagine até `has_more=false`. (No
|
|
270
|
+
remoto o bloco é ADICIONADO ao lado do shape original.) Lista que NÃO pagina por página vem SEM
|
|
271
|
+
`pagination` e com o `meta` do servidor intacto: mensagens de uma conversa (volte com `before_id` =
|
|
272
|
+
id da mais antiga recebida) e agentes de ligação (lista inteira; `meta.dial_inboxes` = caixas que
|
|
273
|
+
ligam). Ausência do bloco NÃO quer dizer "acabou" nas mensagens.
|
|
256
274
|
- **Corte:** resposta acima do teto é enxugada por ITENS INTEIROS (aviso `[LISTA ENXUGADA...]`
|
|
257
275
|
com contagem exibida/total) — o JSON nunca vem quebrado no meio.
|
|
258
276
|
|
|
@@ -62,7 +62,7 @@ Todo node tem essa estrutura base:
|
|
|
62
62
|
|
|
63
63
|
**ATENÇÃO — chave `items`, não `triggers` (corrigido 19/08/2026).** Os gatilhos vão em **`data.items`**, cada item no formato **`{ "key": "...", "config": { ...filtros... } }`**. O formato antigo (`data.triggers` + `type` + filtros soltos no topo) ainda é aceito pelo motor por compatibilidade, mas **NÃO deve ser usado em fluxo novo**: o editor do FlowBuilder lê apenas `data.items`, então um fluxo gravado no formato antigo **dispara normalmente mas abre com o bloco Início EM BRANCO no painel do cliente** — e um clique em "Concluir" naquele modal apagava o gatilho em silêncio. Foram 53 fluxos de 9 contas nesse estado até o conserto de 19/08. Alguns leitores do backend (`has_webhook_trigger?` do disparo por webhook, o filtro de Campanha de Fluxo, o gatilho LionTrack e o histórico de execução) também só entendem `items`.
|
|
64
64
|
|
|
65
|
-
**Triggers válidos:** `message_received`, `message_sent`, `conversation_created`, `conversation_resolved`, `conversation_reopened`, `team_changed`, `assignee_changed`, `label_added`, `label_removed`, `sla_missed`, `card_created`, `card_moved`, `card_won`, `card_lost`, `card_opened`, `card_snoozed`, `conversation_attribute_changed`, `card_attribute_changed`, `contact_attribute_changed`, `date_trigger`, `campaign_trigger`, `manual_trigger`, `webhook_received`, `page_track`, `group_participant_joined`, `group_participant_left`, `lead_form_completed`, `lead_form_milestone`, `lead_form_abandoned`, `booking_created`, `booking_cancelled`, `booking_rescheduled`, `booking_completed`.
|
|
65
|
+
**Triggers válidos:** `message_received`, `message_sent`, `conversation_created`, `conversation_resolved`, `conversation_reopened`, `team_changed`, `assignee_changed`, `label_added`, `label_removed`, `sla_missed`, `card_created`, `card_moved`, `card_won`, `card_lost`, `card_opened`, `card_snoozed`, `card_open_in_stage`, `card_open_in_funnel`, `conversation_attribute_changed`, `card_attribute_changed`, `contact_attribute_changed`, `date_trigger`, `campaign_trigger`, `manual_trigger`, `webhook_received`, `page_track`, `group_participant_joined`, `group_participant_left`, `lead_form_completed`, `lead_form_milestone`, `lead_form_abandoned`, `booking_created`, `booking_cancelled`, `booking_rescheduled`, `booking_completed`.
|
|
66
66
|
|
|
67
67
|
**NÃO existem** os gatilhos `webhook` (o correto é **`webhook_received`**) nem `cron` (para disparo por data use `date_trigger`; para disparo em lote use `campaign_trigger` + Campanha de Fluxo). Até 19/08/2026 este guia listava os dois por engano — o fluxo 180 da conta 54 ficou ATIVO com `webhook` e **nunca disparou uma vez em 26 dias**, sem erro nenhum.
|
|
68
68
|
|
|
@@ -75,6 +75,13 @@ Todo node tem essa estrutura base:
|
|
|
75
75
|
- `card_created` / `card_moved`: `funnel_ids` (array de STRINGS, ex.: `["37"]` — número puro `[37]` NÃO casa) + `funnel_stages` (array de `"funnel_id:chave_da_etapa"`, ex.: `"37:agendamento_pendente"`). A `chave_da_etapa` é a CHAVE INTERNA da etapa no funil (slug legível em funis de template; pode ser um UUID/`stage_<n>` em etapa criada à mão ou funil duplicado) — NÃO o nome exibido na tela. Sem `funnel_ids` → dispara em qualquer funil; com `funnel_ids` mas sem `funnel_stages` → qualquer etapa daquele(s) funil(is). O card precisa estar num funil listado em `funnel_ids` pra o filtro de etapa valer. ATENÇÃO: dois flows ATIVOS na mesma inbox com `card_created`/`card_moved` de funil/etapa sobrepostos são bloqueados na criação/ativação (ver `flow_trigger_conflict` no fim deste guia).
|
|
76
76
|
- `team_changed`: `team_ids` (array de STRINGS; vazio = qualquer equipe). `assignee_changed`: `agent_ids` (array de STRINGS; vazio = qualquer atendente). `card_won` / `card_lost`: `funnel_ids` (array de STRINGS) — disparam SÓ quando o STATUS do card vira ganho/perdido, nunca por etapa com esse nome.
|
|
77
77
|
- `card_opened` ("Card aberto") / `card_snoozed` ("Card adiado") — NOVOS 11/10/2026, mesma config `funnel_ids` (array de STRINGS; vazio = qualquer funil). `card_snoozed` dispara quando o card é ADIADO. `card_opened` dispara quando um card adiado ABRE (pela data, por alguém ou por automação) e também quando um card ganho/perdido é REABERTO — card NOVO não dispara (para isso existe `card_created`). Pela data, o fluxo sai pela fila de disparos agendados, uma vez por card. Use `{{trigger.kanban.previous_status}}` (`snoozed`/`won`/`lost`) para separar "voltou do adiamento" de "reabriram um ganho/perdido".
|
|
78
|
+
- `card_open_in_stage` ("Card aberto na etapa") / `card_open_in_funnel` ("Card aberto no funil") — NOVOS 28/10/2026, gatilhos de **PRAZO**: disparam o fluxo UMA vez quando o card cruza um prazo ("lead parado"). Item: `{ "key": "card_open_in_stage", "config": { "funnel_ids": ["12"], "funnel_stages": ["12:novo_lead"], "duration_value": 1, "duration_unit": "hours" } }`; `card_open_in_funnel` tem a mesma config **sem** `funnel_stages`. `funnel_ids` (array de STRINGS) vazio = qualquer funil; `funnel_stages` (`"<funil>:<chave_da_etapa>"`) vazio = qualquer etapa. `duration_unit` = `minutes`|`hours`|`days`; `duration_value` inteiro (ou texto de inteiro, ex.: `"2"`); o servidor recusa (422) prazo fora de **15 minutos a 365 dias**, unidade desconhecida e funil de outra conta.
|
|
79
|
+
- **Relógio:** `card_open_in_stage` conta o tempo desde que o card ENTROU na etapa atual (o SEGUNDO número do "2d / 1d" do card no quadro; trocar de funil também recomeça). `card_open_in_funnel` conta a idade do card desde a criação (o PRIMEIRO número, "2d"; trocar de funil NÃO recomeça).
|
|
80
|
+
- **Quem conta:** card ABERTO ou ADIADO; ganho e perdido nunca. Dispara **uma vez por entrada na etapa** (`card_open_in_stage`: sai e volta = conta do zero) e **uma vez por card** (`card_open_in_funnel`).
|
|
81
|
+
- **Só dispara quem CRUZA o prazo com o fluxo ligado.** Card que já passou do prazo quando o fluxo foi ligado NÃO dispara (nem depois); com prazo de 5 dias, o card que está com 4 dispara ao chegar a 5. Mudar o prazo, o funil ou a etapa do gatilho vale como gatilho NOVO: só cruzamentos depois da mudança disparam. Relógio corrido (noite e fim de semana contam); a conferência roda de 5 em 5 minutos, então o fluxo pode começar até ~5 min depois do prazo.
|
|
82
|
+
- **Onde roda:** inicia SÓ o fluxo dono do gatilho, em cada conversa do card (card sem conversa não dispara). O card que disparou é o "card do gatilho": `card_source: 'trigger'` funciona e as condições "Card na etapa" / "Card adiado" olham para ele. Variáveis `{{trigger.kanban.title}}`, `.funnel_name`, `.stage_name`, `.stage` valem como nos outros gatilhos de card; `{{trigger.type}}` = a própria chave (`card_open_in_stage` / `card_open_in_funnel`).
|
|
83
|
+
- Dois fluxos com o mesmo gatilho na mesma caixa são permitidos (não há checagem de conflito): os dois disparam.
|
|
84
|
+
- Exemplo — avisar um grupo de WhatsApp quando o lead passa mais de 1 hora na etapa do vendedor: Início `card_open_in_stage` (1 hora, funil + etapa) → (opcional) condição "Card na etapa" → bloco `update_group` com a operação de enviar mensagem ao grupo, texto usando `{{agent.name}}` e o link da conversa `https://<host>/app/accounts/<id_da_conta>/conversations/{{conversation.id}}`.
|
|
78
85
|
- `page_track` (LionTrack, só flow individual): `{ "track_type": "visited_page"|"event_fired", "urls": [...], "operator": "contains"|"exact"|"starts_with", "event_names": [...], "event_operator": "equals"|"contains", "cooldown_hours": 24 }` — `cooldown_hours` (padrão 24, mínimo 1) não re-dispara pro mesmo contato dentro da janela.
|
|
79
86
|
- `conversation_attribute_changed` / `card_attribute_changed` (novo 2026-07-08): disparam na VIRADA de um atributo (da CONVERSA ou do CARD do kanban) pro valor que casa — RE-ENTRAM toda vez que o atributo muda pro valor alvo. Config: `{ "logic": "and"|"or", "rules": [ { "attr_key": "...", "operator": "...", "value": "..." } ] }` (uma rule pode usar `values: [...]` no lugar de `value` pra multi-valor). O `attrSource` é IMPLÍCITO pela chave do gatilho (conversa vs card) — NÃO informe. Operadores (contexto REATIVO — desde 09/07 `is_empty`/`is_not_empty` NÃO valem aqui, pois "está vazio AGORA" dispararia a cada evento; use-os só no nó Condição): `equal`/`not_equal`/`contains`/`not_contains`/`starts_with`/`ends_with`/`greater_than`/`less_than`/`number_range`. Só `card_attribute_changed` aceita `funnel_id`/`card_source` opcionais dentro da rule (pra achar o card). Rule sem `attr_key` é ignorada.
|
|
80
87
|
- `contact_attribute_changed` (novo 2026-07-22 — "Atributo do contato muda"): dispara quando um atributo personalizado do **CONTATO** muda e a condição casa — mesmo com o contato fora de flow. Item: `{ "key": "contact_attribute_changed", "config": { "logic": "and"|"or", "rules": [ { "attrSource": "contact", "attr_key": "...", "operator": "...", "value": "..." } ] } }` (1 a 10 rules; `values: [...]` pra multi-valor). **DIFERENTE dos irmãos de 08/07: aqui o `attrSource` VAI na rule e é SEMPRE `"contact"`.** Operadores iguais aos do nó Condição. **VERSÃO SEGURA por decisão de produto:** dispara SÓ na conversa mais recente que JÁ EXISTE numa caixa do flow (reabre se resolvida); contato sem conversa NÃO dispara e NUNCA cria conversa. Dedup de 30s por contato + anti-loop por profundidade de cadeia (flow que muda atributo que dispara flow…). Só flows de conversa.
|
|
@@ -156,7 +163,7 @@ Webhooks embutidos NÃO aparecem na listagem de integrações standalone; exclui
|
|
|
156
163
|
**Gatilhos de AGENDAMENTO — Booking NATIVO do LionChat (2026-08-20):** `booking_created` (alguém marcou pelo link público, pela IA ou pelo painel), `booking_cancelled` (paciente cancelou pelo link, IA cancelou ou a equipe cancelou na Agenda), `booking_rescheduled` (a data/hora mudou — link do paciente, IA, editar/adiar na Agenda), `booking_completed` (equipe concluiu na Agenda; exige a Agenda unificada ligada na conta). **Não é e-Clínica.** Config (tudo opcional, vazio = todos): `booking_event_type_ids` (array de ids de tipo de agendamento, **STRING**), `agent_ids` (array de ids de usuário — o RESPONSÁVEL da tarefa), `create_conversation` (boolean, padrão `false`: só dispara para quem já tem conversa numa caixa do flow; `true` = cria a conversa na 1ª caixa do flow). Exemplo: `{ "key": "booking_created", "config": { "booking_event_type_ids": ["44"], "agent_ids": [], "create_conversation": true } }`. São INERTES a evento de conversa (quem dispara é o `Booking::FlowTriggerDispatcher`, por CONTA — caixa do flow só define onde a conversa é criada/reusada). Variáveis no flow: `{{booking.date}}` (DD/MM/AAAA), `{{booking.time}}`, `{{booking.weekday}}`, `{{booking.datetime}}` (ISO), `{{booking.type}}`, `{{booking.type_format}}` (presencial/videochamada), `{{booking.duration}}`, `{{booking.agent}}`, `{{booking.status}}` (confirmado/cancelado/remarcado/concluído), `{{booking.description}}`, `{{booking.cancel_url}}`, `{{booking.reschedule_url}}`, `{{booking.confirm_url}}`, `{{booking.calendar_url}}` (16/10: página onde o cliente salva o compromisso na agenda DELE, sem e-mail; no remarcado já sai com a hora nova — é o jeito de avisar a mudança, pedindo para apagar o compromisso antigo), `{{booking.color}}`, `{{booking.id}}`; só no remarcado: `{{booking.previous_date}}`, `{{booking.previous_time}}`, `{{booking.previous_datetime}}`; `{{booking.meeting_url}}` NÃO vem no criado (nasce vazio). Data/hora vêm da TAREFA da Agenda (sempre atuais). Regras: o evento mais novo SUBSTITUI a rodada ativa do mesmo flow na mesma conversa (2ª consulta do mesmo paciente, ou cancelado chegando com o criado ainda esperando resposta); excluir a tarefa, reabrir cancelada ou desfazer conclusão NÃO disparam; adiar (snooze) conta como remarcado; tipo com confirmação/lembrete próprios ligados + `booking_created` = o paciente pode receber duas mensagens (a tela avisa). Colisão entre flows é por CONTA: mesmo kind + tipos se cruzando + agentes se cruzando (vazio = todos). Há também `{{booking.event}}` (`created`|`cancelled`|`rescheduled`|`completed` — bom pra condição; não aparece no seletor da tela, mas resolve); `{{trigger.type}}` = a chave do gatilho (ex.: `booking_created`), `{{trigger.kind}}` = `created`|`cancelled`|`rescheduled`|`completed` e `{{trigger.booking_id}}`. SÓ flow de conversa **individual** (a tela nem oferece em flow de grupo); **nunca dispara flow `ai_tool`**. Em caixa WhatsApp OFICIAL, conversa criada nova (ou parada há mais de 24h) está FORA da janela — texto livre no 1º bloco cai em `window_closed`/erro; comece por template.
|
|
157
164
|
|
|
158
165
|
**TRAVA DE GATILHO DUPLICADO (2026-06-16) — leia ANTES de ativar/criar flow ativo:** o sistema BLOQUEIA ter dois flows ATIVOS com o MESMO gatilho na MESMA inbox e mesmo `conversation_mode` (evita o evento disparar dois flows). Colisão = mesmo tipo de gatilho + config cruzando (mesmas keywords/funil/labels/url/etc) + inbox compartilhada + mesmo modo. EXCEÇÕES que podem coexistir: `webhook_received`, `manual_trigger` e `campaign_trigger` (este último porque não dispara por evento — é só uma autorização para a campanha).
|
|
159
|
-
- **`date_trigger` separa por HORÁRIO (24/09/2026):** dois flows no mesmo campo de data, mesma direção e mesmos dias NÃO colidem se os dois tiverem horário FIXO diferente (ex.: "1 dia depois às 08:00" e "às 14:00"). Horário vindo de atributo/fórmula continua colidindo (só existe na hora do disparo); `send_time` vazio conta como 09:00 e "8:00" = "08:00". A entrega é de
|
|
166
|
+
- **`date_trigger` separa por HORÁRIO (24/09/2026):** dois flows no mesmo campo de data, mesma direção e mesmos dias NÃO colidem se os dois tiverem horário FIXO diferente (ex.: "1 dia depois às 08:00" e "às 14:00"). Horário vindo de atributo/fórmula continua colidindo (só existe na hora do disparo); `send_time` vazio conta como 09:00 e "8:00" = "08:00". A entrega é de minuto em minuto (desde 26/10/2026) — horários no mesmo minuto saem juntos.
|
|
160
167
|
- Ao **ativar** (`flows_toggle` inativo→ativo) ou **criar já ativo**: qualquer conflito é barrado.
|
|
161
168
|
- Ao **editar** um flow já ativo: só conflito NOVO é barrado (duplicados que já existiam são preservados).
|
|
162
169
|
- A API responde **422** com `{ "error_code": "flow_trigger_conflict", "conflicts": [{ flow_id, flow_name, trigger_type, inbox_id, inbox_name }] }`.
|
|
@@ -460,9 +467,34 @@ campanha"):
|
|
|
460
467
|
(origem unificada), `ctwa_*` (anúncio click-to-WhatsApp: `ctwa_ad_id`, `ctwa_ad_title`, `ctwa_campaign_name`,
|
|
461
468
|
`ctwa_adset_name`...), `meta_lead_*` (formulário Meta Lead Ads), `lt_*` (LionTrack: UTMs, página, dispositivo).
|
|
462
469
|
Veja a lista real com `lionchat_custom_attributes_list` (`attribute_model: conversation_attribute` — com o sufixo; só `conversation` devolve a lista VAZIA —, `include_system: true` — as chaves de campanha são atributos de sistema).
|
|
463
|
-
- **Valores fechados** de `origin_kind` (e `origin_first_kind`/`origin_last_kind`): `paid_ad` (Anúncio),
|
|
464
|
-
`lead_form` (
|
|
465
|
-
|
|
470
|
+
- **Valores fechados** de `origin_kind` (e `origin_first_kind`/`origin_last_kind`): `paid_ad` (Anúncio (clique)),
|
|
471
|
+
`lead_form` (Anúncio (formulário)), `organic` (Orgânico), `direct` (Direto), `referral` (Indicação),
|
|
472
|
+
`agendamento` (Página de agendamento), `formulario` (Formulário do site), `manual` (Origem cadastrada). O painel
|
|
473
|
+
mostra o rótulo em português, mas a comparação é pelo VALOR — `"Anúncio"` nunca casa.
|
|
474
|
+
- **Desde 26/10/2026, o formulário do mesmo anúncio continua formulário:** quando a pessoa preenche o formulário do
|
|
475
|
+
Meta e depois clica no MESMO anúncio para abrir o WhatsApp, a conversa fica com `origin_kind: "lead_form"` (antes
|
|
476
|
+
virava `paid_ad`). Conversas anteriores a 26/10 não mudam.
|
|
477
|
+
|
|
478
|
+
**"Veio de anúncio pago" — chave `origin_paid` (25/10/2026). USE ESTA para "só lead de anúncio":**
|
|
479
|
+
`origin_kind equal paid_ad` deixa de fora quem veio pelo FORMULÁRIO do anúncio (`lead_form`) — foi o defeito real da
|
|
480
|
+
Cast (conta 137, fluxo 590: a IA nunca ligou para os leads de formulário de 08/10 a 24/10). A chave `origin_paid` junta
|
|
481
|
+
as duas portas do anúncio. Forma que a tela grava (reabre no card "Veio de anúncio pago", Sim/Não):
|
|
482
|
+
|
|
483
|
+
```json
|
|
484
|
+
{ "id": "c1", "valueType": "attr_config", "attrSource": "conversation", "attrScope": "origin_paid",
|
|
485
|
+
"attr_key": "origin_paid", "operator": "equal", "value": "", "values": ["paid"] }
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
- Sim = `operator: "equal"`; Não = `operator: "not_equal"` (inclui conversa sem origem e origem cadastrada a mão).
|
|
489
|
+
- Valores possíveis (calculados na hora, nunca gravados): `paid` (`paid_ad` ou `lead_form`), `not_paid` (orgânico,
|
|
490
|
+
direto, indicação, página de agendamento, formulário do site), `unknown` (`manual` ou tipo desconhecido — nunca é
|
|
491
|
+
tratado como pago), `unclassified` (sem origem ainda).
|
|
492
|
+
- É chave VIRTUAL: não existe em `custom_attributes`, não aparece em `lionchat_custom_attributes_list`, não serve em
|
|
493
|
+
`{{conversation.custom_attribute.origin_paid}}` nem como gatilho "atributo mudou". Só em condição (fluxo e
|
|
494
|
+
automação) e no filtro de conversas.
|
|
495
|
+
- A mesma pergunta existe na automação (condição `origin_paid`, operadores `equal_to`/`not_equal_to`), no filtro de
|
|
496
|
+
conversas (`lionchat_conversations_filter`) e no relatório de origem (`paid` e `by_paid` em
|
|
497
|
+
`lionchat_lead_origin_reports`).
|
|
466
498
|
- `origin_platform` (e first/last): `facebook`, `instagram`, `google`, `tiktok`, `linkedin`, `youtube`,
|
|
467
499
|
`whatsapp`, `email`, `messenger`, `audience_network` (Rede de parceiros da Meta, desde 29/09/2026), `direct` — e, para origem cadastrada pelo cliente em Configurações > Origens de Lead,
|
|
468
500
|
`custom:<slug>` (slug = nome parametrizado, ex.: "Indicação de amigo" → `custom:indicacao-de-amigo`;
|
|
@@ -472,7 +504,8 @@ campanha"):
|
|
|
472
504
|
"operator": "equal", "value": "paid_ad", "valueType": "variable" }` — reabre no card "Variável", não no de
|
|
473
505
|
campanha. Prefira o formato `attr_config` acima quando o cliente vai editar pela tela.
|
|
474
506
|
- Caso real (Cast, 01/09): flow "Ativar IA" só para lead de anúncio = condição `origin_kind equal paid_ad`
|
|
475
|
-
na saída `cond_0` + ação `assign_captain` nessa saída; `default` sem nada.
|
|
507
|
+
na saída `cond_0` + ação `assign_captain` nessa saída; `default` sem nada. **Desde 25/10 use `origin_paid equal paid`
|
|
508
|
+
(seção acima)**: `origin_kind equal paid_ad` não pega o lead do formulário do anúncio.
|
|
476
509
|
|
|
477
510
|
- **`attrScope: "lead_origin"` (02/09/2026):** preset "Origem do lead" da aba Conversas — mesmo shape do `campaign_attr`, ja nasce com `attr_key: "origin_platform"`. Valores: plataformas fixas (`facebook`, `google`...) ou origem cadastrada como `custom:<slug>`. O motor ignora `attrScope`; sem ele a regra reabre como "Atributo de campanha" (falha macia).
|
|
478
511
|
|
|
@@ -570,21 +603,21 @@ o botão "Usar variável" ao lado do campo alterna lista fixa ↔ variável.
|
|
|
570
603
|
| `send_conversion` (novo 2026-09-01; `event_names` 2026-09-02; `messaging_event_names` 2026-09-10) | `{ destinations: ['meta'\|'ga4'\|'google_ads'], event_names: { meta?, google_ads?, ga4? }, messaging_event_names: { meta? }, event_name (reserva), value? }` | Manda o evento de conversão pro Meta (CAPI), Google Ads e/ou GA4 — o mesmo caminho do Funil, de dentro do fluxo. Aba Sistema (só flow `conversation`). Ver bloco próprio abaixo |
|
|
571
604
|
| `deactivate_flow` ou `disable_flow` | `{}` | Encerra fluxo atual |
|
|
572
605
|
| `set_booking_situation` (novo 2026-09-14) | `{ situation: 'cancelled' \| 'completed' \| 'attended' \| 'no_show' \| 'confirmed' }` | Muda a situação do agendamento **que disparou o fluxo** (gatilho de agendamento do bloco Início, ou fluxo ligado na configuração do tipo de agendamento). Aba **Agenda** (só flow `conversation`, só com a Agenda ligada na conta). Disparado por outra coisa: **não faz efeito e o passo fica com erro visível** (não há como adivinhar o agendamento). Já no estado pedido = passo PULADO, sem escrita (sem evento, sem laço). `cancelled` cancela o **agendamento** (desarma lembretes, invalida o link de gerenciar). Origem gravada = `fluxo`, ator = o próprio flow. Sem `rescheduled`/`snoozed`: o bloco não mexe em data |
|
|
573
|
-
| `create_account_task` (novo 2026-10-20) | `{ title, description?, task_type, agenda_id?, priority?, occupies_agenda?, due: {amount, unit: 'hours' \| 'days', at?, business_days?}, responsible: {mode: 'card_owner' \| 'fixed' \| 'funnel_rotation' \| 'team_rotation', user_id?, team_id?, fallback_user_id?}, card_source: 'funnel' \| 'trigger', funnel_id? }` | "Criar tarefa": cria uma tarefa COMUM da Agenda, presa ao card do fluxo (ou só à conversa, se não houver card). Os campos de `title` a `responsible` são os MESMOS da ação `create_task` da automação do funil (ver `kanban-deep-dive`). Aba **Agenda**; exige a Agenda unificada ligada na conta. **NÃO roda em fluxo `ai_tool` nem em fluxo de grupo** (o motor recusa com erro visível no passo; o save aceita, a tela esconde o item). Detalhes logo abaixo |
|
|
606
|
+
| `create_account_task` (novo 2026-10-20) | `{ title, description?, task_type, agenda_id?, priority?, occupies_agenda?, duration_minutes?, due: {amount, unit: 'hours' \| 'days', at?, business_days?}, responsible: {mode: 'card_owner' \| 'fixed' \| 'funnel_rotation' \| 'team_rotation', user_id?, team_id?, fallback_user_id?}, card_source: 'funnel' \| 'trigger', funnel_id? }` | "Criar tarefa": cria uma tarefa COMUM da Agenda, presa ao card do fluxo (ou só à conversa, se não houver card). Os campos de `title` a `responsible` são os MESMOS da ação `create_task` da automação do funil (ver `kanban-deep-dive`). Aba **Agenda**; exige a Agenda unificada ligada na conta. **NÃO roda em fluxo `ai_tool` nem em fluxo de grupo** (o motor recusa com erro visível no passo; o save aceita, a tela esconde o item). Detalhes logo abaixo |
|
|
574
607
|
| `update_attribute` | `{ attr_source: 'contact'\|'conversation'\|'card', attr_key, attr_value }` | Seta custom_attribute (ver abaixo) |
|
|
575
608
|
| `assign_captain` (ou `assign_captain_assistant`) | `{ assistant_id }` | Atribui IA Captain |
|
|
576
609
|
| `deactivate_captain` | `{}` | Tira a IA da conversa |
|
|
577
610
|
|
|
578
611
|
**Handles que SAEM:** `success`. Não tem handle `error` — falhas viram warning silencioso e o flow continua.
|
|
579
612
|
|
|
580
|
-
**`card_source` (blocos de card) — opcional:** as ações de card aceitam `card_source`: `'funnel'` (default — procura o card pelo `funnel_id`) ou `'trigger'` (usa o card que DISPAROU o flow, em flows iniciados por `card_created`/`card_moved`/`card_won`/`card_lost`/`card_opened`/`card_snoozed`). Com `'trigger'`, `funnel_id` deixa de ser obrigatório — EXCETO em `move_kanban_stage`/`create_kanban_item`, cujo funil/etapa são o DESTINO. Sem card-gatilho disponível, a ação é pulada (não cai no fallback de funil). Aplica-se a `move_kanban_stage`, `set_won`/`set_lost`/`set_open`, `snooze_kanban_item` (esta, sem card-gatilho, dá ERRO em vez de pular), `assign_agent_card`, `add_card_note`, `add_card_checklist`, `add_card_offer`, `create_account_task` (aqui sem card-gatilho = ERRO; ver abaixo), `update_attribute` (com `attr_source: 'card'`) e às condições `card_attr_equals`/`card_attr_contains` (gravando `card_source` na própria regra).
|
|
613
|
+
**`card_source` (blocos de card) — opcional:** as ações de card aceitam `card_source`: `'funnel'` (default — procura o card pelo `funnel_id`) ou `'trigger'` (usa o card que DISPAROU o flow, em flows iniciados por `card_created`/`card_moved`/`card_won`/`card_lost`/`card_opened`/`card_snoozed`/`card_open_in_stage`/`card_open_in_funnel`). Com `'trigger'`, `funnel_id` deixa de ser obrigatório — EXCETO em `move_kanban_stage`/`create_kanban_item`, cujo funil/etapa são o DESTINO. Sem card-gatilho disponível, a ação é pulada (não cai no fallback de funil). Aplica-se a `move_kanban_stage`, `set_won`/`set_lost`/`set_open`, `snooze_kanban_item` (esta, sem card-gatilho, dá ERRO em vez de pular), `assign_agent_card`, `add_card_note`, `add_card_checklist`, `add_card_offer`, `create_account_task` (aqui sem card-gatilho = ERRO; ver abaixo), `update_attribute` (com `attr_source: 'card'`) e às condições `card_attr_equals`/`card_attr_contains` (gravando `card_source` na própria regra).
|
|
581
614
|
|
|
582
615
|
**`create_account_task` — Criar tarefa (2026-10-20):**
|
|
583
616
|
|
|
584
617
|
```json
|
|
585
618
|
{ "key": "create_account_task", "config": {
|
|
586
619
|
"title": "Ligar para {{contact.name}}", "description": "", "task_type": "call", "agenda_id": null,
|
|
587
|
-
"priority": "none", "occupies_agenda": false,
|
|
620
|
+
"priority": "none", "occupies_agenda": false, "duration_minutes": 45,
|
|
588
621
|
"due": { "amount": 3, "unit": "days", "at": "09:00", "business_days": true },
|
|
589
622
|
"responsible": { "mode": "card_owner", "fallback_user_id": 12 },
|
|
590
623
|
"card_source": "trigger", "funnel_id": ""
|
|
@@ -592,14 +625,15 @@ o botão "Usar variável" ao lado do campo alterna lista fixa ↔ variável.
|
|
|
592
625
|
```
|
|
593
626
|
|
|
594
627
|
- **Os campos da regra** (`title`, `description`, `task_type`, `agenda_id`, `priority`, `due`, `responsible`,
|
|
595
|
-
`occupies_agenda`) têm o mesmo formato e os mesmos limites da ação `create_task` do funil: `title` obrigatório; `due`
|
|
628
|
+
`occupies_agenda`, `duration_minutes`) têm o mesmo formato e os mesmos limites da ação `create_task` do funil: `title` obrigatório; `due`
|
|
596
629
|
em horas (1 a 720) ou dias (0 a 365, com `at` "HH:MM" e `business_days` só em dias); `responsible.mode` com a chave
|
|
597
630
|
obrigatória do modo (`fallback_user_id`, `user_id` ou `team_id`; `funnel_rotation` não pede nenhuma no save,
|
|
598
631
|
mas no fluxo SEM card o rodízio do funil não tem funil e cai na pessoa reserva `fallback_user_id` — sem reserva a
|
|
599
632
|
tarefa não nasce, com o motivo no histórico: mande `fallback_user_id` se o fluxo puder rodar sem card). Regra torta =
|
|
600
633
|
passo VERMELHO com a frase do campo a consertar, sem tarefa.
|
|
634
|
+
- **Duração**: `duration_minutes` (22/10/2026): minutos que a tarefa ocupa, inteiro de 1 a 1440; ausente ou `null` = o tempo do TIPO (Tarefa/Follow-up/Prazo 15, Ligação/Personalizado 30, Reunião/Call 60, tipo criado pela conta 30). Com `occupies_agenda: true` o horário ocupado vai do prazo até o fim da duração.
|
|
601
635
|
- **De onde vem o card (`card_source`)**: `'trigger'` = o card que INICIOU o fluxo (gatilhos `card_created`,
|
|
602
|
-
`card_moved`, `card_won`, `card_lost`, `card_opened`, `card_snoozed`); fluxo que não nasceu de card = ERRO
|
|
636
|
+
`card_moved`, `card_won`, `card_lost`, `card_opened`, `card_snoozed`, `card_open_in_stage`, `card_open_in_funnel`); fluxo que não nasceu de card = ERRO
|
|
603
637
|
visível, nunca pulado. `'funnel'` (o padrão da tela) = o card DESSA conversa no funil `funnel_id` (**obrigatório**
|
|
604
638
|
neste modo; funil sem `funnel_id` ou que não existe mais = erro). Conversa sem card naquele funil não é erro: a
|
|
605
639
|
tarefa nasce SÓ na conversa e o passo diz "sem card". Variáveis `{{ }}` em `title` e `description` resolvem pelo
|
|
@@ -731,6 +765,13 @@ mensagem elas são bloqueadas por segurança); aqui resolvem no `apiUrl`, `apiHe
|
|
|
731
765
|
NÃO existe `.payload`/`.response` (`{{api_response.payload.x}}` resolve vazio). O status fica em
|
|
732
766
|
`{{api_response_status}}`. Se a resposta não for JSON, só `{{api_response}}` inteiro funciona.
|
|
733
767
|
|
|
768
|
+
**Listas na resposta:** item de lista pelo índice com PONTO — `{{api_response.data.0.id}}`,
|
|
769
|
+
`{{api_response.data.0.itens.1.nome}}` — funciona em qualquer versão. Tamanho da lista com FILTRO:
|
|
770
|
+
`{{api_response.data | size}}`. Colchete (`{{api_response.data[0].id}}`) e `.size` sem filtro
|
|
771
|
+
(`{{api_response.data.size}}`) só funcionam depois da correção de 30/10/2026 estar no ar; antes disso saem
|
|
772
|
+
VAZIOS sem erro (a prévia da tela mostra o valor e a execução real não). Prefira sempre o ponto e o `| size`.
|
|
773
|
+
Posição que não existe sai vazia.
|
|
774
|
+
|
|
734
775
|
**Handles que SAEM:** `success`, `error`.
|
|
735
776
|
|
|
736
777
|
### 2.7 `ai`
|
|
@@ -1138,8 +1179,12 @@ pela linha de ligacao do WhatsApp (LionCalls).
|
|
|
1138
1179
|
"data": { "aiCallAgentId": 4, "aiCallInboxId": 82 } }
|
|
1139
1180
|
```
|
|
1140
1181
|
|
|
1141
|
-
- `aiCallAgentId`: id de `lionchat_captain_call_agents_list`. O que a IA fala, a
|
|
1142
|
-
vem do agente (`max_duration_seconds`, 30-600 s; no tempo o motor desliga sozinho).
|
|
1182
|
+
- `aiCallAgentId`: id de um **agente de LIGACAO**, vindo de `lionchat_captain_call_agents_list`. O que a IA fala, a
|
|
1183
|
+
voz e o **tempo maximo** da ligacao vem do agente (`max_duration_seconds`, 30-600 s; no tempo o motor desliga sozinho).
|
|
1184
|
+
**NUNCA** use o id de um agente de TEXTO (`lionchat_captain_assistants_*`): sao cadastros diferentes, e o agente de
|
|
1185
|
+
ligacao so APONTA para um de texto em `captain_assistant_id`. Se `captain_call_agents_list` nao estiver entre as
|
|
1186
|
+
suas ferramentas, **pesquise pelo nome** antes de concluir que nao existe. Agente de ligacao que ja existe na conta
|
|
1187
|
+
**nao se recria** — use o id que a lista devolve.
|
|
1143
1188
|
- `aiCallInboxId`: id de `meta.dial_inboxes` da mesma lista (caixa com a ligacao ligada).
|
|
1144
1189
|
- Saidas: `answered` (atendeu), `no_answer` (nao atendeu/recusou), `error` (nao deu pra ligar; motivo no historico).
|
|
1145
1190
|
`answered`/`no_answer` sem edge = o flow termina; `error` sem edge = execucao "Falhou".
|
|
@@ -1148,6 +1193,9 @@ pela linha de ligacao do WhatsApp (LionCalls).
|
|
|
1148
1193
|
- Nao confere horario (use `condition` antes). Linha ocupada: espera a vez por ate 2 h (a IA sempre deixa uma vaga
|
|
1149
1194
|
para a equipe).
|
|
1150
1195
|
- **Proibido** em flow `action`, em flow de grupo e em `ai_tool` (o save recusa). Id de outra conta tambem e recusado.
|
|
1196
|
+
- O save tambem recusa agente ou caixa **escolhidos ou trocados** que nao existem nesta conta ("ai_call block uses a
|
|
1197
|
+
call agent that does not exist in this account" / "...an inbox without a calling line..."). Agente apagado ou
|
|
1198
|
+
caixa excluida DEPOIS nao travam o save — falham na execucao.
|
|
1151
1199
|
|
|
1152
1200
|
**Receita — a IA de atendimento pede a ligacao:** etiqueta `ligar`; o cenario manda por a etiqueta quando o cliente
|
|
1153
1201
|
pede para falar por telefone; flow `conversation` com gatilho `label_added` (`label_names: ["ligar"]`) -> action
|
|
@@ -1269,7 +1317,7 @@ Sempre presente:
|
|
|
1269
1317
|
|
|
1270
1318
|
| Variável | Conteúdo |
|
|
1271
1319
|
|---|---|
|
|
1272
|
-
| `{{trigger.type}}` | código do **EVENTO** que disparou — **NÃO é a chave do item do Início**. Valores reais: `message_created` (gatilho `message_received`), `message_sent`, `conversation_created`, `conversation_opened` (gatilho `conversation_reopened`), `conversation_resolved`, `label_added`, `label_removed`, `team_changed`, `assignee_changed`, `sla_missed`, `kanban_item_created`/`card_created`, `kanban_item_stage_changed`/`card_moved`, `card_status_changed` (`card_won`, `card_lost`, `card_opened` e `card_snoozed` — olhe `{{trigger.kanban.status}}`: `won`/`lost`/`open`/`snoozed`; rótulo "Situação do card mudou" desde 11/10/2026), `conversation_attributes_changed`, `card_attributes_changed`, `contact_attribute_changed`, `group_participant_joined`/`_left`, `webhook_received`, `date_trigger`, `manual` (sidebar), `kanban_manual` (botão do card), `campaign` (Campanha de Fluxo), `page_track`, `activated_by_flow` (fluxo chamou fluxo), `lead_form` (os 3 gatilhos de formulário — `trigger.kind` diz `completed`/`milestone`/`abandoned`), `booking_created`/`booking_cancelled`/`booking_rescheduled`/`booking_completed`. Compare SEMPRE com esses códigos numa condição |
|
|
1320
|
+
| `{{trigger.type}}` | código do **EVENTO** que disparou — **NÃO é a chave do item do Início**. Valores reais: `message_created` (gatilho `message_received`), `message_sent`, `conversation_created`, `conversation_opened` (gatilho `conversation_reopened`), `conversation_resolved`, `label_added`, `label_removed`, `team_changed`, `assignee_changed`, `sla_missed`, `kanban_item_created`/`card_created`, `kanban_item_stage_changed`/`card_moved`, `card_status_changed` (`card_won`, `card_lost`, `card_opened` e `card_snoozed` — olhe `{{trigger.kanban.status}}`: `won`/`lost`/`open`/`snoozed`; rótulo "Situação do card mudou" desde 11/10/2026), `conversation_attributes_changed`, `card_attributes_changed`, `contact_attribute_changed`, `group_participant_joined`/`_left`, `webhook_received`, `date_trigger`, `manual` (sidebar), `kanban_manual` (botão do card), `campaign` (Campanha de Fluxo), `page_track`, `card_open_in_stage` / `card_open_in_funnel` (o `type` é a própria chave do gatilho de prazo; rótulo "Card aberto na etapa" / "Card aberto no funil"), `activated_by_flow` (fluxo chamou fluxo), `lead_form` (os 3 gatilhos de formulário — `trigger.kind` diz `completed`/`milestone`/`abandoned`), `booking_created`/`booking_cancelled`/`booking_rescheduled`/`booking_completed`. Compare SEMPRE com esses códigos numa condição |
|
|
1273
1321
|
| `{{trigger.name}}` | rótulo legível do MESMO evento ("Mensagem recebida", "Card mudou de etapa") — use este pra ESCREVER pro cliente, e o `type` pra COMPARAR em condição |
|
|
1274
1322
|
| `{{trigger.activated_at}}` | quando disparou (ISO 8601). Desde 20/08/2026 `name` e `activated_at` são preenchidos em TODOS os caminhos de disparo (antes só no de evento de conversa) |
|
|
1275
1323
|
| `{{trigger.kanban_item_id}}` / `{{trigger.funnel_id}}` | só quando veio do Kanban |
|
|
@@ -1309,7 +1357,7 @@ Oferecidos no autocompletar (só quando o bloco Início tem o gatilho que os pre
|
|
|
1309
1357
|
|
|
1310
1358
|
| Gatilhos do Início | Variáveis |
|
|
1311
1359
|
|---|---|
|
|
1312
|
-
| `card_created`, `card_moved`, `card_won`, `card_lost`, `card_opened`, `card_snoozed`, `card_attribute_changed` | `{{trigger.kanban.title}}`, `{{trigger.kanban.funnel_name}}`, `{{trigger.kanban.stage_name}}`, `{{trigger.kanban.stage}}` (código da etapa) |
|
|
1360
|
+
| `card_created`, `card_moved`, `card_won`, `card_lost`, `card_opened`, `card_snoozed`, `card_open_in_stage`, `card_open_in_funnel`, `card_attribute_changed` | `{{trigger.kanban.title}}`, `{{trigger.kanban.funnel_name}}`, `{{trigger.kanban.stage_name}}`, `{{trigger.kanban.stage}}` (código da etapa) |
|
|
1313
1361
|
| `card_moved` | `{{trigger.kanban.previous_stage_name}}`, `{{trigger.kanban.previous_stage}}` |
|
|
1314
1362
|
| `card_won`, `card_lost`, `card_opened`, `card_snoozed` | `{{trigger.kanban.status}}` (`won`/`lost`/`open`/`snoozed`) |
|
|
1315
1363
|
| `card_opened` | `{{trigger.kanban.previous_status}}` (`snoozed` = voltou do adiamento; `won`/`lost` = reabriram um ganho/perdido) |
|
|
@@ -489,8 +489,9 @@ publicado e ligado numa janela e preenche durante a ligação. Essa resposta é
|
|
|
489
489
|
- Contato e conversa ficam **fixos**: os da conversa. Telefone digitado nunca troca de contato nem cria ficha; se já
|
|
490
490
|
for de outra ficha (com ou sem o nono dígito) não é gravado.
|
|
491
491
|
- Todos os blocos rodam como no link (atributos, etiquetas, marco, API, IA, WhatsApp, contrato, agenda). A única
|
|
492
|
-
diferença:
|
|
493
|
-
|
|
492
|
+
diferença: o fluxo **"Formulário abandonado"** NÃO dispara — o pulo fica registrado com o motivo `filled_by_team`.
|
|
493
|
+
**"Formulário concluído"** dispara como no link (desde 23/10/2026; de 20 a 23/10 ele também era pulado, e esses
|
|
494
|
+
pulos antigos seguem no histórico). "Marco do formulário" dispara.
|
|
494
495
|
- Fica **fora** de `lionchat_lead_forms_stats` (funil, conclusão) e dos contadores da lista (`responses_count`,
|
|
495
496
|
`completed_count`), e do relatório de formulários. Aparece em `responses_list`/`responses_show` com o selo.
|
|
496
497
|
- Não há ferramenta do MCP para começar esse preenchimento — ele só existe na janela do painel.
|
|
@@ -468,6 +468,15 @@ caixa oficial → `whatsapp_calls`; telefone/ramal → Zenvia (softphone) ou VTC
|
|
|
468
468
|
WhatsApp Calling (Cloud) fica fora, em `whatsapp_calls_*`. Ligações antigas do **Wavoip** (integração
|
|
469
469
|
encerrada em 30/07/2026) continuam aparecendo nesse histórico, com `provider: "wavoip"`.
|
|
470
470
|
|
|
471
|
+
**Agente de Ligação com IA pelo TELEFONE (ramal VTCall, 30/10/2026).** O Agente de Ligação
|
|
472
|
+
(`captain_call_agents_*`) é a IA de voz. Por padrão ela liga pelo WhatsApp; se o agente tiver um
|
|
473
|
+
**ramal VTCall** configurado (`sip_ramal` + `sip_server`, com `sip_port` e `max_concurrent_calls`),
|
|
474
|
+
ela passa a **ligar por TELEFONE** por esse ramal, e a conversa de cada ligação nasce na caixa
|
|
475
|
+
`new_conversation_inbox_id`. Os campos do ramal vão no `create`/`update` do agente; **a senha do ramal
|
|
476
|
+
(`sip_password`) NUNCA entra pelo MCP — só pela tela do painel** (o MCP só lê `has_sip_password`
|
|
477
|
+
true/false). `captain_call_agents_ramal_status` lê no motor se o ramal conectou (`comprovado`),
|
|
478
|
+
foi recusado (`senha_recusada`) ou ainda está registrando (`aguardando_teste`).
|
|
479
|
+
|
|
471
480
|
**Wavoip — INTEGRAÇÃO REMOVIDA (12/08/2026).** O vínculo com a Wavoip acabou; o último uso real foi
|
|
472
481
|
em 30/07/2026. Saíram do produto: a aba "Ligação WP" da caixa, o discador, o Super Admin, as rotas,
|
|
473
482
|
os webhooks, as tarefas automáticas e a tabela. As 8 tools `wavoip_*` já haviam sido removidas do MCP
|
|
@@ -469,8 +469,9 @@ acesso a uma conversa solta vem de estar atribuído ao card dela.
|
|
|
469
469
|
|
|
470
470
|
## Funil arquivado vs ativo
|
|
471
471
|
|
|
472
|
-
|
|
473
|
-
|
|
472
|
+
Arquivar e `active = false` são a MESMA coisa (`funnels_archive` grava `active: false`; `funnels_unarchive`
|
|
473
|
+
volta para `true`). Não existe campo `archived` separado. O funil arquivado some da tela principal e os cards
|
|
474
|
+
continuam guardados.
|
|
474
475
|
|
|
475
476
|
Use cases:
|
|
476
477
|
- Arquivar funis antigos no fim do ano
|
|
@@ -561,21 +562,26 @@ PUT /api/v1/accounts/43/funnels/43
|
|
|
561
562
|
| action | action_config | Observação |
|
|
562
563
|
|---|---|---|
|
|
563
564
|
| `move_to_stage` | `{stage}` | NUNCA executa com trigger `stage_moved` (anti-loop do backend) |
|
|
564
|
-
| `assign_agent` | `{agent_id}` | Agente precisa ter acesso ao funil, senão é ignorado |
|
|
565
|
+
| `assign_agent` | `{agent_id}` | Agente precisa ter acesso ao funil, senão é ignorado. **Não use com gatilho `won`/`lost`**: a automação roda com o card já fechado e card fechado não aceita responsável novo — não faz nada (a tela não oferece mais desde 22/10) |
|
|
565
566
|
| `create_note` | `{note_text}` | Cria nota no card com autor "Sistema" |
|
|
566
|
-
| `notify_team` | `{message}` | HOJE só registra em log interno — não notifica ninguém de verdade |
|
|
567
|
+
| `notify_team` | `{message}` | HOJE só registra em log interno — não notifica ninguém de verdade. **Não use** (a tela não oferece mais desde 22/10) |
|
|
567
568
|
| `duplicate_item` | `{funnel_id, stage}` | Cria cópia noutro funil/etapa; título ganha sufixo "(cópia)" |
|
|
568
569
|
| `send_webhook` | `{webhook_url}` | POST com payload completo do card (fire-and-forget) |
|
|
569
570
|
| `apply_checklist_template` | `{template_id}` | Template de `kanban_config.checklist_templates`; aditivo (appenda) — cada aplicação vira um grupo (carimba `group_id`/`group_name` nos itens) |
|
|
570
571
|
| `update_checklist` | `{checklist_updates: [{checklist_item_id, completed, text}]}` | Não aparece na UI — só via API |
|
|
571
|
-
| `create_task` (20/10/2026) | `{title, description?, task_type, agenda_id?, priority?, occupies_agenda?, due: {amount, unit: 'hours'\|'days', at?: 'HH:MM', business_days?: true}, responsible: {mode: 'card_owner'\|'fixed'\|'funnel_rotation'\|'team_rotation', fallback_user_id (card_owner), user_id (fixed), team_id (team_rotation)}}` | Cria uma tarefa COMUM da Agenda presa ao card (ver "Tarefa automática do card" abaixo). Exige a Agenda unificada ligada na conta |
|
|
572
|
+
| `create_task` (20/10/2026) | `{title, description?, task_type, agenda_id?, priority?, occupies_agenda?, duration_minutes?, due: {amount, unit: 'hours'\|'days', at?: 'HH:MM', business_days?: true}, responsible: {mode: 'card_owner'\|'fixed'\|'funnel_rotation'\|'team_rotation', fallback_user_id (card_owner), user_id (fixed), team_id (team_rotation)}}` | Cria uma tarefa COMUM da Agenda presa ao card (ver "Tarefa automática do card" abaixo). Exige a Agenda unificada ligada na conta |
|
|
572
573
|
|
|
573
574
|
**Regras críticas (gravar diferente disso = automação perdida ou morta):**
|
|
574
575
|
|
|
575
|
-
- `trigger_value` vazio
|
|
576
|
+
- `trigger_value` vazio → a UI DESCARTA a automação no próximo "Salvar" do usuário. `enabled: false` é estado válido desde 20/10: a regra desligada que já existe fica guardada, desligada (antes a tela a descartava).
|
|
576
577
|
- Nomes de trigger/action fora das tabelas acima (ex.: `status_changed`, `duplicate_to_funnel`, `send_message`, `set_priority` — NÃO existem) são salvos mas NUNCA disparam, sem erro nenhum.
|
|
577
578
|
- `id` no formato `automation_<timestamp_ms>` — a UI usa pra editar/remover a automação.
|
|
578
579
|
- Trigger `card_created` + ação `duplicate_item` funciona (backend tem anti-loop), mas a UI esconde essa combinação.
|
|
580
|
+
- **A ordem da lista `automations` é a ordem de execução**: quando várias regras disparam no mesmo acontecimento (ex.:
|
|
581
|
+
duas em `won`), elas rodam de cima para baixo. Para mudar a ordem, reenvie a lista inteira na ordem desejada (no
|
|
582
|
+
painel, desde 22/10, a pessoa segura e arrasta cada regra). Mudar a ordem não mexe na configuração de nenhuma regra.
|
|
583
|
+
- `assign_agent` com `status_change` `won`/`lost` e `notify_team` são aceitos pelo servidor mas **não fazem nada**: não
|
|
584
|
+
grave regras novas com eles. Regra antiga que já os tenha aparece no painel com um aviso amarelo.
|
|
579
585
|
|
|
580
586
|
Use para: "ao ganhar um card de Vendas → criar automaticamente em Pós-Venda na etapa Agendar Instalação" (`status_change`/`won` + `duplicate_item`).
|
|
581
587
|
|
|
@@ -587,6 +593,7 @@ Use para: "ao ganhar um card de Vendas → criar automaticamente em Pós-Venda n
|
|
|
587
593
|
`business_days: true` (dias úteis) **só em dias**. Dia útil = segunda a sexta **sem feriado de dia inteiro** da agenda
|
|
588
594
|
da tarefa (feriado de meio período não conta). O fuso é o da agenda da tarefa. Prazo que já passou nasce atrasado,
|
|
589
595
|
nunca é empurrado.
|
|
596
|
+
- **Duração**: `duration_minutes` (22/10/2026): minutos que a tarefa ocupa, inteiro de 1 a 1440; ausente ou `null` = o tempo do TIPO (Tarefa/Follow-up/Prazo 15, Ligação/Personalizado 30, Reunião/Call 60, tipo criado pela conta 30). Com `occupies_agenda: true` o horário ocupado vai do prazo até o fim da duração.
|
|
590
597
|
- **Responsável (`responsible.mode`)**: `card_owner` (primeiro responsável do card; senão o da conversa; senão a reserva `fallback_user_id`,
|
|
591
598
|
obrigatória), `fixed` (exige `user_id`), `funnel_rotation` (rodízio de quem acessa o funil) e `team_rotation` (exige
|
|
592
599
|
`team_id`).
|
|
@@ -609,11 +616,11 @@ Use para: "ao ganhar um card de Vendas → criar automaticamente em Pós-Venda n
|
|
|
609
616
|
|
|
610
617
|
`AutomationRule` é o motor geral da conta (mensagens, contatos, conversas, e também eventos Kanban). Bem mais genérico, com sistema completo de condições/ações.
|
|
611
618
|
|
|
612
|
-
Eventos Kanban: `kanban_item_created
|
|
619
|
+
Eventos Kanban: `kanban_item_created` e `kanban_item_stage_changed` (não existe `kanban_item_moved`).
|
|
613
620
|
|
|
614
621
|
```json
|
|
615
622
|
{
|
|
616
|
-
"event_name": "
|
|
623
|
+
"event_name": "kanban_item_stage_changed",
|
|
617
624
|
"conditions": [
|
|
618
625
|
{"attribute_key": "funnel_stage", "operator": "equal_to", "value": "ganho"}
|
|
619
626
|
],
|
|
@@ -638,9 +645,35 @@ Use para: ações cross-cutting que envolvem conversa/contato/label, ou regras c
|
|
|
638
645
|
|
|
639
646
|
## Bulk operations
|
|
640
647
|
|
|
641
|
-
- `POST /api/
|
|
642
|
-
- `POST /api/
|
|
643
|
-
- `GET /api/
|
|
648
|
+
- `POST /api/v1/accounts/{account_id}/bulk_actions` — operações em massa (mover, atribuir, arquivar) — `lionchat_kanban_bulk_bulk_actions`
|
|
649
|
+
- `POST /api/v1/accounts/{account_id}/kanban_items/import` — importar planilha de cards (só pela tela: exige o arquivo)
|
|
650
|
+
- `GET /api/v1/accounts/{account_id}/kanban_items/export` — exportar funil completo — `lionchat_kanban_items_export`
|
|
651
|
+
|
|
652
|
+
### Importar cards com campos personalizados (2026-10-23)
|
|
653
|
+
|
|
654
|
+
A importação de cards (Kanban > botão azul **+** > **Importar itens**) liga colunas da planilha a **campos do card** e a
|
|
655
|
+
**atributos do contato**, no mesmo formato da importação de contatos. O conector não sobe o arquivo, então oriente a
|
|
656
|
+
pessoa a importar pela tela; o que segue serve para explicar o que ela vai ver e para ler o resultado.
|
|
657
|
+
|
|
658
|
+
- **O que pode ser importado** vem da prévia (`lionchat_kanban_items_create_3`, campo `attribute_fields`): campos do card
|
|
659
|
+
da conta (sem nome protegido nem secreto; dois campos com o mesmo nome = vale o primeiro) e atributos do contato (sem os
|
|
660
|
+
do sistema — rastreio, identificadores do WhatsApp — nem secretos). **Atributos do contato só aparecem para quem também
|
|
661
|
+
pode importar contatos** (administrador ou cargo "Exportar e importar contatos").
|
|
662
|
+
- **Como o card grava** (`item_details.custom_attributes`, nasce com o card): data `DD/MM/AAAA` ou `DD/MM/AA` vira
|
|
663
|
+
`AAAA-MM-DD`; número com ou sem milhar (`1.500`, `1.234,56`) vira texto (`"1500"`); hora vira `HH:MM`; campo de LISTA
|
|
664
|
+
aceita várias opções na mesma célula separadas por `;` e só grava opção que existe. Os demais tipos gravam o texto como
|
|
665
|
+
está na planilha.
|
|
666
|
+
- **Contato**: mesma conversão da importação de contatos. Vai só para o **contato principal do card** (numa linha com
|
|
667
|
+
vários contatos). Contato novo nasce com os atributos; contato que **já existe** tem o valor **substituído** — conta como
|
|
668
|
+
alteração (fluxo "Atributo do contato muda", webhook `contact_updated`). Célula vazia nunca apaga.
|
|
669
|
+
- **Resultado** (`lionchat_kanban_items_import_status`): `attributes_applied: true` confirma que os campos foram aplicados;
|
|
670
|
+
`skipped` lista os valores que **não** entraram (`row`, `field`, `message`) e `skipped_count` dá o total. O card nasce
|
|
671
|
+
do mesmo jeito — só aquele valor fica de fora (formato que não converte, opção fora da lista, texto longo demais, ou
|
|
672
|
+
linha sem telefone válido, que não tem contato para receber o atributo). `row` é a linha da planilha (cabeçalho = 1).
|
|
673
|
+
- **Armadilhas**: `422` = escolha de campo com formato errado, campo que não existe mais/é do sistema, ou coluna que a
|
|
674
|
+
planilha não tem (a mensagem lista quais); `403` = atributo de contato sem a permissão de importar contatos. Sem
|
|
675
|
+
`attributes_applied` no resultado de uma importação que ligou campos = o servidor estava sendo atualizado e os cards
|
|
676
|
+
nasceram sem eles (preencher nos cards, ou excluir e importar de novo — reimportar cria cards novos).
|
|
644
677
|
|
|
645
678
|
## Custom attributes em cards — TRÊS LUGARES POSSÍVEIS
|
|
646
679
|
|
|
@@ -743,8 +776,9 @@ A planilha do financeiro (ou de outro sistema) entra e:
|
|
|
743
776
|
|
|
744
777
|
| Situação do card no funil | O que acontece |
|
|
745
778
|
|---|---|
|
|
746
|
-
| Card **aberto** (mais antigo, se houver vários) | Grava o valor e marca **ganho com a DATA DA VENDA** |
|
|
747
|
-
| Card **já ganho**
|
|
779
|
+
| Card **aberto** (mais antigo, se houver vários) | Grava o valor (e os produtos, se vierem) e marca **ganho com a DATA DA VENDA** |
|
|
780
|
+
| Card **já ganho** com o mesmo valor e a mesma data | É a mesma venda: **nada muda** (`ja_ganho`) |
|
|
781
|
+
| Card **já ganho** com outro valor ou outra data | Venda nova: nasce **outro card ganho** (`nova_venda`, só se `criar_sem_card: true`) |
|
|
748
782
|
| Card marcado como **perdido** | **Não é tocado** — vai pra conferência humana |
|
|
749
783
|
| **Sem card nenhum** | Cria card já ganho (só se `criar_sem_card: true`) |
|
|
750
784
|
| Linha com telefone sem DDI, valor ilegível ou data no futuro | Vira **erro da linha**, com motivo |
|
|
@@ -771,6 +805,11 @@ arquivo, aponta as colunas e ainda oferece uma planilha de exemplo pra baixar.
|
|
|
771
805
|
| `email` | não | |
|
|
772
806
|
| `agent` | não | Nome ou e-mail do vendedor |
|
|
773
807
|
| `order_id` | não | Número do pedido, guardado no card |
|
|
808
|
+
| `co_participant` | não | Nome ou e-mail de quem ajudou na venda |
|
|
809
|
+
| `products` | não | TEXTO `"Plano Pro:1200; Instalação:300"` (até 20). Troca os produtos do card e o valor vira a soma; com ele, `value` pode ir vazio. Lista ou objeto é recusado |
|
|
810
|
+
|
|
811
|
+
Card **ganho nunca é editado** (regra de 30/10/2026). Produto que não está no catálogo da conta entra só no
|
|
812
|
+
card (aviso na conferência). A conferência devolve, por linha, `produtos` e `avisos`.
|
|
774
813
|
|
|
775
814
|
### O que você PRECISA saber antes de aplicar
|
|
776
815
|
|
|
@@ -781,8 +820,8 @@ arquivo, aponta as colunas e ainda oferece uma planilha de exemplo pra baixar.
|
|
|
781
820
|
- **A conciliação não dispara conversão por conta própria.** Quem dispara é o caminho normal do ganho
|
|
782
821
|
(Meta/GA4/Google Ads), e só nos funis com o evento de Ganho configurado. Por isso rodar a mesma
|
|
783
822
|
planilha duas vezes não reenvia conversão: o identificador do evento de ganho é estável.
|
|
784
|
-
- **Rodar a mesma planilha duas vezes é seguro**:
|
|
785
|
-
|
|
823
|
+
- **Rodar a mesma planilha duas vezes é seguro**: a venda já registrada (mesmo valor e mesma data) volta
|
|
824
|
+
como `ja_ganho`/`sem_mudanca` e nada é gravado.
|
|
786
825
|
- **`criar_sem_card: true` abre uma CONVERSA nova por card criado**, e conversa nova acorda o que a conta
|
|
787
826
|
tiver em "Conversa criada" (automação, fluxo, notificação). Avise a pessoa antes de ligar isso numa
|
|
788
827
|
planilha grande.
|
|
@@ -856,6 +895,16 @@ data marcada, **abre sozinho** e volta para a coluna (disparando o fluxo "Card a
|
|
|
856
895
|
sem card no funil, tempo inválido) — nunca passa verde sem adiar.
|
|
857
896
|
- Fluxo: ação `snooze_kanban_item`, gatilhos `card_opened` ("Card aberto") e `card_snoozed` ("Card adiado") e
|
|
858
897
|
condição `kanban_snoozed`. Ver o resource do FlowBuilder.
|
|
898
|
+
- Fluxo, **card parado (NOVO 28/10/2026)**: gatilhos de prazo `card_open_in_stage` ("Card aberto na etapa") e
|
|
899
|
+
`card_open_in_funnel` ("Card aberto no funil"). Config `{ "funnel_ids": ["12"], "funnel_stages": ["12:novo_lead"],
|
|
900
|
+
"duration_value": 1, "duration_unit": "hours" }` (`funnel_stages` só na etapa; vazio = qualquer funil/etapa;
|
|
901
|
+
`minutes`|`hours`|`days`, de 15 minutos a 365 dias). Relógio da etapa = tempo desde que o card ENTROU na etapa atual
|
|
902
|
+
(o segundo número "1d" do card; trocar de funil também recomeça); do funil = idade do card (o primeiro número "2d";
|
|
903
|
+
trocar de funil não recomeça). Conta card aberto ou adiado, nunca ganho/perdido. Dispara uma vez por entrada na etapa
|
|
904
|
+
(etapa) ou uma vez por card (funil), só para quem cruza o prazo com o fluxo ligado (card que já passou do prazo ao ligar
|
|
905
|
+
não dispara; mudar prazo/etapa/funil do gatilho = gatilho novo). Conferência de 5 em 5 minutos (pode chegar ~5 min
|
|
906
|
+
depois). Inicia só o fluxo dono do gatilho, em cada conversa do card; o card que disparou é o "card do gatilho"
|
|
907
|
+
(`card_source: 'trigger'`, condições "Card na etapa" e "Card adiado"). Dois fluxos iguais na mesma caixa disparam os dois.
|
|
859
908
|
|
|
860
909
|
**Onde o adiado aparece e como filtrar:**
|
|
861
910
|
|
|
@@ -901,3 +950,68 @@ depois não trava outro salvamento.
|
|
|
901
950
|
`co_participant_changed` (antes e depois, com nome e quem marcou).
|
|
902
951
|
- Números: `coParticipantRanking`, `sharedSalesSummary`/`sharedSalesBySeller` (com `include_shared_sales=true`) no
|
|
903
952
|
relatório agregado e a lista `lionchat_kanban_items_shared_sales` — ver `lionchat://docs/filtros-e-relatorios` §4.
|
|
953
|
+
|
|
954
|
+
---
|
|
955
|
+
|
|
956
|
+
## Analisar com IA — a IA sugere o que mudar nos cards (2026-10-28)
|
|
957
|
+
|
|
958
|
+
A mesma análise do botão **Analisar com IA** do Kanban (topo do quadro e menu da coluna). A IA lê os cards **abertos e
|
|
959
|
+
adiados** das etapas escolhidas de UM funil, com as conversas deles, e sugere: mudar de etapa (também para trás), levar
|
|
960
|
+
para outro funil, pôr/tirar etiqueta e marcar ganho/perdido. **Nada muda sem aplicar, e aplicar não tem como desfazer.**
|
|
961
|
+
|
|
962
|
+
### Ferramentas
|
|
963
|
+
|
|
964
|
+
1. `lionchat_kanban_ai_analyses_setup` — o que a janela mostra: etapas com a contagem de cards, se cada etapa e o funil
|
|
965
|
+
têm descrição, `selection` (quantos cards entram e `estimated_cost_usd`), funis de destino, etiquetas, motivos de
|
|
966
|
+
ganho/perda, `has_openai_key` e `latest_run` (análise viva do funil).
|
|
967
|
+
2. `lionchat_kanban_ai_analyses_create` — cria a análise. Os cards são escolhidos AQUI: até `filters.limit` (1 a 1.000,
|
|
968
|
+
padrão 200), os parados há mais tempo, PULANDO os que a IA leu nos últimos 7 dias (a não ser que o cliente tenha
|
|
969
|
+
escrito depois); `filters.include_read: true` lê de novo os já lidos.
|
|
970
|
+
3. `lionchat_kanban_ai_analyses_show` — andamento (`status`, contadores, custo).
|
|
971
|
+
4. `lionchat_kanban_ai_analyses_items` — a lista de sugestões (só depois de `ready`). Com `no_change: true` traz também
|
|
972
|
+
`no_change_items`: os cards que a IA leu e deixou como estão, cada um com `lines` dizendo o porquê.
|
|
973
|
+
5. `lionchat_kanban_ai_analyses_apply` — aplica o que o usuário escolheu. Pede `confirm: true`.
|
|
974
|
+
6. `lionchat_kanban_ai_analyses_reanalyze` — analisa de novo UM card cuja linha travou.
|
|
975
|
+
|
|
976
|
+
### Passo a passo
|
|
977
|
+
|
|
978
|
+
1. `setup` com `funnel_id` (e `stages` para saber o total e o custo). Mostre ao usuário as etapas e quantos cards cada
|
|
979
|
+
uma tem. Dica: marcar VÁRIAS etapas numa análise só evita ler a mesma conversa duas vezes.
|
|
980
|
+
2. Pergunte o que a IA pode fazer (`options`), quais cards (todos, `stale_days` ou `no_reply_days`) e QUANTOS
|
|
981
|
+
(`filters.limit`, 1 a 1.000; mostre o `estimated_cost_usd` e o `estimated_minutes` do `setup` com o mesmo número). Se o
|
|
982
|
+
`setup` disser `already_read` > 0, avise que esses serão pulados; para repetir nos mesmos cards, `include_read: true`.
|
|
983
|
+
3. `create`. Depois chame `show` a cada 5 a 10 segundos até `status = ready` (ou `failed`, com `error_code`).
|
|
984
|
+
4. `items`: mostre as sugestões agrupadas por etapa — card, ação, força ("Alta" >= 70%, "Média" 50-70%), motivo e o que
|
|
985
|
+
a ação dispara (`hints`: conversão, regras do funil, fluxos; aviso de WhatsApp QR).
|
|
986
|
+
5. **Antes de aplicar, confirme com o usuário** quais cards e ações, quantas mudanças em quantos cards, e diga que **não
|
|
987
|
+
tem como desfazer**: fica como se uma pessoa tivesse feito à mão, e automações, fluxos e conversões do funil disparam.
|
|
988
|
+
6. `apply` com `items: [{ item_id, actions: [ids] }]` e `confirm: true`. Os `actions` são os `id` das `suggestions`
|
|
989
|
+
daquele item (`stage`, `funnel`, `outcome`, `label_add:...`, `label_remove:...`) — nunca invente: ação que não foi
|
|
990
|
+
sugerida para o item volta em `ignored`.
|
|
991
|
+
7. `show` até `status = finished`; `items` traz `done`, `apply_code` e `return_code` de cada card.
|
|
992
|
+
8. **"Por que a IA não mudou nada?"** — chame `items` com `no_change: true` e explique pelos `no_change_items[].lines`:
|
|
993
|
+
`kind` (`stage`, `funnel`, `outcome`, `label`) + `state`: `same` = confirmou o que já está (com `confidence` em %),
|
|
994
|
+
`doubt` = as duas ordens discordaram (`value` x `other_value`), `weak` = pensou em `value` mas abaixo de 50%,
|
|
995
|
+
`other_funnel` = achou que o card é de outro funil (anulou a etapa), `not_chosen` = sugeriu um funil que não estava
|
|
996
|
+
entre os destinos, `add_no` / `remove_keeps` = etiqueta com a chance (`probability`). `lines: null` = análise antiga,
|
|
997
|
+
sem detalhes.
|
|
998
|
+
|
|
999
|
+
### Regras que você PRECISA saber
|
|
1000
|
+
|
|
1001
|
+
- **Quem pode:** administrador ou cargo com a permissão `kanban_ai_analyze` ("Analisar funil com IA"), com o recurso de
|
|
1002
|
+
plano `kanban_ai_analysis` ligado na conta e o menu do Kanban visível. Funil que a pessoa não vê = 404
|
|
1003
|
+
`funnel_not_visible`. Sem o recurso = `feature_disabled`.
|
|
1004
|
+
- **Custo:** usa a chave da OpenAI DA CONTA (`no_openai_key` sem ela). Costuma ficar abaixo de um centavo de dólar a cada
|
|
1005
|
+
dezenas de cards — mostre o `estimated_cost_usd` do `setup` antes de criar.
|
|
1006
|
+
- **Uma análise por vez por funil** (`funnel_busy`, 409) e no máximo duas rodando por conta (`account_busy`). Criar uma
|
|
1007
|
+
análise nova **substitui a lista anterior** do mesmo funil que tiver etapa em comum (ela vira `superseded`).
|
|
1008
|
+
- **A lista vale 24 horas** (`expires_at`); depois vira `expired` e é preciso analisar de novo.
|
|
1009
|
+
- **O que vem marcado** (`checked: true`): sugestões de força Alta de etapa, funil e perdido. Ganho, Média e etiqueta vêm
|
|
1010
|
+
sempre desmarcados, com o motivo em `unchecked_reason`. Na dúvida, proponha aplicar só as marcadas.
|
|
1011
|
+
- **Linha travada** (`locked`: `client_wrote` = o cliente escreveu depois da análise; `card_changed` = o card mudou):
|
|
1012
|
+
não aplique. Chame `reanalyze` com o `item_id` e depois `items` de novo.
|
|
1013
|
+
- **Linha que voltou** (`return_code`): `interrupted` (sistema reiniciou), `card_busy` e `apply_failed` podem ser
|
|
1014
|
+
aplicadas de novo; `agent_no_access` (o responsável não acessa o funil de destino) exige dar o acesso antes.
|
|
1015
|
+
- **"Por que não sugeriu nada?"** A IA só sugere quando responde a mesma coisa com as opções em duas ordens e com pelo
|
|
1016
|
+
menos 50% de certeza. Card sem conversa, ou com pouca conversa, costuma ficar como está (`counts.no_change`). Escrever
|
|
1017
|
+
a descrição das etapas e do funil melhora o resultado (o `setup` diz quais não têm).
|