¿Sabes por qué todas las aplicaciones de control de gastos acaban fracasando? Por la fricción.
Te tomas un café, abres la app, saltas un anuncio, buscas la categoría “Desayunos”, escribes “1.50”, le das a guardar… Al tercer día, te rindes. La mente del maker no tiene tiempo para burocracia. Queremos un sistema que funcione a la velocidad del pensamiento.
Hoy vamos a construir el Santo Grial de las finanzas personales. Un bot privado de Telegram conectado a n8n y a tu Google Sheets.
¿Lo mejor? No tendrás ni que escribir. Podrás enviarle un audio diciendo: “Me he gastado 50 pavos en gasolina” o mandarle la foto del ticket arrugado del restaurante. La Inteligencia Artificial extraerá el coste, lo categorizará y lo anotará en tu Excel. Magia pura.
El Laboratorio: Requisitos previos
Para desplegar este nodo avanzado, necesitamos que tu infraestructura base esté operativa. Asegúrate de tener:
- Tu servidor n8n expuesto a internet de forma segura (Guía: n8n + Cloudflare Tunnels).
- Tu propio bot de Telegram (Guía: Crear Bot con BotFather).
- Tus credenciales de acceso a la base de datos (Guía: Conectar Google Sheets vía Service Account).
- Una API Key de Google AI Studio. Usaremos Gemini 1.5 Pro porque es gratuito, rapidísimo y multimodal (entiende imágenes, audio y texto).
Anatomía del Flujo: Procesamiento Desacoplado Multimodal
En lugar de crear un flujo simple que se rompe a la mínima, vamos a diseñar la arquitectura de un Agente de Tarea Específica. Vamos a separar los “sentidos” del bot (ver y escuchar) de su “razonamiento” (contabilidad).
Abre un nuevo Workflow en n8n y vamos a ensamblar los 5 pilares de este sistema.
Paso 1: Recepción y Triaje Inteligente (El Nodo Switch)
El sistema debe identificar instantáneamente el ADN del mensaje.
- Añade un nodo Telegram Trigger configurado para escuchar
message. - Conéctalo a un nodo Switch. En lugar de procesar todo igual, el Switch abre tres tuberías especializadas evaluando qué dato existe:
- Ruta Texto: Si
{{ $json.message.text }}existe. - Ruta Foto: Si
{{ $json.message.photo }}existe. - Ruta Audio: Si
{{ $json.message.voice }}existe.
- Ruta Texto: Si
Paso 2: Traducción Sensorial (Nodos Específicos)
Aquí está el secreto de la robustez. Antes de que el “Contable” reciba la información, traducimos la imagen o el audio a texto plano. Esto elimina el ruido y ahorra tokens de IA.
- En las rutas de Foto y Audio, usa el nodo de Telegram con la acción Download File para descargar el archivo a n8n.
- Conecta la salida a los nodos Analyze Image o Analyze Audio de Google Gemini para transcribir el contenido.
El Truco del ‘.pop()’: Telegram envía las fotos en un array de varios tamaños. Para asegurarte de que la IA lee el ticket con la máxima resolución, usa esta expresión en el nodo de descarga: {{ $json.message.photo.pop().file_id }}. Esto extrae siempre el último archivo (el de mayor calidad).
Paso 3: El Cerebro Contable (Basic LLM Chain)
Ahora unificamos las tuberías en una sola mente.
- Conecta la salida de la Ruta de Texto y las salidas de los nodos de Traducción Sensorial a una Basic LLM Chain (usando el modelo Gemini 1.5).
- Innovación Híbrida: En el campo de texto de entrada de la cadena, usa esta expresión maestra:
{{ $json.message.text }}{{ $json.content.parts[0].text }}(Esto asegura que la cadena reciba el texto, venga directamente de Telegram o de la transcripción previa). - En el System Prompt, dile a la IA: “Actúa como un experto contable. Analiza el texto y extrae el gasto real ignorando el ruido.”
Paso 4: El Guardián del Formato (Structured Output Parser)
Si dejamos que la IA responda libremente, a veces añadirá texto extra (ej: “¡Claro! Aquí tienes los datos:…”) y romperá nuestro Excel.
- Añade un componente Structured Output Parser a la cadena LLM.
- Obliga a la IA a devolver un esquema JSON estricto con tres campos:
concepto(texto),categoria(texto - ej: Transporte, Ocio, Alimentación) ycantidad(número). Si la IA intenta dar explicaciones extra, este nodo lo recorta y entrega solo los datos puros.
El diagrama de nuestro Agente Autónomo. Observa la arquitectura de triaje y cómo todo converge en la cadena LLM antes de ir a Google Sheets.
Paso 5: Persistencia y Feedback (Google Sheets + Lógica)
El paquete de datos es ahora perfecto y seguro.
- Conecta la cadena a un nodo de Google Sheets (Append Row). Mapea el concepto, la categoría y la cantidad.
- Para la fecha, usa una expresión que ajuste tu zona horaria automáticamente:
{{ $now.setZone('Europe/Madrid').toFormat('dd/MM/yyyy HH:mm') }}. - Cierra el círculo con un nodo IF para verificar que el guardado fue exitoso, y conecta un nodo final de Telegram que envíe un acuse de recibo:
✅ Guardado: {{ $json.cantidad }}€ en {{ $json.categoria }}.
Cero fricción: Mandas un audio paseando por la calle o tiras una foto al ticket antes de tirarlo a la basura. El Agente lo procesa, formatea y archiva en unos 4 segundos.
El Hardware: Un cerebro que nunca duerme
Para que un bot de Telegram responda siempre (incluso a las 3 de la mañana de un sábado), tu servidor n8n debe estar funcionando 24/7. Dejar el PC de sobremesa encendido consume demasiada luz y recursos. Por eso en el laboratorio siempre usamos micro-servidores.
Beelink S12 Pro (Intel N100 + 16GB RAM)
El motor ideal para este proyecto. Consume menos de 6W (unos céntimos al mes en luz) y tiene potencia de sobra para correr n8n, procesar las descargas multimedia de Telegram y gestionar la IA sin despeinarse.
Conclusión: De Bots a Agentes Autónomos
Felicidades, Arquitecto. Acabas de automatizar una de las tareas más tediosas del mundo moderno usando arquitectura de software real.
Este diseño no es solo un “bot de gastos”. Has construido un patrón de Agente de Tarea Específica. Cambiando el esquema del Parser y el System Prompt, este mismo flujo podría procesar partes médicos, inventarios de almacén o reportes de interferencias en plantas industriales.
Tus datos financieros están ahora centralizados, limpios y bajo tu control absoluto. El siguiente paso lógico es darles vida visual.
👉 Despliegue recomendado: Crea un Dashboard holográfico de tus gastos con Looker Studio.
¿Has conseguido implementar el truco del .pop() en las fotos? ¡Cuéntanos tus resultados en el canal!
¡A seguir trasteando! 🛠️