Introducción

Si usás YNAB, Mint o herramientas similares con Zapier para automatizar el procesamiento de transacciones, probablemente ya sufriste los costos mensuales que se acumulan, los límites de APIs y la falta de control sobre dónde viven tus datos. La alternativa self-hosted no solo abarata costos, sino que también te da autonomía total sobre la infraestructura.

En esta guía, te muestro cómo montar un stack de automatización financiera usando:

  • Actual Budget (gestión de presupuestos open-source)
  • n8n (orquestación de workflows open-source)
  • SimpleFIN (conector de bancos con API sencilla)
  • Claude API (para categorización inteligente de transacciones)

Qué es y para qué sirve

El stack self-hosted reemplaza componentes clave de soluciones en la nube como YNAB + Zapier + Plaid con alternativas open-source o basadas en APIs. Cada pieza tiene un rol específico:

ComponenteRolAlternativa en nube
**Actual Budget**Motor de presupuesto (enfoque *envelope*)YNAB
**n8n**Orquestador de workflowsZapier / Make
**SimpleFIN**Conector de bancos vía APIPlaid (integrado en YNAB)
**Claude API**Categorización inteligente de transaccionesChatGPT (o reglas predefinidas en YNAB)
La ventaja principal es el control total: tus datos nunca salen de tu infraestructura, no tenés límites de APIs y pagás solo por el hardware y servicios externos necesarios (como SimpleFIN y Claude).

Prerequisitos

Antes de empezar, asegurate de tener:

Software y versiones

  • Docker 24.0+ (para contenerizar los servicios)
  • Docker Compose 2.20+ (para orquestar los contenedores)
  • Node.js 18+ (solo si querés personalizar workflows en n8n)
  • Python 3.10+ (opcional, para scripts de depuración)

Hardware

  • Mínimo: 2 vCPUs, 4GB RAM, 20GB almacenamiento (para un uso personal)
  • Recomendado: 4 vCPUs, 8GB RAM, 50GB SSD (si tenés muchas transacciones o querés escalar)

Accesos y permisos

  • Cuentas bancarias soportadas por SimpleFIN (ver lista en simplefin.com)
  • API key de Claude (creá una en console.anthropic.com)
  • Dominio propio o subdominio configurado con DNS (para acceso externo seguro)

Seguridad

  • Certificado SSL (puede ser auto-firmado para desarrollo, pero recomendado Let’s Encrypt en producción)
  • Usuario y contraseña robustos para todas las herramientas (usá un gestor como Bitwarden)

Guía paso a paso

Paso 1: Desplegá Actual Budget con Docker Compose

Actual Budget es un sistema de presupuesto local-first que podés instalar en tu servidor. Usaremos la imagen oficial de Docker.

  1. Creá un directorio para el proyecto:
   mkdir ~/finance-automation && cd ~/finance-automation
   
  1. Creá el archivo docker-compose.yml:
   version: '3.8'
   services:
     actual:
       image: actualbudget/actual-server:latest
       container_name: actual-budget
       restart: unless-stopped
       ports:
         - "3001:3001"  # Puerto por defecto de Actual Budget
       volumes:
         - ./actual-data:/data
       environment:
         - NODE_ENV=production
         - ACTUAL_SERVER_URL=http://localhost:3001
   
  1. Iniciá el contenedor:
   docker compose up -d
   
  1. Accedé a la interfaz web en http://<tu-servidor>:3001 y completá la configuración inicial:
– Creá un usuario administrador

– Configurá tu moneda (ej: ARS, USD, EUR)

– Cargá tus categorías de presupuesto (pueden ser las mismas que usabas en YNAB)

Resultado esperado: Deberías ver la pantalla de login de Actual Budget funcionando.

Paso 2: Configurá SimpleFIN para sincronizar tus cuentas bancarias

SimpleFIN es un servicio no self-hosted (pagás por su API), pero es la pieza clave para evitar usar Plaid o Mint. Costea ~$1.50/mes.

  1. Registrate en SimpleFIN y obtené tu API key.
  1. Hacé un request de prueba para verificar que tu banco esté soportado:
   curl -X POST "https://api.simplefin.com/v1/institutions" \
     -H "Authorization: Bearer TU_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{"country": "US"}'
   

Si tu banco está en la lista, verás su institutionId.

  1. Configurá el webhook en n8n para recibir transacciones (lo haremos en el Paso 3).

⚠️ Error común: Algunos bancos requieren autenticación adicional (como MFA). Si SimpleFIN no puede conectarse, revisá que no tengas activados pasos de verificación que bloqueen el acceso externo.

Paso 3: Desplegá n8n y configurá el workflow de transacciones

n8n es el orquestador que va a:

  1. Obtener transacciones desde SimpleFIN
  2. Categorizarlas con Claude API
  3. Registrarlas en Actual Budget

3.1. Despliegue de n8n

  1. Agregá el servicio a docker-compose.yml:
   services:
     n8n:
       image: n8nio/n8n:latest
       container_name: n8n
       restart: unless-stopped
       ports:
         - "5678:5678"
       volumes:
         - ./n8n-data:/home/node/.n8n
       environment:
         - N8N_BASIC_AUTH_ACTIVE=true
         - N8N_BASIC_AUTH_USER=admin
         - N8N_BASIC_AUTH_PASSWORD=tu-contraseña-segura
         - N8N_HOST=tu-dominio.com  # Solo si tenés dominio configurado
   
  1. Reiniciá los servicios:
   docker compose up -d
   
  1. Accedé a n8n en http://<tu-servidor>:5678 e iniciá sesión con las credenciales configuradas.

3.2. Configuración del workflow

  1. Creá un nuevo workflow y agregá estos nodos en orden:
HTTP Request (para obtener transacciones desde SimpleFIN)

Function (transformación de datos)

Code (llamada a Claude API para categorización)

HTTP Request (registro en Actual Budget)

  1. Nodo HTTP Request (SimpleFIN):
URL: https://api.simplefin.com/v1/accounts

Headers:

     {
       "Authorization": "Bearer TU_API_KEY_SIMPLEFIN",
       "Content-Type": "application/json"
     }
     

Method: GET

Response esperado: JSON con tus cuentas y transacciones.

Verificá: Ejecutá el nodo y confirmá que recibís datos de transacciones.

  1. Nodo Code (transformación):
   // Extraé solo las transacciones nuevas (filtrando por fecha)
   const transactions = items[0].json.transactions.filter(t => {
     return new Date(t.date) > new Date("2024-01-01");
   });
   return transactions;
   
  1. Nodo Code (Claude API):
   // Categorización con Claude API
   const apiKey = "TU_API_KEY_CLAUDE";
   const prompt = `
     Categorizá la siguiente transacción:
     Monto: ${item.amount} ${item.currency}
     Descripción: ${item.description}
     Fecha: ${item.date}

     Categorías posibles: ["Comida", "Transporte", "Entretenimiento", "Salud", "Vivienda", "Ingresos", "Otros"]

     Respuesta en formato JSON:
     { "category": "Categoría", "notes": "Detalles adicionales" }
   `;

   const response = await fetch("https://api.anthropic.com/v1/messages", {
     method: "POST",
     headers: {
       "x-api-key": apiKey,
       "anthropic-version": "2023-06-01",
       "content-type": "application/json"
     },
     body: JSON.stringify({
       model: "claude-3-opus-20240229",
       max_tokens: 100,
       messages: [{ role: "user", content: prompt }]
     })
   });
   const data = await response.json();
   item.category = JSON.parse(data.content[0].text).category;
   

⚠️ Error común: Si Claude devuelve texto no parseable, agregá manejo de errores:

   try {
     item.category = JSON.parse(data.content[0].text).category;
   } catch (e) {
     item.category = "Otros";
   }
   
  1. Nodo HTTP Request (Actual Budget API):
URL: http://actual:3001/api/v1/transactions

Headers:

     {
       "Authorization": "Bearer TU_TOKEN_DE_ACTUAL_BUDGET",
       "Content-Type": "application/json"
     }
     

Method: POST

Body:

     {
       "accountId": "ID_DE_CUENTA_EN_ACTUAL",
       "amount": -100.50,  // Negativo para gastos
       "category": "Comida",
       "date": "2024-05-20",
       "notes": "Supermercado"
     }
     
  1. Configurá el disparador (Trigger):
– Usá un Cron para ejecutar el workflow cada 6 horas:
     0 */6 * * *
     

Resultado esperado: Las transacciones deberían registrarse en Actual Budget con categorías asignadas automáticamente.

Paso 4: Protegé el acceso con autenticación robusta

Tus datos financieros no pueden vivir detrás de un proxy básico. Usá una de estas opciones:

Opción A: Cloudflare Tunnel + Authelia (recomendado)

  1. Instalá Authelia:
   docker run -d \
     --name authelia \
     -p 9091:9091 \
     -v ./authelia-config:/config \
     authelia/authelia:latest
   
  1. Configurá Authelia (config.yml):
   theme: dark
   authentication_backend:
     file:
       path: /config/users_database.yml
   access_control:
     default_policy: deny
     rules:
       - domain: actual.tudominio.com
         policy: one_factor
         subject: ["user:admin"]
       - domain: n8n.tudominio.com
         policy: one_factor
         subject: ["user:admin"]
   
  1. Conectá Cloudflare Tunnel a tus servicios:
   cloudflared tunnel --config ./tunnel.json run
   

Opción B: Nginx + Autenticación Básica

   location / {
     auth_basic "Restringido";
     auth_basic_user_file /etc/nginx/.htpasswd;
     proxy_pass http://actual:3001;
   }
   

⚠️ Advertencia: Nunca expongas Actual Budget o n8n directamente a Internet sin autenticación.

Consideraciones y buenas prácticas

Costos reales comparados

ConceptoStack Cloud (USD/mes)Stack Self-Hosted (USD/mes)
Software$14.99 (YNAB) + $19.99 (Zapier)$0
APIs$0 (Plaid incluido en YNAB)$1.50 (SimpleFIN) + $5-$20 (Claude)
Hardware$0 (usás servidores de YNAB/Zapier)$5-$20 (depende de tu proveedor)
**Total****$34.98 – $44.98****$6.50 – $21.50**
### Limitaciones conocidas
  1. Actual Budget no tiene app móvil oficial: Usá la web móvil o herramientas como Actual Budget Mobile.
  2. SimpleFIN no soporta todas las instituciones: Verificá la lista antes de invertir tiempo en configurar tu banco.
  3. Claude API tiene límites: A $5/mes podés hacer ~10K requests. Si tenés muchas transacciones, considerá optimizar el prompt o usar un modelo local como Llama.

Alternativas

  • Para categorización: Usá reglas predefinidas en n8n si no querés depender de APIs externas.
  • Para bancos: Si SimpleFIN no te sirve, probá Teller (soporta más bancos, pero es más caro).

Mantenimiento

  • Actualizá los contenedores mensualmente:
  docker compose pull && docker compose up -d
  
  • Verificá logs de n8n si el workflow falla:
  docker logs n8n
  

Conclusión

El stack self-hosted de finanzas es viable hoy gracias a herramientas como Actual Budget, n8n y SimpleFIN. Los ahorros en costos recurrentes compensan el tiempo de configuración y mantenimiento, especialmente si ya tenés un homelab o servidores en la nube.

¿Cuándo elegir este stack?
  • Si tenés control sobre tu infraestructura
  • Si preferís no depender de APIs externas con límites
  • Si querés evitar pagar $30+ USD/mes por herramientas básicas
¿Cuándo evitarlo?
  • Si no tenés tiempo para debuggear workflows
  • Si tu banco no está soportado por SimpleFIN
  • Si no tenés experiencia con Docker o APIs

Con esta configuración, podés tener un sistema de finanzas automatizado, privado y escalable sin depender de servicios externos.

FIN

Por Gustavo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *