Automações em fluxo
A página Automações (menu lateral) é o lugar para automações que precisam de mais do que uma lista de ações: condições (siga um caminho ou outro), código (transforme dados no meio do fluxo) e reuso (a mesma automação em vários workflows).
Você monta o fluxo num canvas de nós, no mesmo estilo do editor de workflows: cada nó é um passo, e as conexões dizem o caminho que a execução segue.
- Aba Ações do botão (Automações): sequências simples, de cima para baixo. Cobre a maioria dos casos.
- Automações em fluxo (esta página): quando você precisa de Se (condição), Código, ou quer uma automação compartilhada por vários workflows.
Uma automação criada no botão pode ser aberta no canvas a qualquer momento — mas o caminho é de ida: depois de salva como fluxo, ela passa a ser editada só pelo canvas (a aba do botão mostra ela como somente-leitura, com um link "Abrir em Automações").
Automações têm identidade própria
Cada automação é um registro independente, referenciado pelos botões por id. Isso muda duas coisas importantes:
- Reuso: o mesmo fluxo pode ser usado por botões de workflows diferentes.
- Propagação imediata: ao salvar uma automação, todas as páginas publicadas que a usam passam a executar a versão nova — sem republicar o workflow.
Não existe "rascunho" de automação: o que você salva é o que as páginas publicadas executam no próximo clique. Use o teste (abaixo) para validar antes de salvar — ele roda o estado atual do canvas mesmo sem salvar, feito exatamente para isso.
O canvas
- Paleta (lado esquerdo): clique para adicionar Ação, Se (condição) ou Código. O nó Início já vem criado — todo fluxo tem exatamente um.
- Conectar: arraste da bolinha de saída de um nó até a bolinha de entrada do próximo. Cada saída aceita uma conexão — conectar de novo substitui a anterior. Um nó pode receber várias conexões (caminhos que se reencontram).
- Configurar: clique num nó e o painel de configuração abre à direita. O campo Nome do nó muda o rótulo no canvas — nomeie tudo, seu eu-do-futuro agradece.
- Barra de ferramentas: salvar (
Ctrl+Stambém funciona), zoom, organizar automaticamente, ▶ testar, duplicar, excluir, exportar e importar (arquivo JSON — ótimo para backup ou para copiar um fluxo entre ambientes). - Onde o fluxo termina? Simples: quando um nó não tem conexão de saída (ou o Se segue por uma saída sem conexão), a execução termina ali, com sucesso.
O nó Se (condição)
O modo padrão é o de dois valores e um operador:
| Campo | Exemplo |
|---|---|
| Valor 1 | {{ $form.Status }} |
| Operador | é igual a |
| Valor 2 | aprovado |
Os dois valores aceitam texto fixo ou expressões — cada lado é resolvido primeiro e a comparação acontece depois. O resultado escolhe a saída: true (verde) ou false (vermelha).
Operadores disponíveis: é igual a, é diferente de, contém, está vazio, não está vazio, é maior que, é menor que.
Detalhes que evitam surpresas:
- Números são comparados como números: se os dois lados parecem numéricos,
10 é maior que 9é verdadeiro (e0050 é igual a 50também). Se qualquer lado não for numérico, a comparação é de texto. - Maiúsculas importam:
Simnão é igual asim. - Está vazio / não está vazio olham só o Valor 1 (o Valor 2 some do painel).
Modo avançado (expressão)
Marcando Modo avançado, o nó avalia uma expressão única: resultado truthy segue
pela saída true; vazio, false ou 0 seguem pela false.
Escreva {{ $form.Status == 'sim' }} — nunca {{ $form.Status }} == 'sim'.
Tudo que fica fora de {{ }} é texto literal. Na segunda forma o resultado é o
texto sim == 'sim', que nunca está vazio — ou seja, a condição dá sempre
verdadeiro, não importa o que o usuário digitou. Esse é o erro mais comum do modo
avançado; o modo padrão de dois valores não tem esse risco.
O nó Código
Roda JavaScript no navegador de quem está usando a página (como o componente de
HTML personalizado). O script recebe um objeto ctx:
// ctx.form → respostas do formulário (por rótulo do campo)
// ctx.args → parâmetros da URL ($args)
// ctx.user → dados do usuário ($user)
// ctx.responses → respostas dos nós anteriores
const qtd = Number(ctx.form.Quantidade);
return { total: qtd * 10, aprovado: qtd > 5 };
O objeto retornado vira a saída do nó: os próximos nós acessam com
{{ $form.<id-do-nó>.total }} — inclusive um Se logo depois. Se o script lançar um
erro (ou retornar algo que não dá para serializar, como referências circulares), o nó
falha e o fluxo para ali, com o nó marcado em vermelho.
Usando a resposta de um nó nos seguintes
Depois que um nó de Ação ou Código roda, os próximos nós podem referenciar o resultado em qualquer campo que aceite expressões — URL, corpo, cabeçalhos, condições do Se e até as mensagens de sucesso/erro:
{{ $form.<id-do-nó>.statusCode }}— código HTTP da resposta{{ $form.<id-do-nó>.body.caminho.do.campo }}— corpo (JSON navegável)
Onde descubro o id do nó? Do jeito fácil: rode um teste e expanda a linha do nó no log — o id aparece ali junto com a resposta completa, que também mostra o caminho exato de cada campo. (O id também está no arquivo exportado da automação.)
Erros: o fluxo continua (e é aí que mora o poder)
Numa automação de botão (lista simples), uma ação que falha interrompe a sequência — não há como reagir. No fluxo é diferente:
- A API respondeu com erro (por exemplo, HTTP 500): o toast de erro aparece (se
configurado) e o fluxo continua pela saída normal. Coloque um Se olhando
{{ $form.<id-do-nó>.statusCode }}logo depois e trate o erro no caminhofalse— exatamente o padrão que antes exigia exportar para o n8n. - A chamada nem completou (rede fora, erro de script): o fluxo para ali, com o nó marcado em vermelho.
Testando sem sair do canvas
O botão ▶ da barra abre o painel Testar automação:
- Preencha os campos do formulário (
$form) e os argumentos ($args) que as suas expressões usam. As chaves vão sem o prefixo$form.(para{{ $form.Status }}, a chave éStatus) — e maiúsculas importam. - Opcional: em Simular contexto de workflow, escolha um workflow para pré-preencher as chaves com os campos dele. Trocar de workflow troca as chaves; as que você adicionou à mão ficam.
- Executar: os nós acendem no canvas, o caminho percorrido fica verde, e o log
mostra cada passo — com a comparação do Se resolvida (ex.:
"90" é maior que "50") e as respostas completas para expandir.
Para iterar, é só mudar um valor e clicar Executar de novo — dá até para editar um nó com o painel de teste aberto e re-executar na hora, sem salvar.
Requisições HTTP e ações de atividade são executadas de fato durante o teste — apenas Enviar e Navegar são ignorados (não há página para enviar). Cuidado com APIs que criam registros reais.
Na prática: um fluxo de aprovação completo
Vamos montar, do zero, o clássico "criar um pedido e, dependendo do resultado, criar a
fatura ou descartar". Usaremos a API de eco https://httpbin.org/anything — ela devolve
exatamente o que recebeu, perfeita para praticar.
- Automações → criar nova. Dê o nome
Aprovação de pedido. - Pela paleta, adicione: uma Ação, um Código, um Se (condição) e mais duas Ações. Conecte: Início → Ação → Código → Se; da saída true do Se para uma Ação, da false para a outra.
- Primeira Ação (nomeie
Criar pedido): tipo Requisição HTTP, método POST, URLhttps://httpbin.org/anything, corpo:{ "produto": "{{ $form.Produto }}", "qtd": "{{ $form.Quantidade }}" } - Código (nomeie
Calcular total):return { total: Number(ctx.form.Quantidade) * 10 }; - Teste rápido para pegar os ids: clique ▶, adicione as chaves
Produto=tecladoeQuantidade=9, Executar. Expanda as linhas do log e anote o id do nóCriar pedidoe o doCalcular total. - Se (nomeie
Aprovado?): Valor 1{{ $form.<id-do-Calcular-total>.total }}, operador é maior que, Valor 250. - Ação do true (nomeie
Criar fatura): POST emhttps://httpbin.org/anything, corpo usando dados dos nós anteriores:Marque Mostrar notificação de sucesso com a mensagem{ "fatura": "{{ $form.<id-do-Criar-pedido>.body.json.produto }}", "valor": "{{ $form.<id-do-Calcular-total>.total }}" }Fatura {{ $form.<id-do-Criar-pedido>.body.json.produto }} criada!. - Ação do false (nomeie
Descartar): qualquer chamada — ou só um toast de erroPedido abaixo do mínimo. - Teste os dois caminhos:
Quantidade=9→ caminho verde pelo true, toast "Fatura teclado criada!" (repare no log: o corpo enviado pelaCriar faturamostra os valores já substituídos — dados do primeiro nó fluindo para o segundo). DepoisQuantidade=3→ false,Descartarroda,Criar faturanem acende. - Salve. Para usar num workflow: adicione um Botão na página, e na aba Ações dele escolha esta automação. Publicou? Qualquer ajuste futuro no fluxo vale na página publicada no clique seguinte — sem republicar.
Receitas
Tratar a falha de uma API
Ação HTTP (com toast de erro configurado) → Se: {{ $form.<id>.statusCode }}
é igual a 200 → true: continua o fluxo normal; false: um toast explicando, ou
uma chamada alternativa. A falha vira um caminho, não um beco.
Encadear criações (a resposta de A dentro de B)
Ação A cria o registro → os nós seguintes usam {{ $form.<id-de-A>.body.<campo> }} no
corpo, na URL ou na mensagem. O log de teste mostra o corpo já resolvido — é a
prova visual de que o encadeamento funcionou.
Uma automação, vários workflows
Crie o fluxo uma vez (ex.: "Registrar aprovação"), aponte botões de vários workflows para ele e pronto: um único lugar para evoluir a regra. Combine com Simular contexto de workflow no teste para validar contra os campos de cada workflow que a usa.
Solução de problemas
| Sintoma | Causa provável | Correção |
|---|---|---|
| O Se sempre cai no verdadeiro | Modo avançado com texto fora das chaves ({{ $form.X }} == 'y') | Comparação inteira dentro: {{ $form.X == 'y' }} — ou use o modo padrão |
| O valor do campo "não chega" | Chave do teste diferente da expressão (maiúsculas, acentos, prefixo) | A chave é o rótulo sanitizado, sem $form. — confira no log expandido |
Toast mostra {{ ... }} literal | O caminho da expressão não existe naquela execução | Expanda a resposta no log e copie o caminho real do campo |
{{ $form.Campo? }} não resolve | ? (e outros símbolos) não fazem parte de nomes | Renomeie a chave, ou use {{ $form["Campo?"] }} |
| Nó aparece "ignorada no teste" | Enviar/Navegar não rodam no teste (não há página) | Comportamento esperado — eles rodam na página publicada |
| Fluxo para num nó de Código | Script lançou erro ou retornou algo não-serializável | Veja o detalhe do erro no log; retorne objetos simples |
| Comparação numérica "errada" | Um dos lados não é numérico → comparação de texto | Garanta números dos dois lados (ex.: com um nó de Código) |
| Testei ok, publicado não | Esqueceu de salvar (o teste roda o canvas, não o salvo) | Salve — a página publicada usa a última versão salva |
Boas práticas
- Nomeie os nós: o log de teste e o canvas ficam legíveis.
- Teste os dois caminhos de cada Se antes de salvar — o painel torna isso um clique.
- Prefira o modo padrão do Se; deixe o modo avançado para quem já domina expressões.
- Automações compartilhadas merecem nomes claros: quem edita uma automação está editando todos os lugares que a usam.
- Exporte fluxos importantes de vez em quando — é um backup de um clique.