Automatizar reportes semanales con Supabase y Claude
Cómo crear un workflow automático con n8n que consulta Supabase, analiza los datos con Claude y envía el reporte cada semana sin intervención humana.
Automatizar reportes semanales con datos de Supabase y Claude
Cada lunes por la mañana se repite el mismo ritual: abres Supabase, filtras por fecha, exportas los datos, los pegas en una hoja de cálculo, calculas las métricas que ya sabes de memoria, redactas el resumen para el equipo o el cliente, y lo mandas. Cuarenta y cinco minutos que se van en hacer exactamente lo mismo que hiciste la semana pasada.
Lo peor no es el tiempo. Es que ese tiempo llega justo cuando más necesitas la cabeza despejada para pensar en lo importante. Y si un lunes tienes una reunión a primera hora, el reporte se retrasa, el cliente pregunta, y empiezas la semana con el agua al cuello.
En 2026, ese proceso puede estar completamente automatizado. Te explico cómo lo hago usando Supabase, n8n y Claude.
El problema en detalle
Si tienes una aplicación o un negocio digital, casi seguro que ya usas Supabase para almacenar datos: usuarios registrados, pedidos, eventos, métricas de uso. Esos datos son oro. El problema es que nadie los ve a menos que alguien los extraiga, los procese y los explique.
En la práctica, el flujo manual tiene tres cuellos de botella:
1. Extracción de datos. Hay que saber qué query hacer, filtrar bien por fechas, asegurarse de que no estás mezclando datos de distintos periodos. Un error aquí invalida todo el reporte.
2. Análisis e interpretación. Los números solos no cuentan nada. "Registros esta semana: 47" no dice si eso es bueno o malo, si hay tendencia, qué lo explica. Alguien tiene que pensar sobre eso.
3. Redacción y envío. Formatear el reporte, adaptarlo al receptor (el cliente no necesita los mismos detalles que el equipo técnico), enviarlo al canal correcto.
Esto suma fácilmente 3-5 horas al mes si tienes varios proyectos. Y si alguien cae enfermo o está de vacaciones, los reportes sencillamente no salen.
La solución paso a paso
El workflow automático que voy a describir hace todo esto sin intervención humana: consulta Supabase cada semana, procesa los datos, le pide a Claude que genere el análisis en lenguaje natural, y lo envía por email o Slack. Todo con n8n como orquestador.
Paso 1: Crear el cron trigger en n8n
En n8n, empieza con un nodo Schedule Trigger. Configúralo para que se ejecute cada lunes a las 7:00 AM (o cuando quieras que llegue el reporte).
Trigger: Cron
Expresión: 0 7 * * 1
Esto lanza el workflow automáticamente cada semana. Sin que toques nada.
Paso 2: Consultar Supabase con las fechas correctas
Añade un nodo HTTP Request que llame a la API de Supabase para obtener los datos de la semana anterior.
Method: GET
URL: https://[tu-proyecto].supabase.co/rest/v1/events
Headers:
apikey: [tu-service-key]
Authorization: Bearer [tu-service-key]
Query params:
created_at=gte.{{ $now.minus({weeks: 1}).startOf('week').toISO() }}
created_at=lte.{{ $now.startOf('week').toISO() }}
select=*
Ojo con esto: las fechas dinámicas en n8n pueden ser tramposas. Usa siempre $now con las funciones de Luxon que n8n incluye. Si calculas las fechas a mano en otro nodo y las pasas como string, es fácil que algo falle en semanas con cambio de mes o año.
Si tienes varias tablas relevantes (usuarios nuevos, pedidos, eventos de uso), añade un nodo HTTP Request por cada una. Puedes ejecutarlos en paralelo con Split in Batches o simplemente en serie.
Paso 3: Transformar y agregar los datos
Antes de pasarle los datos en bruto a Claude, merece la pena hacer algo de preprocesamiento con un nodo Code en JavaScript:
const eventos = $input.all().map(item => item.json);
const resumen = {
total_eventos: eventos.length,
por_tipo: {},
primer_dia: eventos[0]?.created_at,
ultimo_dia: eventos[eventos.length - 1]?.created_at
};
for (const evento of eventos) {
const tipo = evento.tipo || 'sin_tipo';
resumen.por_tipo[tipo] = (resumen.por_tipo[tipo] || 0) + 1;
}
return [{ json: resumen }];
Esto hace dos cosas importantes: reduce el volumen de datos (no necesitas mandar 500 filas a Claude, sino un resumen estructurado) y da contexto más limpio al modelo para que genere un análisis útil.
Paso 4: Generar el análisis con Claude
Aquí entra la parte que más me sorprende del proceso. Añade un nodo HTTP Request hacia la API de Anthropic:
Method: POST
URL: https://api.anthropic.com/v1/messages
Headers:
x-api-key: [tu-anthropic-key]
anthropic-version: 2023-06-01
Content-Type: application/json
Body (JSON):
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Eres el analista de negocio de [nombre del proyecto]. Analiza estos datos de la semana del {{ $('Schedule Trigger').item.json.date }} y genera un reporte ejecutivo en español. Incluye: resumen de lo más relevante, comparación con semana anterior si hay datos, alertas si algo destaca negativamente, y 1-2 recomendaciones accionables. Sé conciso, máximo 300 palabras. Datos: {{ JSON.stringify($json) }}"
}
]
}
El truco está en el prompt: definir el rol, el formato esperado, el límite de palabras, y pasar los datos estructurados del paso anterior. Claude genera un texto que cualquier persona del equipo puede leer sin necesidad de interpretar números.
Si tienes datos de semanas anteriores guardados (en Supabase o en una variable de n8n), puedes incluirlos en el prompt para que el análisis tenga contexto temporal real: "esta semana tuvimos un 23% más de registros que la semana pasada."
Paso 5: Enviar el reporte
Último paso: distribuir el análisis. Puedes elegir varios canales según tu caso:
Email (Gmail/SMTP):
Nodo: Send Email
To: equipo@tuempresa.com
Subject: Reporte semanal [Proyecto] — semana del {{ $now.minus({weeks:1}).toFormat('dd/MM') }}
Body: {{ $('HTTP Request - Claude').item.json.content[0].text }}
Slack:
Nodo: Slack
Channel: #reportes-semanales
Message: *Reporte semana {{ $now.minus({weeks:1}).toFormat('dd/MM') }}*
{{ $('HTTP Request - Claude').item.json.content[0].text }}
Guardarlo en Supabase (para histórico):
Nodo: HTTP Request (POST)
URL: https://[tu-proyecto].supabase.co/rest/v1/reportes
Body: { "semana": "...", "contenido": "...", "datos_raw": {...} }
Personalmente recomiendo enviarlo a Slack o email Y guardarlo en Supabase. Así tienes histórico y el equipo lo recibe en tiempo real.
Resultado esperado
Cuando esto está en marcha, cada lunes a las 7:01 AM el equipo ya tiene el reporte en su canal de Slack. Sin que nadie lo haya preparado.
En números concretos: el workflow completo tarda entre 15 y 45 segundos en ejecutarse, dependiendo del volumen de datos. El coste de Claude para generar un análisis de ~300 palabras es de fracciones de céntimo por ejecución. Y el tiempo humano ahorrado son esas 3-5 horas mensuales que antes se iban en tareas repetitivas.
Lo que más valoran los equipos con los que trabajo no es tanto el ahorro de tiempo como la consistencia: el reporte siempre llega, siempre tiene el mismo formato, y nunca se olvida. Cuando el análisis manual dependía de una persona, había semanas en que llegaba tarde o incompleto. Ahora el proceso es independiente de quién esté de vacaciones o con una reunión encima.
Además, una vez que el workflow automático está montado, extenderlo es trivial: añadir una nueva tabla de Supabase, cambiar el canal de destino, incluir una visualización con datos de otra fuente. La base ya está hecha.
Si tienes datos en Supabase y todavía estás generando reportes a mano, este es exactamente el tipo de automatización que tiene más impacto con menos esfuerzo de implementación. Si quieres que te ayude a montarlo adaptado a tu caso concreto, escríbeme aquí.