Iteração sobre arrays, ramos por item e ao concluir, limite de iterações e variáveis de loop.
Nó Loop
O nó Loop (loop) itera sobre um array e executa os nós filhos conectados uma vez por item. É a forma padrão de processar listas — pedidos, contatos, cards do CRM, linhas de resultado de API — sem duplicar nós no canvas.
Use-o em Automações, na categoria Lógica da paleta.
Figura 1: Nó Loop com array de origem, alias do item e duas saídas
O que faz
Quando o workflow chega a um nó Loop, o engine:
- Resolve o campo array de origem (suporta
{{variables}}e saídas de nós). - Faz parse do valor como JSON se for string; valores que não são array são encapsulados em uma lista de um item.
- Corta o array até o máximo de iterações (padrão 100, limite rígido 500).
- Para cada item, define variáveis de loop e executa todos os nós conectados à saída A cada item (
loop_body). - Após todas as iterações, continua pela saída Ao concluir (
loop_done).
Dentro do corpo do loop, o item atual fica disponível como:
| Referência | Descrição |
|---|---|
{{item}} ou {{item_alias}} | Elemento atual (alias padrão: item) |
{{item.campo}} | Campo aninhado no objeto atual |
{{variables.item}} | Mesmo valor, armazenado nas variáveis de execução |
{{variables.item_index}} | Índice base zero (ex.: 0, 1, 2) |
{{input.current_item}} | Item atual via atalho input |
{{input.current_index}} | Índice atual via atalho input |
{{loop_node_id.count}} | Total de itens nesta execução (após o loop terminar) |
A saída do nó (em Ao concluir) inclui items (array de valores processados) e count.
Como configurar
Clique duas vezes no nó Loop para abrir o painel de configuração.
Array de origem (obrigatório)
Caminho ou expressão apontando para um array. Exemplos:
{{http_orders.data.orders}}
{{tiny_1.result.data.retorno.contas}}
{{trigger.body.items}}
Se a API retornar um único objeto em vez de array, o engine encapsula em [object] para o loop rodar uma vez.
Se o parse falhar (string JSON inválida), o loop roda zero vezes e segue para Ao concluir com count: 0.
Nome do item (alias)
Nome usado dentro do corpo do loop. Padrão: item.
| Alias | Dentro do loop você escreve |
|---|---|
item | {{item.id}}, {{item.name}} |
conta | {{conta.valor}}, {{conta.cliente}} |
lead | {{lead.email}} |
Escolha um nome curto e significativo quando aninhar loops ou tiver vários arrays no mesmo workflow.
Máximo de iterações
Limite de segurança. Padrão 100; máximo no servidor 500. Itens além do limite são ignorados (não é erro).
Saídas
| Handle | Rótulo no canvas | Quando executa |
|---|---|---|
loop_body | A cada item / Per item | Uma vez por elemento do array, antes de passar ao próximo |
loop_done | Ao concluir / On complete | Uma vez, após todas as iterações (ou imediatamente se o array estiver vazio) |
Conecte Send Text, HTTP, Condição ou qualquer outro nó em A cada item para lógica por linha. Conecte nós de resumo (ex.: notificação ao admin, Variável agregada) em Ao concluir.
Dicas e boas práticas
- Conecte as duas saídas de forma intencional. Nós só em A cada item rodam N vezes; nós só em Ao concluir rodam uma vez no final.
- Normalize os dados antes. Use um nó Variável ou JavaScript antes do loop se a API retornar
{ data: { items: [...] } }e você precisar de um caminho de array plano. - Respeite limites de taxa. Combine Loop com Delay dentro do corpo ao enviar mensagens WhatsApp para muitos contatos (veja guias anti-bloqueio).
- Mantenha o corpo enxuto. Lógica pesada em loops grandes aumenta tempo de execução e custo; pré-filtre com Condição ou fatie o array em JavaScript quando possível.
- Depure com o histórico de execução. Cada nó do corpo aparece várias vezes no log (ex.:
Send Text (2/15)). Expanda uma execução para verificarinput_resolveddo item atual. - Arrays vazios são válidos. O loop pula o corpo e vai direto para Ao concluir — útil para caminhos "sem trabalho" com Condição em
count.
Exemplos de uso
Exemplo 1 — Notificar cada fatura vencida (ERP + WhatsApp)
Trigger: Agendamento — dias úteis às 9:00.
Fluxo:
- Tiny ERP — listar contas vencidas →
{{tiny_1.result.data.retorno.contas}} - Loop — origem
{{tiny_1.result.data.retorno.contas}}, aliasconta - A cada item → Variável —
phone= busca pelo nome do cliente (HTTP ou Tiny "buscar clientes") - Condição —
{{variables.phone}}não está vazio - Send Text — "Olá {{conta.nome_cliente}}, sua fatura {{conta.numero}} de R$ {{conta.valor}} está vencida."
- Delay —
30s-90s(espaçamento aleatório) - Ao concluir → Send Text para o admin — "Concluído: {{loop_1.count}} lembretes enviados."
Exemplo 2 — Etiquetar contatos a partir de lista no webhook
Trigger: Webhook — body POST { "contacts": [{ "phone": "...", "tag": "vip" }] }.
Fluxo:
- Loop —
{{trigger.body.contas}}ou{{trigger.body.contacts}}, aliascontact - A cada item → Contact — Add tag — phone
{{contact.phone}}, tag{{contact.tag}} - Ao concluir → Retorno —
{ "processed": {{loop_1.count}} }para chamadores síncronos do webhook
Exemplo 3 — Processar itens de linha do Shopify
Trigger: Webhook — novo pedido.
Fluxo:
- Variável —
line_items={{trigger.body.line_items}} - Loop —
{{variables.line_items}}, aliasline - A cada item → HTTP — atualizar API interna de estoque com
{{line.sku}}e{{line.quantity}} - Ao concluir → CRM — Upsert card com total do pedido do trigger
FAQ
Por que meu loop roda 0 vezes?
O array de origem resolveu vazio, JSON inválido ou []. Verifique input_resolved no nó Loop e confirme o caminho do campo da API upstream (muitas vezes .data vs .data.items).
Posso aninhar loops?
Sim. Um loop interno no ramo A cada item do externo funciona; use aliases diferentes (order, line) para evitar sombreamento.
Por que só 100 itens são processados?
O max_iterations padrão é 100. Aumente na config do nó (até 500) se precisar de mais intencionalmente.
O loop executa nós em paralelo?
Não. Os itens são processados sequencialmente — uma passagem completa pelo corpo, depois o próximo item.
O que acontece se um nó dentro do loop falhar?
A execução para com status de erro, a menos que você trate erros upstream. Teste com um array pequeno primeiro.
Posso usar {{input}} dentro do loop?
Sim. {{input.current_item}} e {{input.current_index}} referem-se à iteração atual do loop. Outros campos em input podem ainda refletir a saída do nó anterior conforme a posição no grafo.
Artigos relacionados
- Visão geral de Lógica — todos os nós de Lógica
- Nó Condição — ramificar dentro de loops
- Nó Delay — espaçamento entre iterações
- Variáveis no workflow —
{{variables}}e{{input}} - Como testar e depurar um workflow — inspecionar execuções de loop no histórico
Este artigo foi útil?
Precisa de mais ajuda? Falar com suporte