Pular para o conteúdo principal

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.

Quando usar cada caminho
  • 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.
Salvar = publicar

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+S també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:

CampoExemplo
Valor 1{{ $form.Status }}
Operadoré igual a
Valor 2aprovado

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 (e 0050 é igual a 50 também). Se qualquer lado não for numérico, a comparação é de texto.
  • Maiúsculas importam: Sim não é igual a sim.
  • 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.

A comparação inteira vai DENTRO das chaves

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 caminho false — 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:

  1. 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.
  2. 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.
  3. 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.

O teste executa de verdade

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.

  1. Automações → criar nova. Dê o nome Aprovação de pedido.
  2. 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.
  3. Primeira Ação (nomeie Criar pedido): tipo Requisição HTTP, método POST, URL https://httpbin.org/anything, corpo:
    { "produto": "{{ $form.Produto }}", "qtd": "{{ $form.Quantidade }}" }
  4. Código (nomeie Calcular total):
    return { total: Number(ctx.form.Quantidade) * 10 };
  5. Teste rápido para pegar os ids: clique , adicione as chaves Produto = teclado e Quantidade = 9, Executar. Expanda as linhas do log e anote o id do nó Criar pedido e o do Calcular total.
  6. Se (nomeie Aprovado?): Valor 1 {{ $form.<id-do-Calcular-total>.total }}, operador é maior que, Valor 2 50.
  7. Ação do true (nomeie Criar fatura): POST em https://httpbin.org/anything, corpo usando dados dos nós anteriores:
    { "fatura": "{{ $form.<id-do-Criar-pedido>.body.json.produto }}", "valor": "{{ $form.<id-do-Calcular-total>.total }}" }
    Marque Mostrar notificação de sucesso com a mensagem Fatura {{ $form.<id-do-Criar-pedido>.body.json.produto }} criada!.
  8. Ação do false (nomeie Descartar): qualquer chamada — ou só um toast de erro Pedido abaixo do mínimo.
  9. Teste os dois caminhos: Quantidade = 9 → caminho verde pelo true, toast "Fatura teclado criada!" (repare no log: o corpo enviado pela Criar fatura mostra os valores já substituídos — dados do primeiro nó fluindo para o segundo). Depois Quantidade = 3false, Descartar roda, Criar fatura nem acende.
  10. 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 200true: 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

SintomaCausa provávelCorreção
O Se sempre cai no verdadeiroModo 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 {{ ... }} literalO caminho da expressão não existe naquela execuçãoExpanda 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 nomesRenomeie 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ódigoScript lançou erro ou retornou algo não-serializávelVeja o detalhe do erro no log; retorne objetos simples
Comparação numérica "errada"Um dos lados não é numérico → comparação de textoGaranta números dos dois lados (ex.: com um nó de Código)
Testei ok, publicado nãoEsqueceu 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.