{ "name": "📤 Krayin → Evolution | Resposta Automática WhatsApp", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "krayin-webhook-response", "responseMode": "responseNode", "options": {} }, "id": "webhook-krayin", "name": "Webhook Krayin", "type": "n8n-nodes-base.webhook", "typeVersion": 1, "position": [240, 300], "webhookId": "krayin-response-webhook" }, { "parameters": { "conditions": { "string": [ { "value1": "={{$node[\"Webhook Krayin\"].json[\"event\"]}}", "operation": "equal", "value2": "lead.updated" } ] } }, "id": "filter-lead-update", "name": "Filtro: Lead Atualizado", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [460, 300] }, { "parameters": { "jsCode": "// Processar atualização do lead no Krayin\nconst webhookData = $node[\"Webhook Krayin\"].json;\nconst leadData = webhookData.data || {};\n\n// Extrair dados importantes\nconst leadId = leadData.id;\nconst leadTitle = leadData.title || '';\nconst leadStatus = leadData.stage?.name || 'Novo';\nconst contactId = leadData.person?.id;\nconst contactName = leadData.person?.name || 'Cliente';\nconst contactPhone = leadData.person?.contact_numbers?.[0]?.value || '';\nconst leadValue = leadData.lead_value || 0;\n\n// Verificar se é uma atualização de status relevante\nconst relevantStatuses = ['Em Análise', 'Aprovado', 'Negociação', 'Proposta Enviada', 'Fechado', 'Perdido'];\nconst shouldSendMessage = relevantStatuses.includes(leadStatus);\n\n// Limpar telefone para formato WhatsApp\nconst formatPhoneForWhatsApp = (phone) => {\n if (!phone) return null;\n \n // Remove caracteres não numéricos\n const cleanPhone = phone.replace(/\\D/g, '');\n \n // Adiciona código do Brasil se necessário\n let formattedPhone = cleanPhone;\n if (!formattedPhone.startsWith('55') && formattedPhone.length === 11) {\n formattedPhone = '55' + formattedPhone;\n }\n \n // Adiciona sufixo do WhatsApp\n return formattedPhone + '@s.whatsapp.net';\n};\n\n// Gerar mensagem baseada no status\nconst generateMessage = (status, name, value) => {\n const messages = {\n 'Em Análise': `Olá ${name}! 📋 Recebemos seu interesse e nossa equipe já está analisando sua solicitação. Em breve entraremos em contato com mais detalhes.`,\n 'Aprovado': `🎉 Ótimas notícias, ${name}! Sua solicitação foi aprovada. Nossa equipe entrará em contato para dar continuidade ao processo.`,\n 'Negociação': `💬 Olá ${name}! Vamos conversar sobre sua proposta. Nossa equipe está preparando as melhores condições para você.`,\n 'Proposta Enviada': `📄 ${name}, sua proposta personalizada foi enviada! Verifique seu email e WhatsApp. Estou aqui para esclarecer qualquer dúvida.`,\n 'Fechado': `🚀 Parabéns ${name}! Seja bem-vindo(a) à nossa família! Em breve você receberá todas as informações para começar.`,\n 'Perdido': `${name}, obrigado pelo seu interesse! Nosso time está sempre aqui caso mude de ideia. Tenha um ótimo dia! 😊`\n };\n \n return messages[status] || `Olá ${name}! Temos uma atualização sobre sua solicitação. Nossa equipe entrará em contato em breve.`;\n};\n\nconst processedData = {\n lead_id: leadId,\n lead_title: leadTitle,\n lead_status: leadStatus,\n contact_id: contactId,\n contact_name: contactName,\n contact_phone: contactPhone,\n whatsapp_phone: formatPhoneForWhatsApp(contactPhone),\n lead_value: leadValue,\n should_send: shouldSendMessage && contactPhone,\n message: shouldSendMessage ? generateMessage(leadStatus, contactName, leadValue) : null,\n timestamp: new Date().toISOString()\n};\n\nif (!processedData.should_send) {\n processedData.skip_reason = !shouldSendMessage ? 'Status não relevante' : 'Telefone não encontrado';\n}\n\nreturn processedData;" }, "id": "process-lead-update", "name": "Processar Atualização Lead", "type": "n8n-nodes-base.code", "typeVersion": 1, "position": [680, 300] }, { "parameters": { "conditions": { "boolean": [ { "value1": "={{$node[\"Processar Atualização Lead\"].json[\"should_send\"]}}", "value2": false } ] } }, "id": "should-skip", "name": "Pular Envio?", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [900, 300] }, { "parameters": { "method": "POST", "url": "https://evolution.memudecore.com.br/message/sendText/default", "authentication": "predefinedCredentialType", "nodeCredentialType": "evolution-api", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" } ] }, "sendBody": true, "bodyParameters": { "parameters": [ { "name": "number", "value": "={{$node[\"Processar Atualização Lead\"].json[\"whatsapp_phone\"]}}" }, { "name": "text", "value": "={{$node[\"Processar Atualização Lead\"].json[\"message\"]}}" } ] }, "options": {} }, "id": "send-whatsapp-message", "name": "Enviar Mensagem WhatsApp", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4, "position": [1120, 200], "credentials": { "evolution-api": { "id": "evolution-whatsapp-api", "name": "Evolution WhatsApp API" } } }, { "parameters": { "jsCode": "// Gerar log do envio\nconst sendResult = $node[\"Enviar Mensagem WhatsApp\"].json;\nconst leadData = $node[\"Processar Atualização Lead\"].json;\n\nconst logEntry = {\n timestamp: new Date().toISOString(),\n action: 'WHATSAPP_RESPONSE_SENT',\n lead_id: leadData.lead_id,\n contact_name: leadData.contact_name,\n contact_phone: leadData.contact_phone,\n lead_status: leadData.lead_status,\n message_sent: leadData.message,\n whatsapp_response: sendResult,\n success: sendResult?.status === 'pending' || sendResult?.id ? true : false,\n error: sendResult?.error || null\n};\n\nreturn logEntry;" }, "id": "log-whatsapp-send", "name": "Log Envio WhatsApp", "type": "n8n-nodes-base.code", "typeVersion": 1, "position": [1340, 200] }, { "parameters": { "mode": "append", "fileName": "/tmp/whatsapp-responses-log.txt", "fileContent": "={{JSON.stringify($node[\"Log Envio WhatsApp\"].json, null, 2)}}\n---\n" }, "id": "save-response-log", "name": "Salvar Log Resposta", "type": "n8n-nodes-base.writeFile", "typeVersion": 1, "position": [1560, 200] }, { "parameters": { "respondWith": "json", "responseBody": "={\"success\": true, \"message\": \"Resposta WhatsApp enviada\", \"lead_id\": \"{{$node[\"Processar Atualização Lead\"].json[\"lead_id\"]}}\", \"status\": \"{{$node[\"Processar Atualização Lead\"].json[\"lead_status\"]}}\"}" }, "id": "webhook-response-success", "name": "Resposta Webhook (Enviado)", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1, "position": [1780, 200] }, { "parameters": { "jsCode": "// Log de ação pulada\nconst leadData = $node[\"Processar Atualização Lead\"].json;\n\nconst logEntry = {\n timestamp: new Date().toISOString(),\n action: 'WHATSAPP_RESPONSE_SKIPPED',\n lead_id: leadData.lead_id,\n contact_name: leadData.contact_name,\n lead_status: leadData.lead_status,\n skip_reason: leadData.skip_reason,\n should_send: leadData.should_send\n};\n\nreturn logEntry;" }, "id": "log-skip", "name": "Log Ação Pulada", "type": "n8n-nodes-base.code", "typeVersion": 1, "position": [1120, 400] }, { "parameters": { "mode": "append", "fileName": "/tmp/whatsapp-responses-log.txt", "fileContent": "={{JSON.stringify($node[\"Log Ação Pulada\"].json, null, 2)}}\n---\n" }, "id": "save-skip-log", "name": "Salvar Log Pular", "type": "n8n-nodes-base.writeFile", "typeVersion": 1, "position": [1340, 400] }, { "parameters": { "respondWith": "json", "responseBody": "={\"success\": true, \"message\": \"Processado mas não enviado\", \"reason\": \"{{$node[\"Processar Atualização Lead\"].json[\"skip_reason\"]}}\"}" }, "id": "webhook-response-skip", "name": "Resposta Webhook (Pulado)", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1, "position": [1560, 400] } ], "connections": { "Webhook Krayin": { "main": [ [ { "node": "Filtro: Lead Atualizado", "type": "main", "index": 0 } ] ] }, "Filtro: Lead Atualizado": { "main": [ [ { "node": "Processar Atualização Lead", "type": "main", "index": 0 } ] ] }, "Processar Atualização Lead": { "main": [ [ { "node": "Pular Envio?", "type": "main", "index": 0 } ] ] }, "Pular Envio?": { "main": [ [ { "node": "Log Ação Pulada", "type": "main", "index": 0 } ], [ { "node": "Enviar Mensagem WhatsApp", "type": "main", "index": 0 } ] ] }, "Enviar Mensagem WhatsApp": { "main": [ [ { "node": "Log Envio WhatsApp", "type": "main", "index": 0 } ] ] }, "Log Envio WhatsApp": { "main": [ [ { "node": "Salvar Log Resposta", "type": "main", "index": 0 } ] ] }, "Salvar Log Resposta": { "main": [ [ { "node": "Resposta Webhook (Enviado)", "type": "main", "index": 0 } ] ] }, "Log Ação Pulada": { "main": [ [ { "node": "Salvar Log Pular", "type": "main", "index": 0 } ] ] }, "Salvar Log Pular": { "main": [ [ { "node": "Resposta Webhook (Pulado)", "type": "main", "index": 0 } ] ] } }, "active": false, "settings": {}, "versionId": "1", "meta": { "instanceId": "krayin-evolution-response" }, "id": "2", "tags": [ "WhatsApp", "CRM", "Resposta Automática", "Sem Slack", "Evolution" ] }