O fluxo do chatbot é montado com nós conectados por setas. Cada nó faz uma coisa específica — manda mensagem, pergunta algo, decide caminho, executa ação. O Syncro tem 7 tipos de nós. Esse artigo explica cada um, com config, quando usar e exemplos práticos.
Pré-requisitos
- Fluxo criado. Veja Criar fluxo de chatbot.
- Acesso ao builder visual (
/chatbot/fluxos/{flow}/editar).
Adicionar e conectar nós
- Sidebar esquerda mostra paleta de tipos.
- Arraste o tipo desejado pro canvas.
- Clique no nó pra configurar (painel direito).
- Conecte:
- Source handle (bolinha à direita do nó).
- Arraste pra target handle (bolinha à esquerda do próximo nó).
- Salve com Salvar fluxo (canto superior direito).
1. Mensagem (message)
O que faz
Envia uma mensagem pro cliente. Pode ser texto, imagem ou áudio. Após enviar, segue pro próximo nó automaticamente.
Quando usar
- Boas-vindas: "Olá! 👋 Como posso ajudar?".
- Confirmação após coleta: "Recebi seus dados, {{nome}}. Em breve te ligamos.".
- Apresentar opções: "Posso te ajudar com 1) Preços 2) Suporte 3) Agendamento".
- Enviar mídia: imagem do produto, áudio explicativo.
Configuração
{
"text": "Olá {{nome}}! Bem-vindo ao Syncro. 👋",
"image_url": "https://exemplo.com/banner.jpg",
"audio_url": null
}
- Texto (opcional): suporta interpolação de variáveis (
{{nome}},{{$contact_name}}). - Imagem URL (opcional): link público pra imagem (PNG/JPG/WebP).
- Áudio URL (WhatsApp only): link de arquivo.ogg/.mp3.
Comportamento por canal
- WhatsApp: envia tudo (texto + imagem com legenda + áudio separado).
- Instagram: texto + imagem (áudio não suportado).
- Website: texto + imagem inline.
💡 Dica: cada mensagem tem delay de 3 segundos antes da próxima — simula digitação humana. Cliente percebe o bot como mais natural.
2. Input — Pergunta (input)
O que faz
Pergunta algo, espera resposta do cliente, e direciona pro nó certo conforme a resposta. É o nó central de qualquer fluxo interativo.
Quando usar
- Capturar nome, e-mail, telefone.
- Menu de opções (1, 2, 3 ou A, B, C).
- Triagem (Vendas / Suporte / Outro).
- Escolha de produto, horário, plano.
Configuração
{
"text": "Qual seu nome?",
"save_to": "nome",
"branches": [
{
"label": "Sim, quero",
"keywords": ["sim", "quero", "yes"],
"handle": "branch_0"
},
{
"label": "Não, obrigado",
"keywords": ["não", "nao", "no"],
"handle": "branch_1"
}
],
"default_branch": { "steps": [...] }
}
- Texto da pergunta (obrigatório): o que o bot pergunta.
- Salvar resposta em (
save_to) (opcional): nome de variável (sem$). Resposta livre fica salva pra usar depois (ex:{{nome}}). - Branches (opcional): lista de opções com:
- Label (max 24 chars): texto visível pro cliente (ex: "Sim, quero").
- Keywords: array de palavras que matcham essa branch (case-insensitive).
- Default branch: caminho se nenhuma keyword bater (resposta livre).
Comportamento por canal
| Canal | Renderização |
|---|---|
Lista interativa (sendList) — cliente vê dropdown com opções clicáveis |
|
| Quick Replies — botões de resposta rápida | |
| Website | Texto + botões inline |
Exemplos práticos
Pergunta livre (capturar nome)
{
"text": "Qual seu nome?",
"save_to": "nome",
"branches":,
"default_branch": { "next": "node_5" }
}
Cliente responde "João Silva" → vira {{nome}} → próximo nó usa: "Prazer, {{nome}}!".
Menu de opções
{
"text": "Como posso te ajudar?",
"branches": [
{ "label": "Preços", "keywords": ["1", "preço", "preco"], "handle": "branch_0" },
{ "label": "Suporte", "keywords": ["2", "suporte", "ajuda"], "handle": "branch_1" },
{ "label": "Agendamento", "keywords": ["3", "agendar"], "handle": "branch_2" }
],
"default_branch": { "next": "node_fallback" }
}
⚠️ Atenção: se input tem branches mas o texto está vazio, sistema gera default "Escolha uma opção:" — pra não silenciar o cliente.
3. Condição (condition)
O que faz
Avalia o valor de uma variável e direciona pra branch correspondente. Diferente de input (que pergunta), condition decide baseado em dado já coletado.
Quando usar
- Direcionar baseado em resposta anterior (já capturada).
- Lógica de qualificação: "Se receita > 100k → vendedor sênior. Senão → SDR."
- Branching baseado em variável de sistema (ex: lead já existe? está em qual etapa?).
Configuração
{
"variable": "interesse",
"conditions": [
{ "operator": "equals", "value": "comprar", "handle": "branch_0" },
{ "operator": "contains", "value": "info", "handle": "branch_1" },
{ "operator": "gt", "value": "1000", "handle": "branch_2" }
],
"default_branch": { "next": "node_default" }
}
- Variável (obrigatório): nome da variável a avaliar (com ou sem
$). - Condições: lista, primeiro match ganha:
- Operador:
equals,not_equals,contains,starts_with,ends_with,gt(maior que),lt(menor que). - Valor: o que comparar.
- Handle: pra qual branch ir.
- Default branch: se nenhum match.
Operadores
| Operador | Descrição | Ex |
|---|---|---|
equals |
É igual a | nome == 'João' |
not_equals |
É diferente de | país != 'BR' |
contains |
Contém | mensagem contém 'urgente' |
starts_with |
Começa com | tel começa com '+55' |
ends_with |
Termina com | email termina com '@gmail.com' |
gt |
Maior que (numérico) | valor > 1000 |
lt |
Menor que (numérico) | idade < 18 |
Exemplos práticos
Direcionar por interesse
Cliente capturou {{interesse}} = "comprar" no input anterior.
Condition: se interesse equals "comprar" → manda pra vendedor.
se interesse contains "info" → manda material.
senão → fallback FAQ.
Triagem por valor
Variável: $lead_value (pré-existente do CRM).
Se gt 5000 → conta enterprise → notifica gerente.
Se lt 5000 → fluxo SDR padrão.
4. Ação (action)
O que faz
Executa uma ação no CRM. Não envia mensagem — modifica estado do lead/conversa.
Quando usar
- Mover lead pra etapa do funil.
- Adicionar/remover tag.
- Transferir pra humano.
- Transferir pra agente IA.
- Salvar variável customizada.
- Disparar webhook externo.
- Preencher custom field.
Tipos de ação (12 disponíveis)
| Tipo | O que faz | Campos |
|---|---|---|
change_stage |
Move lead pra etapa | stage_id |
add_tag |
Adiciona tag | value (nome da tag) |
remove_tag |
Remove tag | value |
assign_human |
Transfere pra atendente | user_id |
assign_ai_agent |
Transfere pra IA | agent_id (ver artigo dedicado) |
close_conversation |
Fecha conversa | — |
save_variable |
Salva variável de sessão | variable, value |
send_webhook |
Faz HTTP request | method, url, body, headers, save_response_to |
set_custom_field |
Preenche custom field do lead | field_name, value |
send_whatsapp |
Envia WhatsApp pra outro contato | phone_mode, custom_phone, message |
create_task |
Cria task vinculada ao lead | subject, description, priority, due_date_offset |
create_lead |
Cria lead se não existe | — |
Exemplos práticos
Qualificar lead com tag
Após cliente confirmar interesse:
{ "type": "add_tag", "value": "interessado-curso" }
Mover pra "Negociação" no funil
Após cliente fornecer dados completos:
{ "type": "change_stage", "stage_id": 5 }
Transferir pra suporte (humano)
Após cliente reportar bug:
{ "type": "assign_human", "user_id": 12 }
Bot encerra. Atendente recebe a conversa atribuída.
Webhook pra sistema externo
Notificar Slack quando lead se inscreve:
{
"type": "send_webhook",
"method": "POST",
"url": "https://hooks.slack.com/services/...",
"body": "{\"text\": \"Novo lead: {{nome}} ({{email}})\"}",
"headers": { "Content-Type": "application/json" }
}
💡 Dica: ações não param o fluxo automaticamente — após executar, vai pro próximo nó. Exceção:
assign_humaneassign_ai_agentterminam o fluxo (cliente passa pra humano/IA).
5. Aguardar (delay)
O que faz
Pausa o fluxo por N segundos antes de continuar.
Quando usar
- Esperar entre 2 mensagens longas (não despeja tudo de uma vez).
- Dar tempo de cliente ler antes da próxima pergunta.
- Aguardar processamento (ex: webhook async — em casos raros).
Configuração
{ "seconds": 5 }
- Range: 1-30 segundos.
- Valor fora do range é clamped (1 vira 1, 60 vira 30).
Exemplo
Mensagem: "Estou consultando seu pedido..."
↓ Delay 3s
Mensagem: "Pronto! Encontrei aqui."
💡 Dica: por padrão, mensagens já têm 3s de delay automático entre si. Use
delaysó pra pausas longas (5s+) ou efeito de "estou pensando".
6. Cards (cards) (Website only)
O que faz
Renderiza um carrossel horizontal de cards com imagem, título, descrição e botão. Só funciona no Website widget.
Quando usar
- Catálogo de produtos.
- Lista de planos/pacotes.
- Galeria de portfólio.
- Opções com mídia visual.
Configuração
{
"items": [
{
"title": "Plano Growth",
"description": "Pra times de 5-20",
"image_url": "https://...",
"button_text": "Quero saber mais",
"button_url": "https://syncro.chat/pro"
},
{
"title": "Plano Scale",
"description": "Pra grandes operações",
"image_url": "https://...",
"button_text": "Falar com vendas",
"button_url": null
}
]
}
- Items: array de cards.
- Título + descrição + imagem URL.
- Texto do botão + URL (se vazio, botão clica = continua fluxo no próximo nó).
⚠️ Atenção: WhatsApp e Instagram não suportam cards — esse nó só faz sentido em fluxos canal=
website.
7. Fim (end)
O que faz
Encerra o fluxo. Envia mensagem final (opcional), incrementa completions_count (analytics), e limpa o estado da conversa.
Quando usar
- Final natural após cliente concluir tarefa (agendou, comprou, etc).
- Fim de fluxo de FAQ ("Espero ter ajudado!").
- Após transferência implícita (ex: cliente disse "tchau").
Configuração
{ "text": "Obrigado por usar nosso atendimento! 👋" }
- Texto (opcional): mensagem final.
Comportamento
- Envia mensagem (se configurada).
- Limpa
chatbot_node_idechatbot_variablesda conversa. - Incrementa
completions_countdo fluxo (visível na lista de fluxos). - Mantém
chatbot_flow_id(pra analytics — saber qual fluxo o cliente terminou).
💡 Dica: cada fluxo deve ter pelo menos 1 nó End. Sem End, fluxo fica em loop ou trava em input esperando resposta.
Conectar nós (edges)
Handles
- Target handle (esquerda): entrada do nó.
- Source handle (direita): saída.
Nós com branches (input, condition) têm vários sources:
default— fallback.branch_0,branch_1, … — uma por opção.
Como conectar
- Clique e segure no source handle de um nó.
- Arraste até target handle do próximo.
- Solte. Seta criada.
Restrições
- 1 source por edge — você não pode 2 sources apontando pra mesmo target sem isso.
- Não pode ciclar sem terminar — sistema bloqueia loop infinito (max 30 iterações).
Validação no save
Antes de salvar, sistema valida:
- ✅ Pelo menos 1 nó start (
is_start=true). - ✅ Cada input/condition tem
default_branch(pra fallback). - ✅ Cada action tem campos obrigatórios (ex:
agent_idem assign_ai_agent). - ✅ Edges válidas (source/target existem).
Se falha, erro vermelho aparece no canto superior. Corrija e salve novamente.
Próximos passos
- Pra entender variáveis usadas nos nós, veja Variáveis no fluxo.
- Pra testar antes de publicar, veja Testar fluxo.
- Pra transferir pra IA, veja Transferir para Agente IA.