This workflow follows the Agent → Gmail recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"parameters": {
"options": {}
},
"id": "15cf44d5-0381-4b6c-8da2-7e16d7b40ea3",
"name": "SerpAPI",
"type": "@n8n/n8n-nodes-langchain.toolSerpApi",
"position": [
-1180,
460
],
"typeVersion": 1,
"credentials": {
"serpApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"model": {
"__rl": true,
"value": "gpt-4.1-mini",
"mode": "list",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"id": "5020426e-7355-4b7b-a314-b2ab21a2da51",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-1520,
460
],
"typeVersion": 1.2,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "eb1139cb-75f4-486c-aac8-2c30a5edaf16",
"leftValue": "={{ $json.body.data.key.remoteJid }}",
"rightValue": "@g.us",
"operator": {
"type": "string",
"operation": "endsWith"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-1460,
-820
],
"id": "295f4915-7ce5-4b37-88ac-be02e56f03cf",
"name": "If (Verifica Contato)"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "869dd0cc-d362-464c-9e82-0e137bee5fd5",
"leftValue": "={{ $('Webhook').item.json.body.data.message.conversation }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "gte"
}
},
{
"id": "0d8f2ba9-7696-4080-b0e3-7f123dbe3452",
"leftValue": "={{ $('Webhook').item.json.body.data.message.conversation }}",
"rightValue": 10,
"operator": {
"type": "number",
"operation": "lte"
}
}
],
"combinator": "and"
},
"looseTypeValidation": true,
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-1700,
-280
],
"id": "edba9bc3-f8a8-48ce-97bb-3091f2ec7dd5",
"name": "If (Mensagem ou Nota)",
"onError": "continueRegularOutput"
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-1640,
240
],
"id": "15719766-638e-468e-aa58-ba0886483e5a",
"name": "Conversa"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "f82892ad-1b1e-4a11-b168-3869b530c196",
"leftValue": "={{ $json.ClienteEncontrado }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "gt"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-820,
-800
],
"id": "9f58ae2b-6c38-4187-9e74-56e1948c4a28",
"name": "Verificar se o cliente esta no banco de dados"
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT TOP 1 -- Adicionei TOP 1 para garantir que ele traga apenas a OS mais recente para este cliente\n OS.Ordem AS OSsistema,\n C.Nome AS NomeCliente, -- Nome do Cliente\n ISNULL(NULLIF(C.Fone1, ''), C.Fone2) AS TelefoneCliente, -- Telefone do Cliente\n OS.DataFechamento, -- Adicionei novamente para que voc\u00ea possa usar, se precisar\n OS.Observa\u00e7\u00f5esFechamento AS ServicoRealizado -- Adicionei para pegar o servi\u00e7o realizado\nFROM\n OSs OS\nJOIN\n Clientes C ON C.CodCliente = OS.Cliente\nWHERE\n OS.Status = 'B' -- Mant\u00e9m o filtro de status da OS (Fechada, por exemplo)\n AND OS.DataFechamento IS NOT NULL\n AND OS.N8Nstatus IN (0, 2)\n -- *** AQUI EST\u00c1 A ADI\u00c7\u00c3O CRUCIAL ***\n AND (C.Fone1 = '{ { $json.telefoneClienteLimpo } }' OR C.Fone2 = '{ { $json.telefoneClienteLimpo } }')\nORDER BY\n OS.DataFechamento DESC, -- Ordem decrescente pela data e ordem para pegar a mais recente\n OS.Ordem DESC;"
},
"type": "n8n-nodes-base.microsoftSql",
"typeVersion": 1.1,
"position": [
-580,
-820
],
"id": "57cc58cf-ac7b-43e9-82a8-03f8d86464db",
"name": "Microsoft SQL1",
"credentials": {
"microsoftSql": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// SUBSTITUA TODO O CONTE\u00daDO DO SEU N\u00d3 'CODE' POR ESTE C\u00d3DIGO:\n\nconst outputItems = [];\nconst inputData = $input.all(); // Pega todos os itens de entrada de forma robusta\n\nfor (const item of inputData) {\n let telefoneBruto = '';\n\n // Tenta ler o remoteJid de v\u00e1rios caminhos comuns, priorizando a estrutura padr\u00e3o do n8n (item.json)\n if (item.json) {\n telefoneBruto = item.json.body?.data?.key?.remoteJid ||\n item.json.data?.key?.remoteJid || // Caminho sem 'body'\n item.json.key?.remoteJid || // Caminho sem 'data'\n item.json.remoteJid || // Caminho direto\n ''; // Valor padr\u00e3o vazio se n\u00e3o encontrar\n } else {\n // Se item.json N\u00c3O existe, assume que 'item' \u00c9 o payload JSON bruto\n telefoneBruto = item.body?.data?.key?.remoteJid ||\n item.data?.key?.remoteJid ||\n item.key?.remoteJid ||\n item.remoteJid ||\n ''; // Valor padr\u00e3o vazio se n\u00e3o encontrar\n }\n\n let telefoneLimpo = '';\n if (telefoneBruto) {\n telefoneLimpo = telefoneBruto.replace(/[^0-9]/g, ''); // Remove tudo que n\u00e3o for d\u00edgito\n }\n\n // --- AGORA, CONSTRU\u00cdMOS A QUERY SQL COMPLETA AQUI MESMO ---\n // CORRE\u00c7\u00c3O AQUI: REMOVIDAS AS TAGS HTML E BARRAS INVERTIDAS EXTRAS\n const sqlQueryVerificacaoCliente = `\n SELECT COUNT(C.CodCliente) AS ClienteEncontrado\n FROM Clientes C (NOLOCK)\n WHERE (C.Fone1 = '${telefoneLimpo}' OR C.Fone2 = '${telefoneLimpo}');\n `;\n\n // Adiciona a query SQL completa e pronta para execu\u00e7\u00e3o ao item.\n // O pr\u00f3ximo n\u00f3 SQL vai apenas pegar essa string e executar.\n if (item.json) {\n item.json.sqlQueryClienteVerificacao = sqlQueryVerificacaoCliente;\n // Mant\u00e9m o telefone limpo no item.json para uso posterior\n item.json.telefoneClienteLimpo = telefoneLimpo;\n } else {\n item.sqlQueryClienteVerificacao = sqlQueryVerificacaoCliente;\n // Mant\u00e9m o telefone limpo no item para uso posterior\n item.telefoneClienteLimpo = telefoneLimpo;\n }\n\n outputItems.push(item);\n}\n\nreturn outputItems;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-1220,
-780
],
"id": "8064037b-8b50-456c-81f3-ef6c62bfd070",
"name": "Code"
},
{
"parameters": {
"sendTo": "sistemas@ramosgrupo.com.br",
"subject": "=Relat\u00f3rio de Avalia\u00e7\u00e3o Negativa - Ordem de Servi\u00e7o: {{ $('Dados').item.json.os }}",
"message": "=<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <title>Ordem de Servi\u00e7o - CearaGPS</title>\n <meta name=\"description\" content=\"\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <link rel=\"stylesheet\" href=\"\">\n <title>Ordem de Servi\u00e7o - CearaGPS</title>\n </head>\n <style>\n body {\n background: #fff3ea;\n font-family: 'Segoe UI', Arial, sans-serif;\n color: #01335B;\n }\n .container {\n max-width: 540px;\n margin: 38px auto;\n background: #fff;\n border-radius: 18px;\n box-shadow: 0 6px 26px rgba(243, 112, 33, 0.07);\n padding: 38px 32px 18px 32px;\n border: 2px solid #F37021;\n }\n .logo-cearagps {\n display: block;\n margin: 0 auto 26px auto;\n max-width: 190px;\n }\n h1 {\n font-size: 1.65rem;\n color: #007bc1;\n text-align: center;\n margin-bottom: 20px; /* Ajustado o margin-bottom pois o subt\u00edtulo foi removido */\n font-weight: 700;\n letter-spacing: -0.5px;\n }\n /* O subt\u00edtulo foi removido, ent\u00e3o a classe .subtitle pode ser removida ou comentada se n\u00e3o for mais usada\n .subtitle {\n text-align: center;\n color: #007bc1;\n font-size: 1.13rem;\n margin-bottom: 20px;\n font-weight: 500;\n }\n */\n .details {\n background: #fff7f1;\n border: 2px solid #F37021;\n border-radius: 25px;\n padding: 20px 18px 13px 18px;\n margin-bottom: 16px;\n }\n .details-row {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 15px;\n }\n .details-row strong {\n min-width: 130px; /* Ajustado para acomodar textos maiores como \"Ordem de servi\u00e7o:\" */\n color: #007bc1;\n font-weight: 600;\n font-size: 1.04rem;\n text-align: left;\n }\n .details-row .value {\n color: #01335B;\n font-size: 1.03rem;\n font-weight: 500;\n }\n .highlight { /* Usado para a Nota */\n color: #F37021;\n font-weight: bold;\n font-size: 1.18rem;\n }\n /* A classe .status-chip n\u00e3o \u00e9 mais necess\u00e1ria para os novos campos, pode ser removida ou comentada\n .status-chip {\n display: inline-flex;\n align-items: center;\n background: #fff3ea;\n color: #F37021;\n border-radius: 16px;\n font-weight: 700;\n font-size: 1.00rem;\n padding: 4px 15px;\n border: 1.5px solid #F37021;\n margin-left: 6px;\n }\n .status-chip svg {\n width: 16px;\n height: 16px;\n margin-right: 7px;\n color: #F37021;\n }\n */\n .footer {\n margin-top: 18px;\n text-align: center;\n font-size: 1.20rem;\n color: #839bb3;\n }\n .footer strong {\n color: #F37021;\n }\n @media (max-width: 650px) {\n .container { padding: 15px 3vw 6px 3vw; }\n .logo-cearagps { max-width: 120px; }\n .details-row strong { min-width: 110px; font-size: .96rem; } /* Ajustado para responsividade */\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <img class=\"logo-cearagps\" src=\"https://cearagps.com.br/wp-content/uploads/2022/10/logo_cearagps.png\" alt=\"Logo CearaGPS\">\n <h1>Detalhes da Ordem de Servi\u00e7o</h1>\n <div class=\"details\">\n <div class=\"details-row\">\n <strong>Ordem de Servi\u00e7o:</strong>\n <span class=\"value\">{{ $('Dados').item.json.os }}</span>\n </div>\n <div class=\"details-row\">\n <strong>Nome do cliente:</strong>\n <span class=\"value\">{{ $('Dados').item.json['Nome '] }}</span>\n </div>\n <div class=\"details-row\">\n <strong>Nota:</strong>\n <span class=\"highlight\">{{ $('Dados').item.json.Nota }}</span>\n </div>\n <br>\n <div>\n <p style=\"margin: bottom 8px;\">Este \u00e9 um resumo dos detalhes da ordem de servi\u00e7o e da valia\u00e7\u00e3o do cliente.</p>\n </div>\n <div class=\"footer\">\n Atenciosamente,<br>\n <strong>Setor de TI CearaGPS</strong>\n </div>\n </div>\n</body>\n</html>",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
-580,
-480
],
"id": "836a2fdb-bbf3-474f-8dc4-fa2c5af753ea",
"name": "Enviar email (nota baixa)",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "6a12b365-4132-4017-bc2f-e872ff9af0d7",
"leftValue": "={{ $json.Nota }}",
"rightValue": 9,
"operator": {
"type": "number",
"operation": "gte"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-1180,
-120
],
"id": "54b6afed-8898-4f81-8145-00372b6567d5",
"name": "IF - Nota \u00d3tima (9-10)"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "6a12b365-4132-4017-bc2f-e872ff9af0d7",
"leftValue": "={{ $json.Nota }}",
"rightValue": 4,
"operator": {
"type": "number",
"operation": "lte"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-1180,
-460
],
"id": "bfa480a2-87eb-40d6-aa5a-0c62792828a6",
"name": "IF - Nota Ruim (1-4)"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "6a12b365-4132-4017-bc2f-e872ff9af0d7",
"leftValue": "={{ $json.Nota }}",
"rightValue": 5,
"operator": {
"type": "number",
"operation": "gte"
}
},
{
"id": "fdc9d754-8178-425f-aa3c-31394b1f9f02",
"leftValue": "={{ $json.Nota }}",
"rightValue": 8,
"operator": {
"type": "number",
"operation": "lte"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-1180,
-300
],
"id": "5a33c507-7152-42ba-ae52-9898f3815fad",
"name": "IF - Nota M\u00e9dia (5-8)"
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "={{ $('Dados').item.json['Instancia '] }}",
"remoteJid": "={{ $('Code').item.json.telefoneClienteLimpo }}",
"messageText": "=Muito obrigado pelo seu Feedback, fez valer a pena o nosso esfor\u00e7o em sermos cada vez melhores. Pensando na sua experi\u00eancia, indique um amigo para conhecer os nossos servi\u00e7os e avalie a nossa empresa no Google.\"\nGoogle: https://g.co/kgs/6toHpnr",
"options_message": {}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
-960,
-140
],
"id": "b1b863e8-3ec2-4894-92f8-3364873c5963",
"name": "Evolution API8",
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "={{ $('Dados').item.json['Instancia '] }}",
"remoteJid": "={{ $('Code').item.json.telefoneClienteLimpo }}",
"messageText": "=Recebemos sua avalia\u00e7\u00e3o de Nota {{ $('Dados').item.json.Nota }}. Agradecemos muito seu feedback, pois ele \u00e9 fundamental para aprimorarmos nossos servi\u00e7os. Vamos dar nosso melhor para que nossa nota seja 10",
"options_message": {}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
-960,
-320
],
"id": "acc1796f-e35a-40e0-9048-2f760accbb0c",
"name": "Evolution API7",
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "={{ $('Dados').item.json['Instancia '] }}",
"remoteJid": "={{ $('Code').item.json.telefoneClienteLimpo }}",
"messageText": "=Sentimos muito pela sua experi\u00eancia. Gostar\u00edamos de entender o que aconteceu.\ud83d\ude15 Nossa equipe entrar\u00e1 em contato para entender melhor a situa\u00e7\u00e3o.",
"options_message": {}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
-960,
-480
],
"id": "e52080c2-18a1-4533-9ec8-f5947a642a13",
"name": "Evolution API6",
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "executeQuery",
"query": "{{ $json.sqlQueryClienteVerificacao }}"
},
"type": "n8n-nodes-base.microsoftSql",
"typeVersion": 1.1,
"position": [
-1020,
-780
],
"id": "d669714d-3357-4eb6-b86b-8f7ac63ed63a",
"name": "Microsoft SQL",
"credentials": {
"microsoftSql": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "19e0d62d-d7fc-40f5-8ab7-f8175b015329",
"name": "Nome ",
"value": "={{ $json.NomeCliente }}",
"type": "string"
},
{
"id": "6a9a5a13-bbdb-442c-9af5-bcc06c1af75d",
"name": "Numero",
"value": "={{ $json.TelefoneCliente }}",
"type": "string"
},
{
"id": "161bdb2c-901e-48da-a19b-a97074c8058c",
"name": "Nota",
"value": "={{ $('Webhook').item.json.body.data.message.conversation }}",
"type": "number"
},
{
"id": "e1eac6dd-d9cd-4e0b-9696-9ec3932c6f3b",
"name": "Instancia ",
"value": "={{ $('Webhook').item.json.body.instance }}",
"type": "string"
},
{
"id": "8c18812a-a120-4596-b382-ff7513219e3f",
"name": "id da mensagem",
"value": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
"type": "string"
},
{
"id": "1bbd9a15-953c-4a8f-9c9b-1744f7f565aa",
"name": "os",
"value": "={{ $json.OSsistema }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-1460,
-300
],
"id": "14084daa-a8b1-47ab-ad36-90175f1af5e1",
"name": "Dados",
"onError": "continueRegularOutput"
},
{
"parameters": {
"httpMethod": "POST",
"path": "showdaia",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-1680,
-820
],
"id": "a7da807e-45e9-4051-9a22-7351f339c6f0",
"name": "Webhook"
},
{
"parameters": {
"content": "## 1. Recebimento da nota e verifica\u00e7\u00e3o do cliente no banco de dados",
"height": 340,
"width": 1380,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1720,
-940
],
"id": "b44dbf47-a6ef-4315-b6f5-da24ae2bddf8",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## 2. Verifica\u00e7\u00e3o da nota, envio de mensagem e atualiza\u00e7\u00e3o de planilha com o feedback",
"height": 580,
"width": 1380
},
"type": "n8n-nodes-base.stickyNote",
"position": [
-1720,
-560
],
"typeVersion": 1,
"id": "a8e79821-71fc-40cf-9b47-c5dff93b7149",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## 3. Agente IA para tratar do cliente",
"height": 620,
"width": 2080,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"position": [
-1720,
60
],
"typeVersion": 1,
"id": "7623cbe4-15aa-4716-b82c-9d931856a882",
"name": "Sticky Note2"
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "={{ $('Webhook').item.json.body.data.key.remoteJid }}"
},
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
-1360,
460
],
"id": "cfb6bdce-182d-4fee-802a-193fd7637979",
"name": "Simple Memory"
},
{
"parameters": {
"method": "POST",
"url": "https://api.elevenlabs.io/v1/text-to-speech/UgBBYS2sOqTuMpoF3BR0",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "output_format",
"value": "mp3_44100_128"
}
]
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "xi-api-key",
"value": "=sk_cb397d1d550bc230d9df66377184fd651c3c4e40f6066ec8"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "={{ $('Loop Over Items').item.json.text.replaceAll('**', '*') }}"
},
{
"name": "model_id",
"value": "eleven_multilingual_v2"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-260,
420
],
"id": "f6e5c149-f16d-4d96-b566-c7630fbeb223",
"name": "Eleven Labs1"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.randomNumber }}",
"rightValue": 1,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Texto"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "114bca16-4241-43b4-9017-7f1e791a2b16",
"leftValue": "={{ $json.randomNumber }}",
"rightValue": 2,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Texto"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "b274180e-e92f-4562-8d5e-b8bd3dccb55b",
"leftValue": "={{ $json.randomNumber }}",
"rightValue": 3,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Audio"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "5ff762af-4df5-4cc3-a8b5-ee10b3bed4b6",
"leftValue": "={{ $json.randomNumber }}",
"rightValue": 4,
"operator": {
"type": "number",
"operation": "equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Audio"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
-180,
140
],
"id": "0c271b1d-9975-41b4-a8a4-27ca72303bd0",
"name": "Switch1"
},
{
"parameters": {
"operation": "binaryToPropery",
"options": {}
},
"type": "n8n-nodes-base.extractFromFile",
"typeVersion": 1,
"position": [
-60,
420
],
"id": "e681eaf7-adf5-4a2a-a950-1b7ade6d7869",
"name": "Extract from File1"
},
{
"parameters": {
"jsCode": "function generateRandomNumber() {\n return Math.floor(Math.random() * 4) + 1;\n}\n\nreturn [{ json: { randomNumber: generateRandomNumber() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-600,
340
],
"id": "ffc24fdb-854a-4fa5-9ef3-12c49f92347a",
"name": "N\u00famero Aleat\u00f3rio1"
},
{
"parameters": {
"resource": "messages-api",
"instanceName": "=TesteVi",
"remoteJid": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
"messageText": "={{ $('Loop Over Items').item.json.text }}",
"options_message": {
"delay": 5000
}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
140,
120
],
"id": "a2770780-e934-4fb4-8990-9f1a5edcfeb3",
"name": "Evolution API2",
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "messages-api",
"operation": "send-audio",
"instanceName": "=TesteVi",
"remoteJid": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
"media": "={{ $json.data }}",
"options_message": {
"delay": 5000
}
},
"type": "n8n-nodes-evolution-api.evolutionApi",
"typeVersion": 1,
"position": [
140,
420
],
"id": "f9022e40-f4ea-4472-bdb4-f442470025db",
"name": "Evolution API3",
"credentials": {
"evolutionApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
-800,
240
],
"id": "a45881ec-3c27-4d7c-b9a4-38d22685e3df",
"name": "Loop Over Items"
},
{
"parameters": {},
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
-600,
120
],
"id": "bf05cb4a-f2bb-4a42-b8e7-0d5c93492dd3",
"name": "No Operation, do nothing1"
},
{
"parameters": {
"jsCode": "/**\n * Divide o texto de cada item em frases individuais e as agrupa em mensagens de at\u00e9 3 frases,\n * ignorando n\u00fameros e URLs como delimitadores.\n * Cada grupo de frases \u00e9 retornado como um novo item em um array.\n *\n * @param {Array<Object>} items - Um array de objetos, onde cada objeto pode ter um campo 'json.output' contendo o texto a ser dividido.\n * @returns {Array<Object>} Um array de objetos, onde cada objeto cont\u00e9m um grupo de frases no campo 'json.text',\n * ou um erro se o campo 'output' estiver ausente.\n */\nfunction splitTextSafely(items) {\n const result = [];\n\n items.forEach(item => {\n // Acessa o campo 'output' dinamicamente, ou uma string vazia se n\u00e3o existir.\n const text = item.json?.output || '';\n\n // Se o texto estiver vazio, adiciona um objeto de erro ao resultado.\n if (!text) {\n result.push({ json: { error: \"No output field provided in input.\" } });\n return; // Pula para o pr\u00f3ximo item\n }\n\n // Express\u00e3o regular para corresponder a delimitadores de frase v\u00e1lidos\n // enquanto ignora n\u00fameros e URLs.\n // - `(?<!\\d)`: N\u00e3o precede um d\u00edgito (evita dividir n\u00fameros como \"1.2\").\n // - `(?<=[.!?])`: Precede um ponto final, ponto de interroga\u00e7\u00e3o ou exclama\u00e7\u00e3o.\n // - `\\s+`: Seguido por um ou mais espa\u00e7os em branco.\n // - `(?!\\d)`: N\u00e3o seguido por um d\u00edgito (evita dividir URLs ou n\u00fameros de vers\u00e3o).\n // - `|`: OU\n // - `\\s+(?=https?:\\/\\/)`: Espa\u00e7os em branco seguidos por \"http://\" ou \"https://\" (para manter URLs intactas).\n const regex = /(?<!\\d)(?<=[.!?])\\s+(?!\\d)|\\s+(?=https?:\\/\\/)/g;\n\n // Divide o texto com base na express\u00e3o regular, remove espa\u00e7os em branco extras\n // e filtra quaisquer strings vazias resultantes.\n const sentences = text.split(regex).map(sentence => sentence.trim()).filter(Boolean);\n\n // Agrupa as frases em mensagens de at\u00e9 3\n for (let i = 0; i < sentences.length; i += 3) {\n // Pega um grupo de at\u00e9 3 frases\n const chunk = sentences.slice(i, i + 3);\n // Junta as frases do grupo com um espa\u00e7o\n const combinedSentence = chunk.join(' ');\n // Adiciona o grupo combinado ao resultado\n result.push({ json: { text: combinedSentence } });\n }\n });\n\n return result;\n}\n\n// Executa a fun\u00e7\u00e3o com a entrada din\u00e2mica de um n\u00f3 anterior (assumindo que 'items' \u00e9 fornecido).\n// Esta linha seria usada em um ambiente onde a fun\u00e7\u00e3o \u00e9 executada e seu retorno \u00e9 o resultado final.\nreturn splitTextSafely(items);\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-1060,
240
],
"id": "bc72199d-810a-4362-992b-6134a8eba894",
"name": "Dividir saidas1"
},
{
"parameters": {
"promptType": "define",
"text": "={{ $('Webhook').item.json.body.data.message.conversation }}",
"hasOutputParser": true,
"options": {
"systemMessage": "Prompt para Assistente Virtual Z\u00e9 da Rota (CearaGPS):\n\"Voc\u00ea \u00e9 o Z\u00e9 da Rota, o assistente virtual especialista da CearaGPS (www.cearagps.com.br). Sua principal miss\u00e3o \u00e9 tirar d\u00favidas sobre a empresa, nossos planos de rastreamento e prote\u00e7\u00e3o veicular, e outras informa\u00e7\u00f5es relacionadas ao nosso ramo de atua\u00e7\u00e3o, com o objetivo final de qualificar leads e conduzir o cliente at\u00e9 a etapa de fechamento de contrato com um consultor humano.\n\nPersona e Tom de Voz:\nAja como um especialista em vendas de seguran\u00e7a automotiva, sendo o MAIS HUMANO POSS\u00cdVEL em suas intera\u00e7\u00f5es, mas mantendo profissionalismo e cordialidade. Evite ser rob\u00f3tico. Sua comunica\u00e7\u00e3o deve ser clara, amig\u00e1vel, direta, assertiva e eficiente. Seu objetivo \u00e9 deixar o cliente ciente de todos os benef\u00edcios e pontos fortes da Cear\u00e1GPS, superar obje\u00e7\u00f5es com t\u00e1ticas de venda e prepar\u00e1-lo para o fechamento.\n\nSobre a CearaGPS e Grupo Ramos (Contexto para suas conversas):\n\nA CearaGPS foi fundada em 2012 por Euram Ramos, nosso presidente, ap\u00f3s ele mesmo ser v\u00edtima de um roubo de ve\u00edculo. Esse evento intensificou seu desejo de ajudar o pr\u00f3ximo e combater a criminalidade.\nA empresa come\u00e7ou na garagem da casa dos pais dele e hoje \u00e9 refer\u00eancia no Brasil em rastreamento e prote\u00e7\u00e3o veicular.\nO sucesso levou \u00e0 cria\u00e7\u00e3o da CRX Brasil (h\u00e1 mais de 10 anos oferecendo solu\u00e7\u00f5es para empres\u00e1rios do ramo, top 05 no Brasil) e, mais recentemente, da Resolve Prote\u00e7\u00e3o Veicular. O grupo tamb\u00e9m foi pioneiro em mentorias e imers\u00f5es educacionais em mais de 18 estados.\nInforma\u00e7\u00f5es da Empresa (para consulta e fornecimento ao cliente):\n\nContato Principal: Central de Atendimento 24h: 0800 606 8153 ou (85) 3484.6006\nHor\u00e1rios de funcionamento presencial:\nSegunda a quinta: 08:00 \u00e0s 20:00\nSexta-feira: 08:00 \u00e0s 19:00\nS\u00e1bado: 08:00 \u00e0s 16:00\nD\u00favidas ou sugest\u00f5es (e-mail): contato@cearagps.com.br\nFinanceiro (e-mail e WhatsApp): financeiro@cearagps.com.br | (85) 98208.2489\nWhatsApp Geral: (85) 98208.2489\nEndere\u00e7o: R. A, N\u00ba 981 \u2013 Parque Dois Irm\u00e3os, Fortaleza \u2013 CE, 60540-256\nSua Miss\u00e3o Detalhada:\n\nAuxiliar clientes na escolha do plano adequado para rastreamento e prote\u00e7\u00e3o veicular.\nInteragir com ferramentas de API (n8n) para consultar a Placa FIPE, trazendo apenas os planos compat\u00edveis com o ve\u00edculo informado.\nPromover um atendimento \u00e1gil, direto e eficiente.\nEncaminhar clientes interessados para um consultor humano quando necess\u00e1rio.\n\ud83d\udee0\ufe0f REGRAS ESSENCIAIS DE ATENDIMENTO:\n\n1\ufe0f\u20e3 Consulta da Placa FIPE e Retorno de Planos:\n\nSEMPRE que o cliente informar a placa do ve\u00edculo, voc\u00ea deve acionar o fluxo do n8n para consulta FIPE.\nRetorne APENAS os planos compat\u00edveis com base em:\n\u2705 Valor do bem (para definir a cobertura do plano de prote\u00e7\u00e3o)\n\u2705 Tipo de ve\u00edculo (Carro ou Moto)\n\u2705 Planos adequados para aquele ve\u00edculo espec\u00edfico.\nExemplo:\n\ud83d\udc64 Cliente: \"Quais planos voc\u00eas t\u00eam para meu carro?\"\n\ud83e\udd16 Z\u00e9 da Rota: \"Posso verificar os planos ideais para o seu ve\u00edculo! Para isso, me informe a placa do carro, por favor. \ud83d\udd0d\"\n(Ap\u00f3s consulta FIPE via n8n, retorne apenas planos compat\u00edveis)\nSe a consulta n\u00e3o for poss\u00edvel ou o cliente n\u00e3o quiser informar a placa, pergunte:\n\u2753 \"Tudo bem! Voc\u00ea pode me dizer o modelo e ano do seu ve\u00edculo? Assim, consigo te apresentar os planos mais adequados.\"\n2\ufe0f\u20e3 Estrutura de Respostas:\n\n\u2705 Seja direto, amig\u00e1vel e objetivo. Evite textos longos ou excessivamente t\u00e9cnicos.\n\u2705 Use emojis moderadamente (\ud83d\ude97\ud83d\udd0d\ud83d\udcf2) para tornar a conversa mais leve.\n\u2705 Sempre busque capturar a inten\u00e7\u00e3o do cliente antes de apresentar planos.\n\u2705 Sempre responda com uma pergunta para manter o cliente engajado e a conversa fluindo.\n\u2705 Caso o cliente traga um assunto fora do escopo (ex: seguro tradicional), redirecione a conversa para rastreamento e prote\u00e7\u00e3o veicular.\nExemplo:\n\ud83d\udc64 Cliente: \"Voc\u00eas fazem seguro tamb\u00e9m?\"\n\ud83e\udd16 Z\u00e9 da Rota: \"N\u00f3s somos especialistas em rastreamento e prote\u00e7\u00e3o contra roubo e furto! Nosso servi\u00e7o inclui rastreamento 24h e at\u00e9 100% de cobertura da Tabela FIPE. Posso verificar os planos ideais para o seu ve\u00edculo?\"\n3\ufe0f\u20e3 Planos e Benef\u00edcios da Cear\u00e1 GPS (Apresente SOMENTE os compat\u00edveis ap\u00f3s consulta FIPE):\n\n\ud83d\udccc **Planos para Motos** (V\u00e1lido para residentes de Fortaleza, Caucaia, Eus\u00e9bio, Maracana\u00fa, Aquiraz, Itaitinga, Pacatuba e Maranguape):\n* Rastreamento + Prote\u00e7\u00e3o Veicular (Cobertura 10 MIL) \u2013 R$ 85,00/m\u00eas\n* Rastreamento + Prote\u00e7\u00e3o Veicular (Cobertura 20 MIL) \u2013 R$ 105,00/m\u00eas\n* Rastreamento + Prote\u00e7\u00e3o Veicular (Cobertura 30 MIL) \u2013 R$ 120,00/m\u00eas\n* Instala\u00e7\u00e3o: R$ 200,00\n\n\ud83d\udccc **Planos para Carros** (V\u00e1lido para residentes de Fortaleza, Caucaia, Eus\u00e9bio, Maracana\u00fa, Aquiraz, Itaitinga, Pacatuba e Maranguape):\n* Rastreamento + Prote\u00e7\u00e3o Veicular (Cobertura 30 MIL) \u2013 R$ 130,00/m\u00eas\n* Rastreamento + Prote\u00e7\u00e3o Veicular (Cobertura 40 MIL) \u2013 R$ 150,00/m\u00eas\n* Rastreamento + Prote\u00e7\u00e3o Veicular (Cobertura 60 MIL) \u2013 R$ 179,90/m\u00eas\n* Instala\u00e7\u00e3o: R$ 200,00\n\n\ud83d\udee1\ufe0f **Diferenciais da Cear\u00e1GPS (Destaque-os!):**\n* \u2714 Monitoramento 24h em tempo real\n* \u2714 Acesso via aplicativo (Android & iOS)\n* \u2714 Bloqueio remoto do ve\u00edculo (abaixo de 10km/h por seguran\u00e7a)\n* \u2714 Central de atendimento 0800 24h\n* \u2714 Equipe de recupera\u00e7\u00e3o de ve\u00edculos pr\u00f3pria e integrada \u00e0 Pol\u00edcia\n* \u2714 Cobertura de at\u00e9 100% da Tabela FIPE em caso de roubo/furto n\u00e3o recuperado\n4\ufe0f\u20e3 Chamadas para A\u00e7\u00e3o (CTAs) e Fechamento:\n\nPara engajar e qualificar:\n\"Gostaria de consultar um plano ideal para seu ve\u00edculo? Me informe a placa que eu verifico para voc\u00ea! \ud83d\udd0d\"\n\"Podemos prosseguir com a contrata\u00e7\u00e3o do rastreamento? Assim, j\u00e1 garantimos sua prote\u00e7\u00e3o.\"\n\"Queremos deixar seu ve\u00edculo seguro! Vamos seguir com a instala\u00e7\u00e3o?\"\nSe o cliente quiser proposta formal:\n\"Posso te enviar a proposta por WhatsApp ou E-mail? Em breve, um consultor especializado entrar\u00e1 em contato para te explicar todos os detalhes!\"\nSe o cliente quiser comparar com concorrente:\n\"Entendo! Podemos te ajudar a comparar os benef\u00edcios e vantagens do nosso servi\u00e7o com a proposta que recebeu. O que considera mais importante na sua escolha?\"\n5\ufe0f\u20e3 Respostas Ajustadas para Situa\u00e7\u00f5es Espec\u00edficas:\n\nCliente diz que vai pensar:\n\ud83e\udd16 Z\u00e9 da Rota: \"Claro! Se precisar de mais informa\u00e7\u00f5es, estou por aqui para te ajudar. Enquanto isso, posso te enviar um resumo dos planos para facilitar sua an\u00e1lise?\"\nCliente solicita um or\u00e7amento em PDF:\n\ud83e\udd16 Z\u00e9 da Rota: \"Sim, posso te enviar a proposta por WhatsApp ou E-mail. Qual a melhor forma para voc\u00ea receber?\"\nCliente menciona um concorrente (proposta mais barata):\n\ud83e\udd16 Z\u00e9 da Rota: \"Entendo! Nossos planos incluem rastreamento e prote\u00e7\u00e3o com equipe pr\u00f3pria de recupera\u00e7\u00e3o e cobertura de at\u00e9 100% da Tabela FIPE. Posso te ajudar a comparar as vantagens e ver como nosso custo-benef\u00edcio \u00e9 superior?\"\nCliente pede instala\u00e7\u00e3o fora das cidades atendidas:\n\ud83e\udd16 Z\u00e9 da Rota: \"Atualmente, nossa instala\u00e7\u00e3o padr\u00e3o cobre Fortaleza e regi\u00e3o metropolitana (Caucaia, Eus\u00e9bio, Maracana\u00fa, Aquiraz, Itaitinga, Pacatuba e Maranguape). Mas, dependendo da sua localiza\u00e7\u00e3o exata, podemos verificar uma possibilidade de instala\u00e7\u00e3o para voc\u00ea! Qual seria a cidade?\"\nCliente pergunta sobre bloqueio remoto:\n\ud83e\udd16 Z\u00e9 da Rota: \"Sim, nosso sistema possui bloqueio remoto! Para sua seguran\u00e7a e a do ve\u00edculo, o bloqueio \u00e9 efetivado quando o ve\u00edculo est\u00e1 abaixo de 10km/h. Isso evita acidentes e garante uma parada segura. Quer saber mais sobre como essa funcionalidade te protege?\"\nCliente quer rastrear um ve\u00edculo que n\u00e3o \u00e9 dele:\n\ud83e\udd16 Z\u00e9 da Rota: \"Sim, \u00e9 poss\u00edvel! O plano pode ser contratado por qualquer pessoa, mesmo que o ve\u00edculo n\u00e3o esteja no seu nome. No entanto, \u00e9 importante saber que, em caso de sinistro (roubo ou furto n\u00e3o recuperado), a indeniza\u00e7\u00e3o ser\u00e1 paga ao propriet\u00e1rio legal do ve\u00edculo, conforme consta no documento, tudo bem?\"\n\ud83d\udce2 Conclus\u00e3o e Lembretes Finais:\n\n\u2705 Prioridade M\u00e1xima: Sempre consulte a Placa FIPE via n8n (ou pe\u00e7a modelo/ano) ANTES de oferecer planos.\n\u2705 Foco no Cliente: Responda de forma clara, objetiva e sempre incentive o cliente a avan\u00e7ar no funil de vendas.\n\u2705 Proatividade: Utilize chamadas para a\u00e7\u00e3o para aumentar as convers\u00f5es.\n\u2705 Precis\u00e3o: Evite oferecer planos que n\u00e3o se aplicam ao ve\u00edculo consultado.\n\u2705 Encaminhamento: Direcione clientes interessados e qualificados para um consultor humano para o fechamento quando o lead estiver maduro ou solicitar explicitamente.\nSeu objetivo \u00e9 ser o melhor especialista em prote\u00e7\u00e3o veicular, ajudando cada cliente a encontrar a seguran\u00e7a que precisa com a CearaGPS!\""
}
},
"id": "0f07f0e1-88e5-46b2-9bdd-f1899fbcbad1",
"name": "Z\u00e9 da Rota",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1420,
240
],
"typeVersion": 1.8
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "1w4W4qVK7g8mvdv3M14Gsq4StrBmCSA8FPe6B7sngMyc",
"mode": "list",
"cachedResultName": "NPS_TECNICO",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1w4W4qVK7g8mvdv3M14Gsq4StrBmCSA8FPe6B7sngMyc/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "P\u00e1gina1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1w4W4qVK7g8mvdv3M14Gsq4StrBmCSA8FPe6B7sngMyc/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Nota": "={{ $('Dados').item.json.Nota }}",
"OS": "={{ $('Dados').item.json.os }}",
"Nome": "={{ $('Dados').item.json['Nome '] }}"
},
"matchingColumns": [
"Nota"
],
"schema": [
{
"id": "OS",
"displayName": "OS",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Nome",
"displayName": "Nome",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Nota",
"displayName": "Nota",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.6,
"position": [
-760,
-480
],
"id": "a1895fe1-0a7f-4315-a452-27cb5fd54730",
"name": "SAC",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "1w4W4qVK7g8mvdv3M14Gsq4StrBmCSA8FPe6B7sngMyc",
"mode": "list",
"cachedResultName": "NPS_TECNICO",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1w4W4qVK7g8mvdv3M14Gsq4StrBmCSA8FPe6B7sngMyc/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "P\u00e1gina1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1w4W4qVK7g8mvdv3M14Gsq4StrBmCSA8FPe6B7sngMyc/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Nota": "={{ $('Dados').item.json.Nota }}",
"OS": "={{ $('Dados').item.json.os }}",
"Nome": "={{ $('Dados').item.json['Nome '] }}"
},
"matchingColumns": [
"Nota"
],
"schema": [
{
"id": "OS",
"displayName": "OS",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Nome",
"displayName": "Nome",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Nota",
"displayName": "Nota",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.6,
"position": [
-760,
-220
],
"id": "737dfcfa-15ab-450d-8477-cfb099fdda12",
"name": "SAC1",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
}
],
"connections": {
"SerpAPI": {
"ai_tool": [
[
{
"node": "Z\u00e9 da Rota",
"type": "ai_tool",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Z\u00e9 da Rota",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"If (Verifica Contato)": {
"main": [
[],
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"If (Mensagem ou Nota)": {
"main": [
[
{
"node": "Dados",
"type": "main",
"index": 0
}
],
[
{
"node": "Conversa",
"type": "main",
"index": 0
}
]
]
},
"Conversa": {
"main": [
[
{
"node": "Z\u00e9 da Rota",
"type": "main",
"index": 0
}
]
]
},
"Verificar se o cliente esta no banco de dados": {
"main": [
[
{
"node": "Microsoft SQL1",
"type": "main",
"index": 0
}
],
[
{
"node": "If (Mensagem ou Nota)",
"type": "main",
"index": 0
}
]
]
},
"Microsoft SQL1": {
"main": [
[
{
"node": "If (Mensagem ou Nota)",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Microsoft SQL",
"type": "main",
"index": 0
}
]
]
},
"IF - Nota \u00d3tima (9-10)": {
"main": [
[
{
"node": "Evolution API8",
"type": "main",
"index": 0
}
]
]
},
"IF - Nota Ruim (1-4)": {
"main": [
[
{
"node": "Evolution API6",
"type": "main",
"index": 0
}
]
]
},
"IF - Nota M\u00e9dia (5-8)": {
"main": [
[
{
"node": "Evolution API7",
"type": "main",
"index": 0
}
]
]
},
"Evolution API8": {
"main": [
[
{
"node": "SAC1",
"type": "main",
"index": 0
}
]
]
},
"Evolution API7": {
"main": [
[
{
"node": "SAC1",
"type": "main",
"index": 0
}
]
]
},
"Evolution API6": {
"main": [
[
{
"node": "SAC",
"type": "main",
"index": 0
}
]
]
},
"Microsoft SQL": {
"main": [
[
{
"node": "Verificar se o cliente esta no banco de dados",
"type": "main",
"index": 0
}
]
]
},
"Dados": {
"main": [
[
{
"node": "IF - Nota \u00d3tima (9-10)",
"type": "main",
"index": 0
},
{
"node": "IF - Nota M\u00e9dia (5-8)",
"type": "main",
"index": 0
},
{
"node": "IF - Nota Ruim (1-4)",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "If (Verifica Contato)",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "Z\u00e9 da Rota",
"type": "ai_memory",
"index": 0
}
]
]
},
"Eleven Labs1": {
"main": [
[
{
"node": "Extract from File1",
"type": "main",
"index": 0
}
]
]
},
"Switch1": {
"main": [
[
{
"node": "Evolution API2",
"type": "main",
"index": 0
}
],
[
{
"node": "Evolution API2",
"type": "main",
"index": 0
}
],
[
{
"node": "Eleven Labs1",
"type": "main",
"index": 0
}
],
[
{
"node": "Eleven Labs1",
"type": "main",
"index": 0
}
]
]
},
"Extract from File1": {
"main": [
[
{
"node": "Evolution API3",
"type": "main",
"index": 0
}
]
]
},
"N\u00famero Aleat\u00f3rio1": {
"main": [
[
{
"node": "Switch1",
"type": "main",
"index": 0
}
]
]
},
"Evolution API2": {
"main": [
[]
]
},
"Evolution API3": {
"main": [
[]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "No Operation, do nothing1",
"type": "main",
"index": 0
}
],
[
{
"node": "N\u00famero Aleat\u00f3rio1",
"type": "main",
"index": 0
}
]
]
},
"Dividir saidas1": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Z\u00e9 da Rota": {
"main": [
[
{
"node": "Dividir saidas1",
"type": "main",
"index": 0
}
]
]
},
"SAC": {
"main": [
[
{
"node": "Enviar email (nota baixa)",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"templateCredsSetupCompleted": true
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
evolutionApigmailOAuth2googleSheetsOAuth2ApimicrosoftSqlopenAiApiserpApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Nps-Com-Atendimento-Ao-Cliente. Uses toolSerpApi, lmChatOpenAi, microsoftSql, gmail. Webhook trigger; 34 nodes.
Source: https://github.com/onaloiroc/n8n-projetos/blob/b79ca65511e6b19a16d422c722765a6d86f8711b/NPS-com-Atendimento-ao-Cliente — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Universal Expense tracker. Uses telegram, httpRequest, openAi, googleSheets. Webhook trigger; 33 nodes.
L&D_AgentsAI_ATIVO. Uses httpRequest, agent, googleCalendarTool, toolSerpApi. Webhook trigger; 93 nodes.
Enhance your support, onboarding, and internal knowledge workflows with an intelligent RAG-powered chatbot that responds using live data stored in Google Sheets. 🤖📚 Built for teams that rely on struct
leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.
This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.