{
  "name": "process-refund-logic-agent",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "5562738d-2e64-4881-bdea-559adc5e7d10",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        0,
        0
      ],
      "id": "ced62794-6424-4953-a67e-d4f6783431e3",
      "name": "Webhook"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        96,
        208
      ],
      "id": "c132cf1e-4e09-4ea2-b668-8db536035703",
      "name": "Google Gemini Chat Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsonSchemaExample": "{\n  \"nome\": \"Alon\",\n  \"email\": \"alon@exemplo.com\",\n  \"produto_reembolso\": \"Software de Contabilidade\",\n  \"comentario\": \"O software \u00e9 bom mas tive problemas pessoais\",\n  \"sentimento\": \"neutro\",\n  \"cliente_encontrado\": true,\n  \"nome_completo\": \"Alon Pinheiro\",\n  \"total_gasto_cliente\": 1000,\n  \"dias_desde_compra\": 15\n}\n\n"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.3,
      "position": [
        448,
        208
      ],
      "id": "fbc58a3d-1e9f-44db-8d36-bb8bbae974e1",
      "name": "Structured Output Parser (json)"
    },
    {
      "parameters": {
        "content": "Standard Customer",
        "height": 224,
        "width": 448
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        784,
        -192
      ],
      "id": "d28bef79-fd1b-4a35-a33c-c1949a580f27",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "VIP Customer\n\n",
        "height": 208,
        "width": 832,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        784,
        48
      ],
      "id": "bc3f8ac0-e5e1-4cbd-85d1-6a9702d4c686",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "Complaining Customer",
        "height": 208,
        "width": 832,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        784,
        272
      ],
      "id": "bd778250-62b0-452d-a3ec-9318e269fe69",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "Customer within the deadline",
        "height": 224,
        "width": 832,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        784,
        496
      ],
      "id": "2def5003-e705-44d1-acab-082458d9d6b1",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "sendTo": "={{ $('Agent: Process Refund Logic').item.json.output.email }}",
        "subject": "Retorno sobre sua solicita\u00e7\u00e3o de reembolso",
        "message": "=Ol\u00e1 {{ $('Agent: Process Refund Logic').item.json.output.nome }}. \n\nRecebemos seu pedido de reembolso.\n\nVerificamos aqui que voc\u00ea ainda est\u00e1 dentro do prazo de garantia incondicional de 7 dias. \ud83d\udc4d\n\nNossa equipe financeira j\u00e1 foi notificada e o processo ser\u00e1 seguido conforme nossos termos.",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.2,
      "position": [
        832,
        544
      ],
      "id": "1ee03df2-bd84-4688-8cbe-5b7f7c93c58b",
      "name": "Gmail: Send Retention Email",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": "={{ $('Agent: Process Refund Logic').item.json.output.email }}",
        "subject": "Retorno sobre sua solicita\u00e7\u00e3o de reembolso",
        "message": "=Ol\u00e1, {{ $('Agent: Process Refund Logic').item.json.output.nome }}. Analisei sua solicita\u00e7\u00e3o de reembolso. Verifiquei aqui que a compra foi efetuada h\u00e1 mais de 7 dias. Como o prazo de garantia incondicional \u00e9 de 7 dias corridos, infelizmente n\u00e3o conseguiremos prosseguir com o reembolso. Caso tenha d\u00favidas sobre o acesso ou uso do produto, nossa equipe de suporte continua \u00e0 disposi\u00e7\u00e3o para te ajudar a tirar o melhor proveito dele. Atenciosamente, Alon",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.2,
      "position": [
        1040,
        -144
      ],
      "id": "83ea6981-a7f7-41b1-9fbc-dd6fbea1ae4d",
      "name": "Gmail: Send Deadline Expired Email",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "={{ $env.SHEETS_REFUND_ID }}",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "={{ $env.SHEETS_REFUND_TAB_NAME }}",
          "mode": "name"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.7,
      "position": [
        304,
        224
      ],
      "id": "7f43d711-678d-4675-aecc-993dcbc143db",
      "name": "Sheets: Read Customer Database",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "={{ $env.TELEGRAM_REFUND_CHAT_ID}}",
        "text": "=\u26a0\ufe0f Aten\u00e7\u00e3o aqui, gente.\n\nTemos um cliente que pediu reembolso fora do prazo, mas mandou uma mensagem bem pesada..\n\nO coment\u00e1rio dele foi esse: \"{{ $('Agent: Process Refund Logic').item.json.output.comentario }}\"\n\nPra evitar que ele v\u00e1 pro Reclame Aqui ou procon, eu j\u00e1 respondi dizendo que escalei o caso pra ger\u00eancia. Conseguem dar uma aten\u00e7\u00e3o pra esse caso por favor?\n\nCliente: {{ $('Agent: Process Refund Logic').item.json.output.nome }}\nE-mail: {{ $('Agent: Process Refund Logic').item.json.output.email }}\nProduto: {{ $('Agent: Process Refund Logic').item.json.output.produto_reembolso }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1424,
        304
      ],
      "id": "d71b9117-2143-4a6a-86f4-20e2562e242f",
      "name": "Telegram: Complaining Customer Alert",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "={{ $env.TELEGRAM_REFUND_CHAT_ID}}",
        "text": "=[Pedido de Reembolso fora do Prazo] \n\nPessoal, chegou um pedido de reembolso de um cliente que estourou o prazo de 7 dias (t\u00e1 com {{ $('Agent: Process Refund Logic').item.json.output.dias_desde_compra }} dias).\n\nO sistema barrou, mas como ele \u00e9 VIP, pe\u00e7o que verifiquem com aten\u00e7\u00e3o e avaliem reembolsar o aluno.\n\nAvisei pra ele que a gente ia analisar com carinho e dar um retorno em 24h. Conseguem ver com o financeiro se liberamos essa exce\u00e7\u00e3o pra n\u00e3o perder o cliente?\n\nCliente: {{ $('Agent: Process Refund Logic').item.json.output.nome }}\nE-mail: {{ $('Agent: Process Refund Logic').item.json.output.email }}\nProduto: {{ $('Agent: Process Refund Logic').item.json.output.produto_reembolso }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1424,
        80
      ],
      "id": "2395ae37-9046-4bf3-9134-2074f73e2209",
      "name": "Telegram: VIP Customer Alert",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": "={{ $('Agent: Process Refund Logic').item.json.output.email }}",
        "subject": "Atualiza\u00e7\u00e3o sobre seu pedido de reembolso",
        "message": "=Ol\u00e1, {{ $('Agent: Process Refund Logic').item.json.output.nome }}.\nRecebi sua solicita\u00e7\u00e3o de reembolso. Notei que o prazo contratual de 7 dias j\u00e1 expirou, que \u00e9 o prazo de garantia do produto.\nPor\u00e9m, como voc\u00ea \u00e9 um dos nossos melhores clientes, n\u00e3o quero encerrar seu caso automaticamente. Encaminhei seu pedido pessoalmente para a nossa equipe financeira analisar uma exce\u00e7\u00e3o.\nEm at\u00e9 24h a nossa equipe entrar\u00e1 em contato com voc\u00ea para dar um retorno.\nAtenciosamente, \nAlon",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.2,
      "position": [
        1216,
        80
      ],
      "id": "c52d1c3f-3fc6-429e-9f98-2933dc2bc355",
      "name": "Gmail: Send VIP Refund Notification",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": "={{ $('Agent: Process Refund Logic').item.json.output.email }}",
        "subject": "Recebemos sua mensagem - Caso escalado para a Ger\u00eancia",
        "message": "=Ol\u00e1, {{ $('Agent: Process Refund Logic').item.json.output.nome }}.\nLi atentamente seu coment\u00e1rio e lamento sua insatisfa\u00e7\u00e3o.\nO sistema identificou que a compra est\u00e1 fora do prazo de garantia de 7 dias. No entanto, dada a seriedade do seu relato, optei por n\u00e3o finalizar o atendimento por aqui.\nEscalei seu caso com prioridade para o nosso gerente de suporte. Ele vai analisar a situa\u00e7\u00e3o e retornar\u00e1 o contato o mais breve poss\u00edvel para resolvermos isso.\nAtenciosamente, \nAlon",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.2,
      "position": [
        1216,
        304
      ],
      "id": "507c4dbf-b4a9-473a-8caa-0e631c66d3cd",
      "name": "Gmail: Send Critical Support Reply",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "={{ $env.TELEGRAM_REFUND_CHAT_ID}}",
        "text": "=[Pedido de Reembolso]\n\nPessoal, chegou um pedido de reembolso de um cliente dentro do prazo de 7 dias.\n\nO coment\u00e1rio dele foi esse: \"{{ $('Agent: Process Refund Logic').item.json.output.comentario }}\"\n\nCliente: {{ $('Agent: Process Refund Logic').item.json.output.nome }}\nE-mail: {{ $('Agent: Process Refund Logic').item.json.output.email }}\nProduto: {{ $('Agent: Process Refund Logic').item.json.output.produto_reembolso }}",
        "replyMarkup": "=none",
        "forceReply": {},
        "replyKeyboardOptions": {},
        "replyKeyboardRemove": {},
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1040,
        544
      ],
      "id": "63b00939-1382-4cfb-bd82-2173db954836",
      "name": "Telegram: Alert New Refund Request",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.body.data.fields }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=Voc\u00ea \u00e9 um agente que processa respostas de um formul\u00e1rio de reembolso.\n\nVoc\u00ea deve trabalhar apenas com os dados recebidos na entrada e pela planilha contida na tool.\n\nAs informa\u00e7\u00f5es que voc\u00ea ir\u00e1 precisar retornar s\u00e3o as seguintes:\n\n- nome: Nome do cliente proveniente do formul\u00e1rio\n- email: E-mail do cliente proveniente do formul\u00e1rio\n- produto_reembolso: De qual produto o cliente est\u00e1 pedindo reembolso, proveniente do formul\u00e1rio\n- comentario: Coment\u00e1rio por escrito do cliente, proveniente do formul\u00e1rio\n- sentimento: Uma an\u00e1lise de sentimento a partir do coment\u00e1rio do cliente no formul\u00e1rio (instru\u00e7\u00f5es mais \u00e0 frente no prompt)\n- cliente_encontrado: uma informa\u00e7\u00e3o de verdadeiro ou falso informando se encontrou o cliente na planilha (tool)\n- nome_completo: Nome do cliente proveniente da planilha (tool)\n- total_gasto_cliente: Valor total gasto pelo cliente proveniente da planilha (tool)\n- dias_desde_compra: h\u00e1 quantos dias o cliente fez a \u00faltima compra, calculado a partir dos dados da planilha (instru\u00e7\u00f5es mais \u00e0 frente no prompt)\n\n\n\nSiga rigorosamente as etapas abaixo.\n\n---\n\n### 1) Extra\u00e7\u00e3o dos campos do formul\u00e1rio\nExtraia os seguintes campos da resposta do formul\u00e1rio:\n- Nome\n- Email\n- Qual produto que voc\u00ea deseja reembolso?\n- Comente aqui o que houve\n\nSe algum campo de texto n\u00e3o existir, retorne um texto vazio \"\".\n\n---\n\n### 2) Busca do cliente na base\n- Normalize o email (trim + lowercase).\n- Use o email como \u00daNICA chave para buscar o cliente na base (Google Sheets) via tool.\n- Nunca invente dados do cliente.\n\n- Se encontrar o cliente:\n  - cliente_encontrado = true\n  - Preencha com os dados exatos da planilha:\n    - nome_completo: valor da coluna \"nome_cliente\"\n    - total_gasto_cliente: valor da coluna \"total_gasto_cliente\"\n\n- Se n\u00e3o encontrar o cliente na planilha:\n  - cliente_encontrado = false\n  - nome_completo: \u201c\u201d\n  - total_gasto_cliente: \u201c\u201d\n\n\n\n\n---\n\n### 3) Datas e prazo\n- Calcule a informa\u00e7\u00e3o dias_desde_compra, subtraindo a data atual da data da \u00faltima compra do cliente\n- A data da \u00faltima compra vem da planilha na tool na coluna data_ultima_compra.\n- A data atual: {{ $now }}\n- Considere apenas a parte da data (dia/m\u00eas/ano) e ignore o hor\u00e1rio\n- Voc\u00ea N\u00c3O deve gerar data atual por conta pr\u00f3pria.\n\nCom essas duas datas:\n- Calcule a quantidade de dias corridos entre data_atual e data_ultima_compra.\n- O c\u00e1lculo deve considerar apenas dias corridos.\n- Se data_ultima_compra ou data_atual n\u00e3o existirem, dias_desde_compra deve ser 0 (zero).\n\n\u26a0\ufe0f Importante:\n- Voc\u00ea N\u00c3O deve decidir aprova\u00e7\u00e3o ou nega\u00e7\u00e3o de reembolso.\n- Apenas calcule e informe os dias desde a compra.\n\n---\n\n### 4) An\u00e1lise de sentimento\nAnalise exclusivamente o texto do campo \"Comente aqui o que houve\" e classifique em:\n- positivo\n- neutro\n- negativo\n- muito_negativo\n\nCrit\u00e9rios:\nPOSITIVO: Texto educado ou positivo.\nNEUTRO: Texto objetivo, calmo ou vazio.\nNEGATIVO: Frustra\u00e7\u00e3o clara ou tom r\u00edspido.\nMUITO_NEGATIVO: Agressivo, xingamentos, amea\u00e7as de procon, processos, reclame aqui ou outros tipos de amea\u00e7a ou CAPS LOCK.\n\nNa d\u00favida entre negativo e muito negativo, seja conservador, escolha negativo.\n\n---\n\n### 5) Formato de sa\u00edda (OBRIGAT\u00d3RIO)\nRetorne APENAS um JSON cru.\nN\u00c3O use markdown (sem ```json).\n\nExemplo de estrutura desejada:\n\n{\n  \"nome\": \"Texto ou vazio\",\n  \"email\": \"Texto ou vazio\",\n  \"produto_reembolso\": \"Texto ou vazio\",\n  \"comentario\": \"Texto ou vazio\",\n  \"sentimento\": \"Texto ou vazio\",\n  \"cliente_encontrado\": true ou false,\n  \"nome_completo\": \"Texto ou vazio\",\n  \"total_gasto_cliente\": numero,\n  \"dias_desde_compra\": numero,\n  }\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        208,
        0
      ],
      "id": "06fca38d-a028-4235-a7b1-36605822c535",
      "name": "Agent: Process Refund Logic"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "8cbd75b5-4585-4a19-93d5-9fd0dd870979",
              "leftValue": "={{ $json.output.dias_desde_compra }}",
              "rightValue": 7,
              "operator": {
                "type": "number",
                "operation": "gt"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        560,
        0
      ],
      "id": "12ef0a2e-6997-4af8-908b-5e4fe0591a0b",
      "name": "IF: Refund Deadline Expired?"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "75f80ee2-7f13-441f-9555-5cf8c2952d42",
              "leftValue": "={{ $('Agent: Process Refund Logic').item.json.output.total_gasto_cliente }}",
              "rightValue": 3000,
              "operator": {
                "type": "number",
                "operation": "lt"
              }
            },
            {
              "id": "6f0c4af1-9546-4e1f-9e5d-65c2c96cf370",
              "leftValue": "={{ $('Agent: Process Refund Logic').item.json.output.sentimento }}",
              "rightValue": "muito_negativo",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        832,
        -144
      ],
      "id": "463f946a-f200-4d1a-8654-945fd32eb280",
      "name": "IF: Standard Customer?"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "9fa5c00e-b3b6-40bb-af42-eafcdf1454f5",
              "leftValue": "={{ $('Agent: Process Refund Logic').item.json.output.total_gasto_cliente }}",
              "rightValue": 3000,
              "operator": {
                "type": "number",
                "operation": "gte"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        992,
        80
      ],
      "id": "6f4ff1ae-9f1c-493f-be92-ea465ad9d03a",
      "name": "IF: Is VIP?"
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Agent: Process Refund Logic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Agent: Process Refund Logic",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser (json)": {
      "ai_outputParser": [
        [
          {
            "node": "Agent: Process Refund Logic",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Gmail: Send Retention Email": {
      "main": [
        [
          {
            "node": "Telegram: Alert New Refund Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets: Read Customer Database": {
      "ai_tool": [
        [
          {
            "node": "Agent: Process Refund Logic",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Gmail: Send VIP Refund Notification": {
      "main": [
        [
          {
            "node": "Telegram: VIP Customer Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail: Send Critical Support Reply": {
      "main": [
        [
          {
            "node": "Telegram: Complaining Customer Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Agent: Process Refund Logic": {
      "main": [
        [
          {
            "node": "IF: Refund Deadline Expired?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF: Refund Deadline Expired?": {
      "main": [
        [
          {
            "node": "IF: Standard Customer?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail: Send Retention Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF: Standard Customer?": {
      "main": [
        [
          {
            "node": "Gmail: Send Deadline Expired Email",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "IF: Is VIP?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF: Is VIP?": {
      "main": [
        [
          {
            "node": "Gmail: Send VIP Refund Notification",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail: Send Critical Support Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": false
  },
  "versionId": "4e6ad1d9-5fa2-4ed2-beb9-b09de5be8a67",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "acSwxzE30DlhTUn2Yw2pP",
  "tags": []
}