This workflow follows the Agent → OpenAI Chat 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 →
{
"name": "Financial Agent with SQL (Supabase)",
"nodes": [
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
2120,
-200
],
"id": "0d254991-d0d5-4e57-b9d2-0f4364e1f65e",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "## Whatsapp, Telegram, Slack, Teams",
"height": 1000,
"width": 360,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
-980
],
"typeVersion": 1,
"id": "c81eaca7-0d75-43b7-af54-227288c01803",
"name": "Sticky Note"
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
2080,
-680
],
"id": "366e4c54-c3cf-4fc6-8c39-b354b207b70a",
"name": "OpenAI Chat Model1",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=A seguir, voc\u00ea receber\u00e1 uma mensagem que descreve uma despesa feita em um projeto. Extraia os seguintes campos:\n\n- Data (a data em que o gasto foi feito, no formato YYYY-MM-DD (ex: \"2025-07-07\"). Se n\u00e3o for especificada, use a data de hoje: {{ $now }}.\n- Descri\u00e7\u00e3o resumida do que foi gasto\n- Valor num\u00e9rico (em reais)\n- Categoria (ex: Transporte, Refei\u00e7\u00e3o, Software, Escrit\u00f3rio, Servi\u00e7o, Cloud, Outro)\n- Projeto relacionado\n- Forma de Pagamento (ex: Cart\u00e3o, Pix, Dinheiro, Boleto, Transfer\u00eancia, N\u00e3o informado)\n- Resumo da opera\u00e7\u00e3o que foi feita, para ser enviado via mensagem de confirma\u00e7\u00e3o por um assistente. A mensagem deve confirmar a opera\u00e7\u00e3o de forma simp\u00e1tica e objetiva, como se fosse enviada por um atendente no WhatsApp.\n\nMensagem:\n{{ $json.message.text }}\n\nData de hoje:\n{{ $now }}\n",
"hasOutputParser": true,
"options": {
"systemMessage": "Voc\u00ea \u00e9 um assistente financeiro. Seu papel \u00e9 interpretar mensagens de texto sobre despesas e extrair os dados de forma estruturada, com o objetivo de preencher automaticamente uma planilha de controle de gastos.\n\nAl\u00e9m disso, voc\u00ea deve gerar uma frase de confirma\u00e7\u00e3o no campo \"resumo\", em tom simp\u00e1tico e direto, como se fosse um atendente humano respondendo no WhatsApp. O texto deve confirmar que a despesa foi registrada com sucesso, citando os principais dados como valor, descri\u00e7\u00e3o, projeto e forma de pagamento. Escreva a frase em uma \u00fanica linha, sem quebras.\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.9,
"position": [
2140,
-940
],
"id": "1f436aca-6a19-4008-91ce-f25a55b11750",
"name": "Agente para inserir dados"
},
{
"parameters": {
"promptType": "define",
"text": "=Mensagem do usu\u00e1rio:\n{{ $json.message.text }}\nA data de hoje \u00e9:\n{{ $now }}\n",
"options": {
"systemMessage": "## Papel\nVoc\u00ea \u00e9 um Assistente Financeiro Pessoal que entende perguntas sobre gastos e finan\u00e7as e responde com base na tabela `public.controle_financeiro` em um banco PostgreSQL.\n\n## Esquema da Tabela\nA tabela `public.controle_financeiro` cont\u00e9m os seguintes campos:\n\n- `id` (int8)\n- `data` (date)\n- `descricao` (varchar)\n- `valor` (float)\n- `categoria` (varchar)\n- `projeto` (varchar)\n- `forma_de_pag` (varchar)\n- `created_at` (timestamp, default: now())\n- `source` (varchar)\n\n## Objetivo\nResponder perguntas como:\n- \"Quanto eu gastei essa semana?\"\n- \"Quais foram os gastos com alimenta\u00e7\u00e3o em junho?\"\n- \"Quanto foi gasto no projeto X em maio?\"\n\n## Boas pr\u00e1ticas\n- Use `data` para filtros de tempo, n\u00e3o `created_at`\n- Use SUM para totalizar gastos\n\n## Exemplo\n1. Quanto eu gastei com alimenta\u00e7\u00e3o?\n```\nSELECT SUM(valor) AS total_gasto\nFROM public.controle_financeiro\nWHERE categoria ILIKE '%alimenta\u00e7\u00e3o%' OR categoria ILIKE '%refei\u00e7\u00e3o%';\n```\n\n2. Quais foram os gastos do projeto RedRex?\n```\nSELECT descricao, categoria, valor, data\nFROM public.controle_financeiro\nWHERE projeto ILIKE '%RedRex%';\n```\n\n\n3.Qual o total de despesas com software no ZapFlow?\n```\nSELECT SUM(valor) AS total\nFROM public.controle_financeiro\nWHERE projeto ILIKE '%ZapFlow%' AND categoria ILIKE 'software';\n```\n\n## Como responder\n\n1. Mostre o valor total (ou m\u00e9dia, contagem, etc.)\n2. Explique o filtro aplicado (ex: m\u00eas, categoria, etc.)\n3. Seja direto e humano: \"Voc\u00ea gastou R\\$ X com alimenta\u00e7\u00e3o em junho.\""
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.9,
"position": [
2120,
-420
],
"id": "55984274-9e2d-4589-9772-096772f79829",
"name": "Agente para consultar dados"
},
{
"parameters": {
"content": "## Mensagem para inserir",
"height": 440,
"width": 1120,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1720,
-980
],
"typeVersion": 1,
"id": "7a7049a4-5ba2-4d05-955e-f6f621cc358b",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Agente de IA de consulta",
"height": 540,
"width": 1120
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1720,
-520
],
"typeVersion": 1,
"id": "87c58132-0828-43dd-84e6-6ebb5616bfd1",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Agente de classifica\u00e7\u00e3o",
"height": 1000,
"width": 600,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1100,
-980
],
"typeVersion": 1,
"id": "3ee276de-7069-4b14-9e7a-e7a7bc068311",
"name": "Sticky Note3"
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger1').item.json.message.from.id }}",
"text": "={{ $json.output }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2580,
-420
],
"id": "3a0dac19-854d-4f46-bfc6-86dcd6b4e7e1",
"name": "Telegram",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"inputText": "=Voc\u00ea vai receber uma mensagem de um usu\u00e1rio.\n\nClassifique a inten\u00e7\u00e3o da mensagem com base nas op\u00e7\u00f5es abaixo:\n\n- \"registro\": se o usu\u00e1rio estiver informando uma nova despesa\n- \"consulta\": se estiver pedindo para ver, consultar ou buscar informa\u00e7\u00f5es financeiras anteriores\n\nResponda apenas com a palavra: \"registro\" ou \"consulta\".\n\nMensagem:\n{{ $json.message.text }}\n",
"categories": {
"categories": [
{
"category": "registro",
"description": "se o usu\u00e1rio estiver informando uma nova despesa, gasto, compra ou pagamento realizado."
},
{
"category": "consulta",
"description": "se o usu\u00e1rio estiver pedindo para consultar, saber, revisar ou buscar informa\u00e7\u00f5es sobre despesas passadas."
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.textClassifier",
"typeVersion": 1,
"position": [
1260,
-640
],
"id": "a3a05fd7-5251-48ff-9b8f-6b4f45d6c846",
"name": "Text Classifier"
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
1260,
-360
],
"id": "e8f6dcc3-c9e4-4209-a36d-fa7e2c2f7bc0",
"name": "OpenAI Chat Model2",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n \"data\": \"2025-07-07\",\n \"descricao\": \"Hospedagem para evento\",\n \"valor\": 300.00,\n \"categoria\": \"Servi\u00e7o\",\n \"projeto\": \"Jornada\",\n \"forma_pagamento\": \"Pix\",\n \"source\": \"whatsapp\",\n \"resumo\": \"Despesa registrada: R$300,00 em 'Hospedagem para evento' no projeto Jornada, pago via Pix.\"\n}\n"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.2,
"position": [
2320,
-680
],
"id": "8102aefa-f6cf-46a0-ac30-b07a561d2083",
"name": "Structured Output Parser"
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger1').item.json.message.from.id }}",
"text": "={{ $json.output.resumo }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2580,
-740
],
"id": "f8b8a2ee-da10-4a29-8afb-2aaeff4c5ac5",
"name": "Telegram1",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"type": "n8n-nodes-base.telegramTrigger",
"typeVersion": 1.2,
"position": [
840,
-640
],
"id": "2248e793-5e24-49bc-b9c0-6287bb3a6cd0",
"name": "Telegram Trigger1",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"tableId": "controle_financeiro",
"fieldsUi": {
"fieldValues": [
{
"fieldId": "data",
"fieldValue": "={{ $json.output.data }}"
},
{
"fieldId": "descricao",
"fieldValue": "={{ $json.output.descricao }}"
},
{
"fieldId": "valor",
"fieldValue": "={{ $json.output.valor }}"
},
{
"fieldId": "categoria",
"fieldValue": "={{ $json.output.categoria }}"
},
{
"fieldId": "projeto",
"fieldValue": "={{ $json.output.projeto }}"
},
{
"fieldId": "forma_de_pagamento",
"fieldValue": "={{ $json.output.forma_pagamento }}"
},
{
"fieldId": "source",
"fieldValue": "telegram"
}
]
}
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
2580,
-940
],
"id": "03974164-5618-4c03-9043-caba934c9f9e",
"name": "Create a row",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"name": "query_executer",
"description": "Call this tool to execute a query. Remember that it should be in a postgreSQL query structure.",
"workflowId": {
"__rl": true,
"value": "cvUfQNLet5rCk1qi",
"mode": "list",
"cachedResultName": "query_executer"
},
"specifyInputSchema": true,
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"sql\": {\n \"type\": \"string\",\n \"description\": \"A SQL query based on the users question and database schema.\"\n }\n }\n}\n"
},
"id": "3093d6e3-730b-444a-b53f-aee6fe1a2013",
"name": "execute_query_tool",
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"typeVersion": 1.2,
"position": [
2280,
-180
]
}
],
"connections": {
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Agente para consultar dados",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "Agente para inserir dados",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Agente para inserir dados": {
"main": [
[
{
"node": "Telegram1",
"type": "main",
"index": 0
},
{
"node": "Create a row",
"type": "main",
"index": 0
}
]
]
},
"Agente para consultar dados": {
"main": [
[
{
"node": "Telegram",
"type": "main",
"index": 0
}
]
]
},
"Text Classifier": {
"main": [
[
{
"node": "Agente para inserir dados",
"type": "main",
"index": 0
}
],
[
{
"node": "Agente para consultar dados",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model2": {
"ai_languageModel": [
[
{
"node": "Text Classifier",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Agente para inserir dados",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Telegram Trigger1": {
"main": [
[
{
"node": "Text Classifier",
"type": "main",
"index": 0
}
]
]
},
"execute_query_tool": {
"ai_tool": [
[
{
"node": "Agente para consultar dados",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "39b0499a-87ee-42bf-8514-0de6ea5626cb",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "HibLul9VJAGCptRP",
"tags": []
}
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.
openAiApisupabaseApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Financial Agent with SQL (Supabase). Uses lmChatOpenAi, agent, telegram, textClassifier. Event-driven trigger; 16 nodes.
Source: https://github.com/lorenzouriel/coding-n8n/blob/98658028ad3f0fb98ea79c551bfa02ced8cc9b0d/json-examples/financial_agent_with_sql.json — 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.
RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.
Template Carnaval - time instagram. Uses toolWorkflow, lmChatOpenAi, memoryBufferWindow, agent. Event-driven trigger; 56 nodes.
AI marketing Team Agent. Uses toolWorkflow, telegram, memoryBufferWindow, openAi. Event-driven trigger; 46 nodes.
This workflow is for users who want to turn Telegram into a personal AI-powered assistant capable of handling everyday tasks through natural language. It's ideal for solo founders, operators, or profe
This intelligent lead generation workflow transforms voice commands or text input into verified prospect lists through automated Apollo.io scraping. The system processes natural language requests, ext