Skip to content

Fluxo de Roteamento (n8n)

O n8n atua como um middleware (intermediário) entre a API da Wake e o nosso back-end Laravel. Ele recebe os webhooks brutos, filtra eventos desnecessários e os encaminha para a fila de processamento.

Visão Geral do Fluxo

Fluxo n8n

Comportamento dos Nós (Nodes)

  1. Webhook (Trigger):
  2. Método: POST
  3. URL: Recebe o payload disparado pelo painel da Wake/Fbits.
  4. Ação: Inicia a execução do fluxo imediatamente após a chegada do JSON.

  5. Filtro / Switch (Opcional):

  6. Avalia a chave tipoEvento ou evento do payload.
  7. Evita repassar atualizações vazias ou de entidades irrelevantes para o servidor local, poupando processamento.

  8. HTTP Request (Destino):

  9. Método: POST
  10. URL: https://busca.anhanguerapricing.com.br/api/n8n/wake-sync
  11. Ação: Encaminha o JSON validado para o WakeWebhookController do Laravel, que fará o enfileiramento via Redis.

Backup do Fluxo (JSON)

Para restaurar este fluxo em caso de perda do container, copie o JSON abaixo e cole (Ctrl+V) diretamente na interface em branco do n8n:

Clique para expandir o JSON do n8n ```json: { "name": "Busca Wake", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "wake-atualizacao-produto", "authentication": "headerAuth", "options": {} }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [ 0, 0 ], "id": "3409e4f7-5824-4241-9df7-3f096ff3c8a2", "name": "Webhook", "webhookId": "77405754-96bf-4167-8b2c-d7a33df1f5b0", "credentials": { "httpHeaderAuth": { "id": "891E26Dt9pR8gtRt", "name": "Header Auth account" } } }, { "parameters": { "assignments": { "assignments": [ { "id": "18304e9a-821d-46eb-80cf-d4d8eda95336", "name": "produtoId", "value": "={{ $json.evento.produto_variante || $json.evento.produto }}", "type": "string" }, { "id": "50418945-40f6-4eb5-a859-ab275c57a03e", "name": "tipoEvento", "value": "={{ $json.topico }}", "type": "string" }, { "id": "79de7748-dcea-4815-aba0-5e961f198481", "name": "tipoIdentificador", "value": "={{ $json.topico.includes('produto_variante') ? 'ProdutoVarianteId' : 'ProdutoId' }}", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 416, 0 ], "id": "d852a4eb-2721-4bf7-800e-a4eb24a56b08", "name": "Edit Fields" }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "leftValue": "={{ $json.tipoEvento }}", "rightValue": "preco", "operator": { "type": "string", "operation": "contains" }, "id": "803f001c-2ef3-448d-851a-45e744ddd811" } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Atualiza Preco" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "3bc6a726-8bc3-4a65-a86c-3e3e9f823ea0", "leftValue": "={{ $json.tipoEvento }}", "rightValue": "estoque", "operator": { "type": "string", "operation": "contains" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Atualiza Estoque" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "09e6b5f1-7b5d-452f-aeca-6ee60c9df7c4", "leftValue": "={{ $json.tipoEvento }}", "rightValue": "disponibilidade", "operator": { "type": "string", "operation": "contains" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Atualiza disponibilidade" } ] }, "options": { "fallbackOutput": "extra" } }, "type": "n8n-nodes-base.switch", "typeVersion": 3.4, "position": [ 624, 0 ], "id": "6d89a63c-fcc8-46f6-bc43-2202e77763b2", "name": "Switch" }, { "parameters": { "url": "=https://api.fbits.net/produtos/{{ $node[\"Edit Fields\"].json[\"produtoId\"] }}/estoque", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "tipoIdentificador", "value": "ProdutoVarianteId" } ] }, "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "Basic Anhan-54060be3-daf0-4e86-be83-6bb3dd52d922" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 880, 64 ], "id": "231ecdbd-dcfb-46b7-97b9-c031cc9e28cc", "name": "Busca Estoque" }, { "parameters": { "url": "=https://api.fbits.net/produtos/{{ $node[\"Edit Fields\"].json[\"produtoId\"] }}/disponibilidade", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "tipoIdentificador", "value": "ProdutoVarianteId" } ] }, "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "Basic Anhan-54060be3-daf0-4e86-be83-6bb3dd52d922" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 1056, 64 ], "id": "99364a3f-503a-412f-8ade-17434548891e", "name": "Busca Disp" }, { "parameters": { "url": "=https://api.fbits.net/produtos/{{ $json.produtoId }}/preco?tipoIdentificador=ProdutoVarianteId", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "Basic Anhan-54060be3-daf0-4e86-be83-6bb3dd52d922" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 880, -112 ], "id": "2b8b8357-f66a-401c-930d-ede7aa6b5757", "name": "Busca Preço" }, { "parameters": { "jsCode": "// Puxa o ID do produto lá do início do fluxo\nconst id = $('Edit Fields').first().json.produtoId;\n\n// Puxa o retorno da API de Estoque do nó que acabamos de renomear\nconst bodyEstoque = $('Busca Estoque').first().json;\n\n// Puxa o retorno da API de Disponibilidade (o nó imediatamente anterior a este)\nconst resDisp = $json;\n\n// Lógica de fallback para capturar o estoque físico (igual ao seu $bodyEstoque['estoqueFisico'] ?? ...)\nlet estoqueFisico = 0;\nif (bodyEstoque.estoqueFisico !== undefined) {\n estoqueFisico = bodyEstoque.estoqueFisico;\n} else if (bodyEstoque[0] && bodyEstoque[0].estoqueFisico !== undefined) {\n estoqueFisico = bodyEstoque[0].estoqueFisico;\n}\n\n// Validação da disponibilidade \nlet isDisponivel = (resDisp === true || resDisp === 'true' || resDisp.disponivel === true);\n\n// Monta o objeto final que será enviado para atualizar o Meilisearch\nreturn {\n id: id,\n estoque_total: estoqueFisico,\n availability: isDisponivel\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1264, 64 ], "id": "ff089e6d-a768-4369-9dc0-70f49c1a4d38", "name": "Code in JavaScript" }, { "parameters": { "method": "POST", "url": "https://busca.anhanguerapricing.com.br/api/n8n/wake-sync", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ $json }}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 1472, 64 ], "id": "7b43cdf5-0e70-4be5-a399-7c3bc1f92e15", "name": "Atualiza BD est/disp" }, { "parameters": { "url": "=https://api.fbits.net/produtos/{{ $json.produtoId }}?tipoIdentificador={{ $json.tipoIdentificador }}&camposAdicionais=Estoque&camposAdicionais=Atributo&camposAdicionais=Informacao&camposAdicionais=Categoria", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "produtoVarianteIdDe", "value": "={{ $node[\"Edit Fields\"].json[\"produtoId\"] }}" }, { "name": "produtoVarianteIdAte", "value": "={{ $node[\"Edit Fields\"].json[\"produtoId\"] }}" }, { "name": "camposAdicionais", "value": "Estoque" }, { "name": "camposAdicionais", "value": "Atributo" }, { "name": "camposAdicionais", "value": "Informacao" }, { "name": "camposAdicionais", "value": "Categoria" } ] }, "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "Basic Anhan-54060be3-daf0-4e86-be83-6bb3dd52d922" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 880, 240 ], "id": "5451b1fa-3e7a-4837-9318-366c8bb0d0ec", "name": "Busca Tudo produtos" }, { "parameters": { "jsCode": "// A rota /produtos da Wake retorna um array. Pegamos o primeiro item.\nconst item = $json[0] || $json;\n\nif (!item || !item.produtoVarianteId) {\n throw new Error(\"Produto não encontrado na API da Wake\");\n}\n\nconst isTelevendas = item.isTelevendas || false;\nconst isValido = item.valido || false;\nconst estoqueFisico = (item.estoque && item.estoque[0]) ? item.estoque[0].estoqueFisico : 0;\nconst categoria = (item.categorias && item.categorias[0]) ? item.categorias[0].nome : 'Geral';\n\n// Monta o JSON blindado para enviar ao Laravel\nreturn {\n id: item.produtoVarianteId,\n produto_id: item.produtoId || null,\n sku: item.sku || 'SEM-SKU',\n url: item.urlProduto || null,\n title: item.nome || 'Sem nome',\n brand: item.fabricante || 'N/A',\n product_type: categoria,\n description: item.descricao || item.nome,\n is_televendas: isTelevendas,\n availability: (isValido && !isTelevendas),\n estoque_total: estoqueFisico,\n price: parseFloat(item.precoPor || 0),\n preco_de: parseFloat(item.precoDe || 0),\n raw_data: item\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1264, 240 ], "id": "28628fcb-6f8c-4c48-8938-e021376127f9", "name": "Code in JavaScript1" }, { "parameters": { "method": "POST", "url": "https://busca.anhanguerapricing.com.br/api/n8n/wake-sync", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ $json }}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 1472, 240 ], "id": "df0a5d42-6bc5-430b-ad7a-02e2830f9d9b", "name": "Atualiza BD tudo" }, { "parameters": { "jsCode": "// Puxa o ID do produto mapeado lá no início do fluxo\nconst id = $('Edit Fields').first().json.produtoId;\n\n// Puxa o retorno da API de Preço (o nó imediatamente anterior a este)\nconst body = $json;\n\n// Lógica de fallback para capturar os preços (cobrindo objeto direto ou array)\nlet novoPrecoPor = 0;\nlet novoPrecoDe = 0;\n\nif (body.precoPor !== undefined) {\n novoPrecoPor = body.precoPor;\n novoPrecoDe = body.precoDe || 0;\n} else if (body[0] && body[0].precoPor !== undefined) {\n novoPrecoPor = body[0].precoPor;\n novoPrecoDe = body[0].precoDe || 0;\n}\n\n// Monta o objeto final blindado que será enviado ao Laravel\nreturn {\n id: id,\n price: parseFloat(novoPrecoPor),\n preco_de: parseFloat(novoPrecoDe)\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1264, -112 ], "id": "19869224-c519-45be-b263-d8f81aab1a5d", "name": "Code in JavaScript2" }, { "parameters": { "method": "POST", "url": "https://busca.anhanguerapricing.com.br/api/n8n/wake-sync", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ $json }}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 1472, -112 ], "id": "69b60179-914a-46a4-b482-2707ee7dcc8d", "name": "Atualiza Preço" }, { "parameters": { "jsCode": "// A Wake já entrega o JSON formatado dentro de 'body'.\n// Vamos extrair apenas ele e descartar os cabeçalhos HTTP.\nconst dadosWake = items[0].json.body;\n\n// Se o body for um array (caso mandem em lote), pegamos o primeiro item\nif (Array.isArray(dadosWake) && dadosWake.length > 0) {\n return [{ json: dadosWake[0] }];\n}\n\n// Se for um objeto direto, repassamos ele\nreturn [{ json: dadosWake }];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 208, 0 ], "id": "2c75af89-5b69-443b-bb55-797425a0bf8b", "name": "Code in JavaScript3" } ], "pinData": { "Webhook": [ { "json": { "headers": { "connection": "upgrade", "host": "busca.anhanguerapricing.com.br", "x-real-ip": "3.14.188.155", "x-forwarded-for": "3.14.188.155", "x-forwarded-proto": "https", "content-length": "244", "x-api-key": "e1uTzpXA5CLgKUJ5PWgQz8byrzevTGqbAfpen07EIoJPWzwbnxxgZChi6yqBEyIg", "newrelic": "eyJ2IjpbMCwxXSwiZCI6eyJ0eSI6IkFwcCIsImFjIjoiMTQ2MDIxMCIsImFwIjoiNzAwMjI1ODg0IiwidHIiOiJjZjdmOTUwMWNkMGJiYmMyNGNmYjc3N2UxMGExOGZkNiIsInByIjowLjkxNzg1Nywic2EiOmZhbHNlLCJ0aSI6MTc4MTg4NTAyMDAxMiwidGsiOiI0NjQzNTMxIiwidHgiOiIxNjllMjNjZWUxMDM2YjEyIiwiaWQiOiIzNDljNzExNDY0N2I4MDRjIn19", "traceparent": "00-cf7f9501cd0bbbc24cfb777e10a18fd6-349c7114647b804c-00", "tracestate": "4643531@nr=0-0-1460210-700225884-349c7114647b804c-169e23cee1036b12-0-0.917857-1781885020012", "content-type": "application/json; charset=utf-8" }, "params": {}, "query": {}, "body": { "topico": "produto.preco.alterado", "evento": { "loja": "anhangueraferramentas", "produto": 114480, "id": "edd85e1f-2dff-4ddc-838f-fe1250297a90", "data_evento": "2026-06-19t13:03:36.08" }, "data_envio": "2026-06-19T13:03:40.0113123-03:00", "tentativa": 1 }, "webhookUrl": "https://busca.anhanguerapricing.com.br/webhook/wake-atualizacao-produto", "executionMode": "production" } } ] }, "connections": { "Webhook": { "main": [ [ { "node": "Code in JavaScript3", "type": "main", "index": 0 } ] ] }, "Edit Fields": { "main": [ [ { "node": "Switch", "type": "main", "index": 0 } ] ] }, "Switch": { "main": [ [ { "node": "Busca Preço", "type": "main", "index": 0 } ], [ { "node": "Busca Estoque", "type": "main", "index": 0 } ], [ { "node": "Busca Estoque", "type": "main", "index": 0 } ], [ { "node": "Busca Tudo produtos", "type": "main", "index": 0 } ] ] }, "Busca Estoque": { "main": [ [ { "node": "Busca Disp", "type": "main", "index": 0 } ] ] }, "Busca Disp": { "main": [ [ { "node": "Code in JavaScript", "type": "main", "index": 0 } ] ] }, "Code in JavaScript": { "main": [ [ { "node": "Atualiza BD est/disp", "type": "main", "index": 0 } ] ] }, "Busca Tudo produtos": { "main": [ [ { "node": "Code in JavaScript1", "type": "main", "index": 0 } ] ] }, "Code in JavaScript1": { "main": [ [ { "node": "Atualiza BD tudo", "type": "main", "index": 0 } ] ] }, "Busca Preço": { "main": [ [ { "node": "Code in JavaScript2", "type": "main", "index": 0 } ] ] }, "Code in JavaScript2": { "main": [ [ { "node": "Atualiza Preço", "type": "main", "index": 0 } ] ] }, "Code in JavaScript3": { "main": [ [ { "node": "Edit Fields", "type": "main", "index": 0 } ] ] } }, "active": true, "settings": { "executionOrder": "v1", "binaryMode": "separate", "availableInMCP": false }, "versionId": "d0c6a695-5f31-4f9f-a56e-e3271c791cac", "meta": { "templateCredsSetupCompleted": true, "instanceId": "839c2f5f5194fff6306074ed1896a53fc7ccccb8ab6bec305ef00b4744972e7d" }, "nodeGroups": [], "id": "VN0YCyQ3TcKCDBX6", "tags": [] }