Expressão no n8n é um trecho entre chaves duplas que troca um valor fixo por um dado que veio do node anterior. A forma mais usada é {{ $json.campo }} — o $json aponta para o item que está sendo processado agora, e o que vem depois do ponto é o caminho até o campo. Com isso e mais meia dúzia de variáveis internas você resolve praticamente tudo. Este texto é a referência que faltava em português.

Adicione ao Google Notícias
Neste artigo
  1. A sintaxe, em uma linha
  2. $json: o que você vai usar 90% do tempo
  3. As variáveis internas que valem a pena
  4. Data e hora
  5. Transformar dado: use o node certo
  6. O erro mais comum, e a correção
  7. Perguntas frequentes

A sintaxe, em uma linha

Tudo que está entre {{ e }} é avaliado; o resto é texto literal. Isso significa que dá para misturar os dois na mesma caixa:

Olá {{ $json.nome }}, seu pedido {{ $json.numero }} foi confirmado.

O n8n resolve as duas expressões e mantém o texto ao redor. É assim que se monta mensagem personalizada sem node nenhum de template.

Não digite o caminho: arraste o campo do painel de entrada para dentro da caixa. O n8n escreve a expressão com o caminho correto, inclusive os níveis aninhados. Digitar à mão só quando o campo não estiver visível na entrada.

$json: o que você vai usar 90% do tempo

$json é o item atual. Como o n8n processa um item por vez, ele sempre aponta para o registro que está sendo tratado naquele momento.

{{ $json.email }}
{{ $json.cliente.telefone }}
{{ $json["nome do campo"] }}

A terceira forma resolve um problema comum: quando o nome do campo tem espaço, hífen ou acento, o ponto não funciona. Use colchetes com aspas.

O caso do webhook

Vale destacar porque confunde quase todo mundo. O dado que chega por webhook não vem solto — vem organizado em headers, params, query e body. O conteúdo que interessa quase sempre está no body:

{{ $json.body.nome }}

Quem escreve {{ $json.nome }} num fluxo de webhook recebe vazio e passa meia hora procurando o erro no lugar errado.

As variáveis internas que valem a pena

VariávelDevolveServe para
$jsonO item atualTudo
$itemIndexA posição do item na listaNumerar, tratar o primeiro diferente
$runIndexQuantas vezes o node já rodouControlar repetição em loop
$prevNode.nameNome do node anteriorLog e mensagens de erro
$workflow.nameNome do fluxoIdentificar a origem no aviso
$workflow.idIdentificador do fluxoReferência em registro
$execution.idIdentificador da execuçãoRastrear uma rodada específica
$execution.modeSe foi teste ou produçãoNão enviar de verdade em teste
$execution.resumeUrlURL para retomar o fluxo pausadoAprovação humana no meio
$varsVariáveis definidas na instânciaValores reutilizáveis
$envVariáveis de ambienteConfiguração do servidor
$secretsSegredos do cofre externoCredenciais em plano empresarial

Duas merecem comentário. $execution.mode permite montar um fluxo que não dispara mensagem de verdade quando você está testando — proteção barata contra o acidente de enviar cinquenta e-mails de teste. E $execution.resumeUrl é a base de fluxos com aprovação humana: o fluxo pausa, alguém abre aquela URL, o fluxo continua.

Data e hora

Expressões aceitam manipulação de data direto, sem código. O padrão que aparece na documentação:

{{ $today.minus(7, 'days') }}

Isso devolve a data de sete dias atrás no formato correto — exatamente o que se usa para buscar "os registros da última semana" em qualquer API.

Transformar dado: use o node certo

Aqui vai uma recomendação que vem da própria documentação e que poupa manutenção: se o seu objetivo é transformar dados, e não fazer outra operação junto, use o node Edit Fields (Set) em vez de espalhar expressões complexas por vários parâmetros de nodes diferentes.

O motivo é organização. Preparar os dados num ponto só e passar o resultado adiante deixa o fluxo legível. Vinte expressões complicadas espalhadas por oito nodes deixam o fluxo impossível de manter — e quem vai sofrer é você daqui a três meses.

Regra prática: se a expressão não cabe confortavelmente na caixa, ela não deveria estar ali. Mova a transformação para um Edit Fields antes e deixe o node de destino recebendo um campo pronto.

O erro mais comum, e a correção

Expressão devolvendo vazio quase sempre é caminho errado. A sequência que resolve:

  1. Abra o painel de entrada do node e confirme que o campo existe naquele item.

  2. Confira maiúsculas e minúsculas — os nomes diferenciam.

  3. Se o campo estiver aninhado, desça todos os níveis com pontos.

  4. Se o nome tiver espaço ou acento, troque o ponto por colchetes com aspas.

  5. Na dúvida, apague e arraste o campo.

Com {{ $json.campo }}, a tabela de variáveis internas e o hábito de arrastar em vez de digitar, você cobre a esmagadora maioria das expressões que vai escrever.

Esta aula faz parte do Curso de n8n do zero ao avançado, com todas as aulas em portugues.

Perguntas frequentes

Como usar expressões no n8n?

Escrevendo o trecho entre chaves duplas dentro de qualquer campo que aceite expressão. A forma mais comum é {{ $json.campo }}, que pega um valor do item atual. Texto fora das chaves permanece literal, o que permite montar frases com valores dinâmicos no meio.

O que significa $json no n8n?

É a variável que aponta para o item que está sendo processado naquele momento. Como os nodes processam um item por vez, ela sempre se refere ao registro atual, e o caminho após o ponto indica qual campo buscar.

Por que a expressão do meu webhook retorna vazio?

Porque o dado do webhook chega organizado em seções: headers, params, query e body. O conteúdo enviado fica dentro de body, então o caminho correto costuma ser {{ $json.body.campo }} e não {{ $json.campo }}.

Como pegar um campo cujo nome tem espaço?

Trocando a notação de ponto por colchetes com aspas: {{ $json["nome do campo"] }}. A mesma solução vale para nomes com hífen, acento ou qualquer caractere que quebre a notação de ponto.

Como saber se o fluxo está rodando em teste ou produção?

Usando {{ $execution.mode }}. É a base de uma proteção simples e muito útil: condicionar o envio real de mensagens ao modo de produção, evitando disparos acidentais durante os testes.

Onde colocar transformações complexas?

Num node Edit Fields (Set) dedicado, antes dos nodes que vão usar os dados. A própria documentação recomenda separar transformação de lógica de negócio, em vez de espalhar expressões complicadas por vários parâmetros — o fluxo fica muito mais fácil de entender depois.