⚡ Auditoría de Automatizaciones

NutriFlow SaaS — Inventario y Recomendaciones

📅 18 junio 2026 🏢 Stack: Next.js + Supabase + Stripe + Vercel 👥 Equipo: 4 personas ⏳ Acumulación: 18 meses / 3 épocas
21
4 Rotas 3 Obsoletas 8 Activas 4 Solapadas 2 Ausentes
8
Activas
4
Rotas
3
Obsoletas
4
Solapadas
2
Ausentes
📋
Superficie Actual — Inventario Completo
Automatización Capa Estado Prueba / Fuente Problema Rec.
cron-reports.sh
VPS crontab · /opt/nutriflow/scripts/
Local runtime ⚠ Obsoleta VPS migrado hace 3 meses · sin log reciente Migración a nube sin dar de baja el cron original ✕ Cut
weekly-digest.yml
GitHub Actions · .github/workflows/
Repo CI ✓ Activa gh run list --workflow=weekly-digest.yml → última: hace 4 días ✓ Keep
n8n: NF-CRON-001
n8n VPS · nf-cron-001 workflow
n8n (VPS) ⊕ Solapada n8n UI → workflow activo · mismo PDF informe que weekly-digest.yml Duplica weekly-digest.yml — dos informes idénticos enviados cada semana ✕ Cut
ci.yml
GitHub Actions · .github/workflows/ci.yml
Repo CI ✓ Activa gh run list --workflow=ci.yml → 100% verde últimas 20 runs ✓ Keep
stripe-invoice-sync.yml
GitHub Actions · .github/workflows/
Repo CI ⚠ Obsoleta gh run list --workflow=stripe-invoice-sync.yml → último run: 23 días · sin fallo ni éxito confirmado Posible conflicto con Stripe Webhook → Edge Function (misma función) ⚙ Fix Next
deploy-staging.yml
GitHub Actions · .github/workflows/
Repo CI ✓ Activa gh run list --workflow=deploy-staging.yml → última merge develop: hace 2 días · OK ✓ Keep
notify-slack.yml
GitHub Actions · .github/workflows/
Repo CI ✗ Rota gh run list --workflow=notify-slack.yml → último run: error "invalid_auth" Slack token Token Slack expirado; mismo token que mcp-slack ⚙ Fix Next
Stripe Webhook → handle-payment
Supabase Edge Function · /functions/handle-payment
Conector externo ✓ Activa Supabase dashboard → 342 invocaciones últimas 24h · 0 errores ✓ Keep
Stripe Webhook → Zapier #4421
Zapier · Zap ID 4421 → Google Sheets
Conector externo ⊕ Solapada Zapier dashboard → tarea activa · mismo evento payment_intent.succeeded Duplica handle-payment · Google Sheets no es fuente de verdad ✕ Cut
Typeform → Zapier #3105
Zapier → Airtable → email
Conector externo ✗ Rota Zapier history → error "AUTHENTICATION_REQUIRED" Airtable · hace 11 días API key Airtable expirada; flujo de bienvenida caído ✕ Cut
n8n: NF-ONBOARDING-001
n8n VPS · nf-onboarding-001 workflow
n8n (VPS) ⊕ Solapada n8n UI → activo · mismo trigger Typeform que Zapier #3105 Cubre el mismo flujo que el Zapier roto — de hecho lo reemplazó sin darlo de baja ✓ Keep
mcp-supabase
Claude Code MCP · settings.json
MCP local ✓ Activa mcp list → supabase: connected · token < 30 días ✓ Keep
mcp-stripe
Claude Code MCP · settings.json
MCP local ✓ Activa mcp list → stripe: connected · token < 30 días ✓ Keep
mcp-github
Claude Code MCP · settings.json
MCP local ✓ Activa mcp list → github: connected · PAT válido ✓ Keep
mcp-notion
Claude Code MCP · settings.json
MCP local ⚠ Obsoleta settings.json → configurado · token Notion sin rotar 6 meses · no verificado recientemente Token probablemente inválido; Notion no es parte del stack activo ✕ Cut
mcp-slack
Claude Code MCP · settings.json
MCP local ✗ Rota mismo token que notify-slack.yml → error "invalid_auth" confirmado Token compartido con GitHub Actions roto; afecta dos superficies ⚙ Fix Next
sync-customers.py
scripts/ · manual · sin docs
Script local ⚠ Obsoleta git log -- scripts/sync-customers.py → último commit hace 47 días · llamado manualmente Sin documentación; riesgo de duplicar datos si se ejecuta junto a handle-payment ⚙ Fix Next
export-analytics.sh
scripts/ · manual · PostHog → CSV
Script local ⚠ Obsoleta git log -- scripts/export-analytics.sh → último uso hace 2 meses · sin cron · sin CI Uso esporádico; reemplazable por mcp-supabase + PostHog API directamente ✕ Cut
seed-demo.js
scripts/ · referenciado desde ci.yml
Script local ✓ Activa ci.yml line 42: node scripts/seed-demo.js · runs con CI · sin errores ✓ Keep
Monitoreo de errores en producción
— no existe —
◌ Ausente No hay Sentry, ni alerta de edge function en Supabase configurada Sin alerta de errores en producción — los fallos pasan desapercibidos ⚙ Fix Next
Rotación automática de tokens/secrets
— no existe —
◌ Ausente 2 de 4 roturas directamente causadas por tokens expirados sin rotación Causa raíz sistémica: tokens se expiran silenciosamente ⚙ Fix Next
🔍
Hallazgos Clave
Rotura Activa · Alta Severidad
Flujo de bienvenida caído 11 días
Typeform → Zapier #3105 lleva roto desde hace 11 días (API Airtable expirada). Todo lead que entra no recibe email de bienvenida. El workflow n8n NF-ONBOARDING-001 que lo reemplazó quedó activo en paralelo sin darse de baja el Zapier, generando confusión.
Rotura Activa · Media Severidad
Token Slack expirado — 2 superficies afectadas
El mismo Slack Bot Token está referenciado en notify-slack.yml y en mcp-slack. Expiró sin rotación. Ambas superficies fallan silenciosamente. Causa raíz: secreto compartido sin proceso de rotación.
Solapamiento · Desperdicio de recursos
Informe semanal generado dos veces
weekly-digest.yml (GitHub Actions) y NF-CRON-001 (n8n) producen el mismo PDF de métricas y lo envían por email cada lunes. El equipo recibe duplicados. El cron VPS (cron-reports.sh) añade una tercera capa ya sin servidor activo.
Solapamiento · Riesgo de datos
Sincronización Stripe duplicada
Stripe Webhook → handle-payment (Edge Function) y Stripe Webhook → Zapier #4421 → Google Sheets escuchan el mismo evento. Riesgo de doble escritura si algún registro pasa por ambos. stripe-invoice-sync.yml añade una tercera vía sin verificar.
Obsolescencia
mcp-notion sin verificar (6 meses)
El servidor MCP de Notion aparece en settings.json pero el token no se ha rotado en 6 meses. Notion no forma parte del stack activo del equipo. Ocupa espacio de configuración sin aportar valor verificable.
Capacidad Ausente · Crítica
Sin observabilidad en producción
No existe ningún sistema de alerta de errores (Sentry, Supabase alerts, PostHog alerts). El flujo de bienvenida estuvo roto 11 días sin que nadie lo detectara. La causa raíz de la mayoría de roturas es la ausencia de rotación automática de secrets.
🎯
Recomendaciones — Keep / Merge / Cut / Fix Next
Automatización Acción Motivo Prioridad
ci.yml
✓ Keep Tests + build canónico. Sin solapamiento. 100% verde.
weekly-digest.yml
✓ Keep Canal canónico para el informe semanal. Verificado activo.
Stripe Webhook → handle-payment
✓ Keep Edge Function verificada, 0 errores, fuente de verdad para pagos.
n8n: NF-ONBOARDING-001
✓ Keep Canal canónico de onboarding (reemplazó Zapier #3105). Activo y correcto.
mcp-supabase + mcp-stripe + mcp-github
✓ Keep Tres MCPs del stack activo con tokens válidos.
seed-demo.js
✓ Keep Requerido por CI. Funcional.
deploy-staging.yml
✓ Keep Pipeline de staging verificado y activo.
stripe-invoice-sync.yml ← merge
⊕ Merge Lógica absorbible por handle-payment. Verificar solapamiento y eliminar el Actions workflow. Media
notify-slack.yml + mcp-slack
⚙ Fix Next Rotar token Slack Bot. Añadir secreto a GitHub Secrets y a MCP config. Implementar política de rotación (90 días). Alta
sync-customers.py
⚙ Fix Next Documentar, añadir guarda idempotente o integrar en handle-payment para eliminar doble vía. Media
Monitoreo + rotación de secrets
⚙ Fix Next Añadir Sentry/Supabase alerts. Crear cron de rotación en GitHub Actions para secrets críticos. Alta
cron-reports.sh (VPS)
✕ Cut Servidor migrado. Sin logs. Suplantado por weekly-digest.yml.
n8n: NF-CRON-001
✕ Cut Duplica weekly-digest.yml. Equipo recibe dos informes idénticos.
Stripe Webhook → Zapier #4421
✕ Cut Duplica handle-payment. Google Sheets no es fuente de verdad. Riesgo de doble escritura.
Typeform → Zapier #3105
✕ Cut Roto hace 11 días. Reemplazado por NF-ONBOARDING-001. Eliminar para evitar confusión.
mcp-notion
✕ Cut No forma parte del stack activo. Token sin verificar 6 meses. Eliminar de settings.json.
export-analytics.sh
✕ Cut Uso esporádico, sin cron, sin CI. Reemplazable por mcp-supabase en tiempo real.
🚀
Próximos Movimientos — Carril Canónico ECC
P1 · Inmediato
Rotar token Slack + arreglar 2 superficies
Crear nuevo Slack Bot Token, actualizar GitHub Secret SLACK_BOT_TOKEN y mcp-slack en settings.json. Una sola rotación repara notify-slack.yml y mcp-slack simultáneamente. Añadir reminder de rotación a los 90 días.
verification-loop
P1 · Esta semana
Eliminar 5 automatizaciones redundantes
Cut: cron-reports.sh del VPS, NF-CRON-001 en n8n, Zapier #4421, Zapier #3105 y mcp-notion. Reducir superficie de 21 a 16 elementos. Documentar en README.automations.md el carril canónico resultante.
workspace-surface-audit
P2 · Esta semana
Consolidar sincronización Stripe
Verificar si stripe-invoice-sync.yml cubre casos no gestionados por handle-payment. Si hay solapamiento total, absorber la lógica en la Edge Function y eliminar el Actions workflow. Si hay gap, documentarlo.
github-ops
P2 · Próxima semana
Añadir observabilidad en producción
Integrar Sentry en la Edge Function handle-payment y en el frontend Next.js. Activar alertas de Supabase para errores de Edge Functions. Configurar alerta PostHog para caída en tasa de onboarding completado.
ecc-tools-cost-audit
P2 · Próxima semana
Documentar sync-customers.py
Añadir docstring, guard idempotente y decidir: (a) integrarlo en handle-payment como flujo secundario, o (b) convertirlo en GitHub Action con trigger manual y logs. Eliminar el riesgo de doble escritura.
knowledge-ops
P3 · Sprint siguiente
Política de rotación de secrets
Crear GitHub Actions workflow que corra mensualmente, liste secrets con fecha de creación y genere issue si alguno supera los 90 días sin rotar. Eliminar la causa raíz sistémica de las roturas por tokens expirados.
verification-loop
🛤️
Carril Canónico Objetivo (post-auditoría)
Repo CI / Automation
✓ ci.yml — tests + build
✓ weekly-digest.yml — informe
✓ deploy-staging.yml — staging
✓ notify-slack.yml — alertas (post fix)
Conectores / Webhooks
✓ Stripe → handle-payment (Edge Fn)
✓ Typeform → NF-ONBOARDING-001 (n8n)
✗ Todos los Zapier → eliminados
MCP Stack Local
✓ mcp-supabase
✓ mcp-stripe
✓ mcp-github
✓ mcp-slack (post fix token)