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

Comportamento dos Nós (Nodes)
- Webhook (Trigger):
- Método: POST
- URL: Recebe o payload disparado pelo painel da Wake/Fbits.
-
Ação: Inicia a execução do fluxo imediatamente após a chegada do JSON.
-
Filtro / Switch (Opcional):
- Avalia a chave
tipoEvento ou evento do payload.
-
Evita repassar atualizações vazias ou de entidades irrelevantes para o servidor local, poupando processamento.
-
HTTP Request (Destino):
- Método: POST
- URL:
https://busca.anhanguerapricing.com.br/api/n8n/wake-sync
- 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": []
}