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:
| Componente | Rol | Alternativa en nube |
|---|---|---|
| **Actual Budget** | Motor de presupuesto (enfoque *envelope*) | YNAB |
| **n8n** | Orquestador de workflows | Zapier / Make |
| **SimpleFIN** | Conector de bancos vía API | Plaid (integrado en YNAB) |
| **Claude API** | Categorización inteligente de transacciones | ChatGPT (o reglas predefinidas en YNAB) |
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.
- Creá un directorio para el proyecto:
mkdir ~/finance-automation && cd ~/finance-automation
- 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
- Iniciá el contenedor:
docker compose up -d
- Accedé a la interfaz web en
http://<tu-servidor>:3001y completá la configuración inicial:
– 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.
- Registrate en SimpleFIN y obtené tu API key.
- 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.
- 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:
- Obtener transacciones desde SimpleFIN
- Categorizarlas con Claude API
- Registrarlas en Actual Budget
3.1. Despliegue de n8n
- 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
- Reiniciá los servicios:
docker compose up -d
- Accedé a n8n en
http://<tu-servidor>:5678e iniciá sesión con las credenciales configuradas.
3.2. Configuración del workflow
- Creá un nuevo workflow y agregá estos nodos en orden:
– Function (transformación de datos)
– Code (llamada a Claude API para categorización)
– HTTP Request (registro en Actual Budget)
- Nodo HTTP Request (SimpleFIN):
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.
- 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;
- 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";
}
- Nodo HTTP Request (Actual Budget API):
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"
}
- Configurá el disparador (Trigger):
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)
- Instalá Authelia:
docker run -d \
--name authelia \
-p 9091:9091 \
-v ./authelia-config:/config \
authelia/authelia:latest
- 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"]
- 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
| Concepto | Stack 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** |
- Actual Budget no tiene app móvil oficial: Usá la web móvil o herramientas como Actual Budget Mobile.
- SimpleFIN no soporta todas las instituciones: Verificá la lista antes de invertir tiempo en configurar tu banco.
- 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
- 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