Tracker de Gastos con IA: Telegram + n8n + LLM
TL;DR: Puedes construir un bot de Telegram que entienda mensajes como "Café 3,50" y los categorice, parsee y almacene automáticamente usando n8n y un LLM. Sin escribir código backend. Coste operativo: menos de 2 €/mes en llamadas a la API. Este artículo te guía paso a paso desde la creación del bot hasta tener un sistema funcional con reportes semanales.
El problema de registrar gastos
Abres la app de gastos. Buscas la categoría. Introduces el importe. Seleccionas la fecha. Cierras la app. Total: 30 segundos por cada gasto. Multiplica eso por 8-10 transacciones diarias y tienes un proceso que abandonas en dos semanas.
El problema no es la falta de herramientas. Hay decenas de apps de finanzas personales. El problema es la fricción. Cada paso extra entre "he pagado algo" y "queda registrado" reduce la probabilidad de que lo hagas consistentemente.
Telegram ya está abierto en tu móvil. Un mensaje de texto es el formato más natural para registrar algo rápido. Si un LLM puede interpretar "Mercadona 47,30 tarjeta" y extraer importe, categoría, método de pago y descripción, la fricción desaparece. Eso es lo que vamos a construir.
¿Qué es n8n y por qué usarlo aquí?
n8n es una plataforma de automatización de workflows con interfaz visual y nodos conectables. A diferencia de Zapier o Make, n8n es open source y puedes auto-hospedarlo sin coste de licencia. Solo pagas la infraestructura, que para un proyecto personal ronda los 5-10 €/mes en un VPS básico.
Para este proyecto, n8n aporta tres cosas concretas: un nodo nativo de Telegram que gestiona webhooks sin configuración manual, nodos de LLM Chain con parseo estructurado integrado, y nodos de base de datos (Google Sheets, MongoDB, PostgreSQL) para persistir los datos. Todo conectado visualmente, sin escribir un servidor Express ni gestionar procesos.
Arquitectura del sistema
El flujo completo tiene cinco etapas:
- Entrada: El usuario envía un mensaje de texto a un bot de Telegram ("Café con leche 2,80 efectivo")
- Trigger: n8n recibe el mensaje a través del webhook del Telegram Trigger
- Parseo IA: Un nodo Basic LLM Chain con Structured Output Parser extrae los campos: importe, categoría, método de pago, descripción y fecha
- Almacenamiento: Los datos parseados se insertan en Google Sheets (o MongoDB si prefieres una base de datos)
- Confirmación: El bot responde al usuario con un resumen del gasto registrado
Vamos a implementar cada etapa.
Paso 1: Crear el bot de Telegram con BotFather
Abre Telegram y busca @BotFather. Es el bot oficial de Telegram para crear y gestionar otros bots.
- Envía
/newbot - Escribe un nombre para tu bot (ejemplo: "Mis Gastos Bot")
- Escribe un username único que termine en
bot(ejemplo:misgastos_tracker_bot) - Copia el token que te devuelve BotFather. Lo necesitarás en n8n
Un detalle importante: cada bot de Telegram solo puede tener un webhook activo. Si creas varios workflows en n8n con Telegram Triggers distintos, solo el último activado recibirá mensajes. Un bot, un workflow.
Paso 2: Configurar n8n y el Telegram Trigger
Si no tienes n8n instalado, la forma más rápida es con Docker:
docker run -d --name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
-e WEBHOOK_URL=https://tu-dominio.com/ \
n8nio/n8n
La variable WEBHOOK_URL es obligatoria para que Telegram pueda enviar mensajes a tu instancia. Necesitas HTTPS, así que si estás en local puedes usar un túnel como ngrok o Cloudflare Tunnel para desarrollo.
En n8n, crea un nuevo workflow y añade un nodo Telegram Trigger:
- En Credentials, crea una nueva credencial de Telegram con el token de BotFather
- En "Updates", selecciona "message" para recibir mensajes de texto
- Guarda y activa el workflow
Cuando actives el workflow, n8n registra automáticamente el webhook con la API de Telegram. No necesitas configurar nada más.
Paso 3: Parseo con LLM y Structured Output Parser
Esta es la parte clave. Añade un nodo Basic LLM Chain después del Telegram Trigger.
Conecta como sub-nodos:
- Un modelo de LLM (OpenAI con
gpt-4o-minies la opción más rentable) - Un Structured Output Parser con el schema JSON de los campos que quieres extraer
El prompt del LLM Chain es donde ocurre la magia. Aquí tienes un prompt que funciona consistentemente:
Eres un asistente de finanzas personales. Tu trabajo es extraer información
de gastos a partir de mensajes informales en español.
Reglas:
- Si no se menciona método de pago, asume "tarjeta"
- Si no se menciona fecha, usa la fecha actual
- Categorías válidas: alimentacion, transporte, ocio, salud, hogar,
suscripciones, restaurantes, ropa, educacion, otros
- El importe siempre en formato numérico (sin símbolo de moneda)
- Si el mensaje no parece un gasto, devuelve categoria "no_reconocido"
Mensaje del usuario: {{ $json.message.text }}
Y el JSON Schema para el Structured Output Parser:
{
"type": "object",
"properties": {
"importe": {
"type": "number",
"description": "Cantidad gastada en euros"
},
"categoria": {
"type": "string",
"description": "Categoria del gasto"
},
"metodo_pago": {
"type": "string",
"description": "Metodo de pago: efectivo, tarjeta, bizum, transferencia"
},
"descripcion": {
"type": "string",
"description": "Descripcion breve del gasto"
},
"fecha": {
"type": "string",
"description": "Fecha del gasto en formato YYYY-MM-DD"
}
},
"required": ["importe", "categoria", "metodo_pago", "descripcion", "fecha"]
}
Con este schema, cuando envíes "Mercadona 47,30 tarjeta", el LLM devolverá algo como:
{
"importe": 47.30,
"categoria": "alimentacion",
"metodo_pago": "tarjeta",
"descripcion": "Compra en Mercadona",
"fecha": "2026-02-14"
}
Una nota de la documentación oficial de n8n: el Structured Output Parser funciona mejor con el nodo Basic LLM Chain que directamente dentro de un AI Agent. Si usas agentes, n8n recomienda un LLM Chain separado para el parseo. En mi experiencia montando pipelines similares, confirmo que el parseo directo en agentes falla de forma intermitente, sobre todo con respuestas largas.
Paso 4: Almacenamiento en Google Sheets
Google Sheets es la opción más sencilla para empezar. Es gratis, visual, y puedes compartirlo o exportarlo a CSV cuando quieras. Para un tracker personal, sobra.
Crea una hoja de cálculo con estas columnas:
| fecha | descripcion | categoria | importe | metodo_pago | chat_id |
|---|---|---|---|---|---|
| 2026-02-14 | Compra en Mercadona | alimentacion | 47.30 | tarjeta | 123456 |
La columna chat_id es importante si planeas que varias personas usen el mismo bot. Cada usuario de Telegram tiene un ID único que llega en {{ $('Telegram Trigger').item.json.message.chat.id }}.
Añade un nodo Google Sheets con la operación "Append Row" y mapea cada campo del output del LLM Chain a la columna correspondiente.
Si prefieres MongoDB, el nodo de MongoDB en n8n soporta la operación "Insert" directamente. La ventaja: queries más flexibles para reportes. La desventaja: necesitas un servidor MongoDB (MongoDB Atlas tiene un tier gratuito de 512 MB que es suficiente para un tracker personal).
Paso 5: Confirmación al usuario
Añade un nodo Telegram (no Trigger, sino el nodo de envío) con la operación "Send Message":
Chat ID: {{ $('Telegram Trigger').item.json.message.chat.id }}
Texto:
Gasto registrado:
- {{ $json.descripcion }}
- Importe: {{ $json.importe }} €
- Categoría: {{ $json.categoria }}
- Método: {{ $json.metodo_pago }}
- Fecha: {{ $json.fecha }}
Esto cierra el loop. El usuario envía un mensaje y en 2-3 segundos recibe la confirmación de que su gasto está registrado y correctamente categorizado. Si la categoría no es correcta, puede enviar una corrección, pero en la práctica con gpt-4o-mini la precisión en categorización de gastos cotidianos es superior al 90%.
Extensión: reportes semanales automáticos
Un tracker sin reportes es un cementerio de datos. Puedes crear un segundo workflow en n8n con un Schedule Trigger que se ejecute cada domingo a las 20:00:
- Lee los datos de la semana desde Google Sheets (filtro por fecha)
- Pasa los datos a un LLM Chain con un prompt tipo: "Resume estos gastos semanales. Agrupa por categoría, calcula totales, identifica la categoría donde más se gastó y sugiere una acción concreta para reducir gastos"
- Envía el resumen por Telegram al usuario
Este segundo workflow consume una llamada extra al LLM por semana. Con gpt-4o-mini, el coste de esa llamada es prácticamente cero (fracciones de céntimo).
Caso real: mi setup de pruebas
Monté este sistema para hacer seguimiento de gastos variables (comidas fuera, café, transporte) durante un mes. Los gastos fijos (alquiler, suscripciones) los mantengo en una hoja separada porque no cambian.
Resultado: registré 187 transacciones en 30 días. El parseo falló en 4 ocasiones, todas con mensajes ambiguos tipo "20 euros Juan", donde el LLM no podía determinar si era un gasto o una transferencia. La solución fue añadir al prompt: "Si el mensaje es ambiguo, pregunta al usuario antes de registrar", y añadir un nodo IF que comprueba si la categoría es "no_reconocido" para pedir aclaración.
El gasto total en API de OpenAI fue de 0,43 € en el mes. Para 187 llamadas de parseo y 4 de resumen semanal, con gpt-4o-mini a 0,15 $/millón de tokens de input y 0,60 $/millón de output, cada mensaje cuesta fracciones de céntimo.
En Producción
Si decides usar este sistema en serio (y no solo como experimento), hay cosas que cambian respecto al tutorial.
Manejo de errores. El LLM puede devolver JSON malformado. Ocurre aproximadamente 1 de cada 15 ejecuciones con el Structured Output Parser. La solución: añade un nodo Error Trigger en n8n que capture fallos del LLM Chain y reintente una vez. Si falla de nuevo, notifica al usuario con "No pude procesar tu mensaje, inténtalo con otro formato".
Límites de la API de Telegram. Los bots de Telegram tienen un límite de 30 mensajes por segundo. Para uso personal no es un problema, pero si compartes el bot con más personas, necesitarás controlar la concurrencia en n8n.
Costes reales. n8n Community Edition auto-hospedado: 0 € en licencia, 5-10 €/mes en VPS. API de OpenAI (gpt-4o-mini): 0,50-2 €/mes dependiendo del uso. Google Sheets: gratis. Total operativo: menos de 12 €/mes para un sistema funcional.
Persistencia y backups. Google Sheets tiene historial de versiones integrado, que funciona como backup básico. Si usas MongoDB, configura backups automáticos. MongoDB Atlas los incluye en el tier gratuito con retención de 2 días.
Seguridad. Filtra por chat_id para que solo los usuarios autorizados puedan registrar gastos. Puedes hacerlo con un nodo IF al inicio del workflow que compare el chat_id entrante con una lista de IDs permitidos. Los tokens de Telegram y las API keys de OpenAI se almacenan como credenciales cifradas en n8n, nunca en el workflow directamente.
Alternativa a OpenAI. Si prefieres no depender de OpenAI, Google Gemini 2.0 Flash funciona con el mismo setup (n8n tiene nodo nativo de Google AI). El coste es similar y la calidad de parseo para este caso de uso es comparable. También puedes usar un modelo local con Ollama si tienes un servidor con GPU, eliminando el coste de API por completo.
Errores comunes y depuración
Error: El bot no recibe mensajes.
Causa: El webhook no está registrado o la URL no es accesible públicamente.
Solución: Verifica que WEBHOOK_URL en n8n apunta a tu dominio con HTTPS. Comprueba con curl https://api.telegram.org/bot<TOKEN>/getWebhookInfo que el webhook está activo.
Error: El Structured Output Parser falla con "Output does not match schema".
Causa: El LLM devolvió texto libre en lugar de JSON, o incluyó markdown alrededor del JSON.
Solución: En versiones recientes de n8n (febrero 2026), se corrigió el parseo de JSON con segmentos de markdown. Actualiza n8n. Si persiste, usa el prompt "Responde SOLO con el JSON, sin explicaciones ni formato markdown".
Error: Gastos duplicados en Google Sheets.
Causa: Telegram reenvía el mensaje si no recibe confirmación de webhook a tiempo.
Solución: Añade un nodo que compruebe si el message_id ya existe antes de insertar. O reduce la latencia del workflow para que responda en menos de 5 segundos.
Comparativa: Google Sheets vs MongoDB vs PostgreSQL
| Criterio | Google Sheets | MongoDB Atlas | PostgreSQL |
|---|---|---|---|
| Coste | Gratis | Gratis (512 MB) | ~5 €/mes (VPS) |
| Setup | 2 minutos | 10 minutos | 20 minutos |
| Queries | Limitadas | Flexibles | SQL completo |
| Escalabilidad | ~10.000 filas | 512 MB gratis | Sin límite práctico |
| Reportes | Gráficos nativos | Aggregation pipeline | SQL + herramientas BI |
| Ideal para | Uso personal | Multi-usuario | Producción seria |
Mi recomendación: empieza con Google Sheets. Si en tres meses sigues usándolo y necesitas queries más complejas, migra a MongoDB o PostgreSQL. No optimices antes de validar que el sistema te es útil.
Preguntas frecuentes
¿Puedo usar este bot en un grupo de Telegram o solo en chat privado?
Funciona en ambos, pero para finanzas personales recomiendo chat privado. En grupos, el bot necesita tener el modo de privacidad desactivado (configurable en BotFather con /setprivacy) y deberías filtrar mensajes por usuario para evitar que cualquier miembro del grupo registre gastos en tu hoja.
¿Qué pasa si envío una foto de un ticket en lugar de texto?
Este workflow solo procesa texto. Para OCR de tickets necesitas añadir un paso extra: un nodo que descargue la imagen y la envíe a un modelo con capacidad de visión (GPT-4o o Gemini 2.0 Flash). n8n tiene templates que ya hacen esto, como el workflow 11368 de la galería oficial. El coste por imagen procesada sube a 0,01-0,03 €.
¿Es fiable dejar que una IA categorice mis gastos?
Para gastos cotidianos (supermercado, café, transporte, restaurantes), la precisión ronda el 90-95% con gpt-4o-mini. Donde falla es en gastos ambiguos: "Amazon 29,99" puede ser electrónica, ropa o libros. La solución práctica es revisar el resumen semanal y corregir los que estén mal. Perfecto no es, pero es mejor que no registrar nada.
Cierre
Hemos visto cómo combinar tres herramientas (Telegram, n8n y un LLM) para eliminar la fricción del registro de gastos. La clave no es la tecnología en sí, sino reducir el esfuerzo a lo mínimo: un mensaje de texto. Con un coste operativo inferior a 12 €/mes, tienes un sistema que parsea lenguaje natural, categoriza automáticamente y genera reportes, todo sin escribir un backend.
El paso natural siguiente sería añadir OCR para tickets físicos o integrar alertas de presupuesto cuando una categoría supere un límite mensual. Si montas algo parecido o le añades funcionalidades que no he cubierto, cuéntamelo en Twitter @sergiomarquezp.