Pitch interno · sesión Julián

Sistema Acelera tu CRM

Producto que vendemos hoy + sistema analítico montado + visión SaaS. Mapa técnico denso, sin venta. Para dimensionar contigo lo que se puede vender y cómo escalarlo.

Fecha sesión
29 mayo 2026 — viernes
Presenta
Pablo Rodríguez · CEO
Modalidad
Videollamada · 60–90 min
Objetivo
Dimensionar producto + decidir Fase 1–2
Desliza

Lo que veremos hoy

Cinco bloques. Cada uno con su porqué. Al final, las 13 preguntas concretas donde tu criterio nos desbloquea.

01

Producto que vendemos

Catálogo modular, paquetes combinados y full-service. Pricing real (Zoho Books). Reglas duras: umbral cliente, compromiso mínimo, no descuentos.

02

Sistema analítico

Arquitectura end-to-end: tracking → Sheet warehouse → CRM sync → dashboards HTML → CAPI offline → IA. Cómo está montado y por qué.

03

Las 3 capas de valor

Datos a plataformas · Calidad de leads · Avisos sobre proceso comercial. Y la línea roja: hasta dónde llegamos y dónde paramos.

04

Decisiones razonadas

Los 8 hitos de arquitectura donde elegimos algo y descartamos otro. Con su trade-off. Donde tú puedes decirnos: ahí la cagasteis.

05

Visión SaaS + tus preguntas

Roadmap 4 fases del producto-vendible. Y 13 preguntas concretas (arquitectura, producto, pricing, riesgo) donde necesito tu criterio técnico.

El sistema analítico, alto nivel

Tres flujos paralelos que convergen en un único Sheet warehouse por cliente. De ahí salen dashboards y análisis de IA. Stack: N8N self-hosted + Claude Cloud + Google Sheets + HTML/JS custom + VPS Hetzner.

01

Plataformas Ads → Sheet

Meta Ads y Google Ads sincronizados al Sheet del cliente. Granularidad día × ad. Diario a las 06:00.

StackN8N HTTP Request → Meta/Google API → Google Sheets append
Meta Ads Sync extrae 30+ columnas (spend, impressions, reach, frequency, clicks, link_clicks, landing_page_views, leads, video_plays_3s, thruplays, quality_ranking, engagement_rate_ranking, conversion_rate_ranking, tipo_anuncio). Google Ads equivalente con 60 columnas incluyendo campaign_type para split YouTube/Display/Search. Cada cliente tiene su propio par de workflows duplicado del template.
02

CRM cliente → Sheet (cualquier CRM)

Polling cada 15 min al CRM del cliente con COQL. Recibe records completos de Leads y Deals.

PatternPolling N8N · 1 workflow Leads + 1 workflow Deals + 1 OAuth Self Client
Query canónica: select * from Leads where Modified_Time > NOW() - 30min. Si añaden un campo en el CRM mañana, llega solo. Sustituyó al patrón viejo de webhook con Form-Data (que requería enumerar 23+ campos a mano por cliente). Latencia 15 min — aceptable salvo para WhatsApp inmediato, que sigue siendo webhook.
03

Sheet → API → Dashboard + IA

El Sheet es el warehouse. Encima, 3 webhooks N8N sirven JSON bruto al dashboard HTML y a la capa de análisis con Claude.

RepartoN8N = transporte · JS browser = blends + métricas · Claude = insights
3 webhooks: /api-leads, /api-meta, /api-google. Filtros por cliente + rango de fechas. Decisión clave: las métricas calculadas (CPL, CPA, ROAS, ROI, hook_rate, etc.) viven en metrics.js y blends.js del browser, NO en N8N. Menos workflows que mantener, cache navegador, cambiar una fórmula no toca infra.

Las 3 capas de analítica

Aquí está el valor del producto. Cada capa resuelve una pregunta distinta. La frontera entre la capa 3 y "consultoría comercial" es la decisión estratégica más importante que hemos tomado.

Las 3 capas, qué resuelve cada una

Capa 1Datos de vuelta a plataformas
Meta y Google optimizan a ventas reales
Capa 2Calidad de leads (interno)
Sabemos qué ad produce clientes que pagan
Capa 3Avisos sobre proceso comercial
Speed-to-lead, no-shows, conversión etapas
Capa 4"Cómo lo arreglas"
NO entramos. Línea roja.

Qué se le entrega al cliente

Capa 1 (Pixel + CAPI offline)
Auto
Capa 2 (dashboard cliente)
Mensual
Capa 3 (alertas + informe)
Semanal
Capa 4 (consultoría)
Por qué la línea roja

Capa 1, 2 y 3 escalan como producto. Capa 4 — "te decimos cómo organizar tu equipo de ventas" — exige consultoría customizada por cliente y rompe el modelo SaaS. Mejor mantenernos como agencia de Ads con CRM inteligente que te avisa que pivotar a consultora comercial. Cuando el cliente pregunta "y qué hago", la respuesta es: "esta es la métrica, esta es la tendencia, decisión tuya." Damos consejo si lo pide, no plan de acción operativo.

Un único tracking.js universal

Reutilizable cliente a cliente con config. Pixel + GA4 + Clarity + CAPI server-side. Cuatro reglas duras aprendidas en campo — cada una nos costó al menos un incidente para fijarla.

01

Pixel ↔ CAPI con event_id compartido

Cada conversión emite un event_id único. Browser lo manda al Pixel; servidor lo manda al CAPI con el mismo ID. Meta deduplica.

Sin estoHinchas conversiones x2 sin saberlo
El event_id es un crypto.randomUUID() generado en el momento del submit. Se persiste en sessionStorage y se envía al backend, que lo incluye en el payload CAPI. Verificación en Events Manager: ratio de match-quality. Objetivo EMQ: A o B. Si está en C → hay un campo PII no normalizado (típicamente phone sin SHA-256 limpio).
02

GA4 init inline en <head>, nunca lazy

Si cargas gtag.js con defer o desde un componente React montado tarde, pierdes la primera pageview.

Síntoma típico"GA4 marca 0 sessions desde X canal"
La pageview inicial es ~70 % de los eventos en sites de captación. Si el script se inicializa después del primer paint, GA4 no la registra. Regla: el snippet del gtag va inline en el `<head>` del documento, no en un componente lazy. Comprobado en cinco clientes distintos.
03

Phone normalizado antes de SHA-256

Meta requiere phone hasheado pero solo dígitos. Si dejas espacios, "+34" o paréntesis, el hash no matchea.

ResultadoEMQ sube de C a A
Pipeline: phone.replace(/\D/g,'')SHA-256toLowerCase() hex. Lo mismo aplica al CRM: si guardas teléfonos formateados, normalizar antes de mandarlos al CAPI. Las primeras 6-8 semanas con un cliente nuevo, vigilar EMQ semanalmente.
04

.trim() defensivo en variables de entorno

Vercel mete \n literales al final de variables de entorno. El Pixel se rompe en mobile sin tirar error visible en consola.

Bug real24 mayo 2026 — form móvil silencioso
Cualquier process.env.NEXT_PUBLIC_* que sirva un ID se trim-ea defensivamente: const PIXEL_ID = process.env.NEXT_PUBLIC_PIXEL_ID?.trim(). Antes de tirar deploy nuevo, verificar con console.log(JSON.stringify(PIXEL_ID)) que no haya escape chars. Regla permanente en CLAUDE.md del workspace.

Webhook real-time vs polling 15 min

Cambiamos el patrón de sincronización CRM cuando vimos que el setup escalaba mal. Latencia 1s vs 15 min — aceptable porque los flujos que requieren inmediatez (WhatsApp al lead nuevo) siguen siendo webhook.

Antes — Webhook

Real-time, pero caro de operar

Workflow Rule en el CRM + Custom Function (Deluge) o Webhook Form-Data enumerando 23+ campos a mano. Cada cliente nuevo = 30+ min de clics en su UI.

  • Latencia <1s — ideal en teoría
  • Setup 30+ min por cliente (UI manual)
  • Mantenimiento alto: cada campo nuevo en CRM = actualizar webhook
  • Form-Data no soporta "All Fields"
  • Errores frecuentes de autorización scopes Deluge
Ahora — Polling

15 min, pero zero-touch

2 workflows N8N por cliente (Leads + Deals) con COQL select * from Module where Modified_Time > NOW() - 30min. 1 OAuth Self Client. Setup 5 min duplicando template.

  • Latencia 15 min — aceptable para todo salvo WhatsApp inmediato
  • Setup 5 min duplicando workflow + cambiando refresh_token
  • Zero clics en UI del CRM
  • Trae record COMPLETO siempre — añadir campo = llega solo
  • Backfill trivial (cambiar ventana temporal y ejecutar manual)
Caveat conocido: COQL devuelve HTTP 204 body vacío cuando no hay registros. Hay que tratar el responseFormat como text + parser SAFE_PARSE con fallback {data:[]}. El template ya lo trae.

Lead = Deal aplanado + LTV tracking

Para nosotros como agencia, lead y deal son la misma persona en distintos puntos del funnel. Una sola fila por persona durante toda su vida. Esta decisión simplifica radicalmente el modelo de datos del dashboard.

01

Una fila, toda la vida

Cuando un lead se convierte en deal ganado, NO creamos una fila nueva — enriquecemos la existente. Cuando vuelve y compra otra cosa, sumamos al LTV de esa misma fila.

4 cols LTVlifetime_purchases · lifetime_revenue · last_purchase_date · is_recurrent
Las métricas históricas del dashboard (CVR, ROAS por campaña, ticket medio) cuentan solo primeras ventas — los campos venta, importe_venta, fecha_venta se quedan como están. Los 4 nuevos campos LTV son extra, para gráficos opcionales de recurrencia. No rompen métricas existentes.
02

Cascade matching Lead ↔ Deal

Cuando llega un Deal del CRM, busca la fila del Lead por 3 vías en orden. Solo si las 3 fallan, crea fila nueva.

Orden cascadalead_id custom → email → phone (últimos 9 dígitos) → fila nueva
El lead_id custom (si existe Workflow Rule en el CRM que lo escribe al convertir Lead→Deal) es match directo y 100 % fiable. Email es lowercase + trim. Phone normalizado a últimos 9 dígitos (independiente de prefijo). Para clientes nuevos pedimos Workflow Rule desde día 1.
03

Lógica primera venta vs upsell

Si Lead.venta == 0 → es primera venta: enrich completo (touchea funnel + LTV). Si Lead.venta == 1 → es upsell: solo LTV, no toca el funnel.

Implementaciónscript Python por cliente, cron horario
Cada cliente tiene su enrich-[client].py que corre cada hora vía cron. Lee Deals modificados, hace cascade matching, decide primera/upsell, escribe en el Sheet. Preserva métricas históricas de campañas — si un cliente vuelve por una campaña distinta, la atribución original no se contamina.

Meta CAPI Offline — el cierre del loop

Aquí está la mayor parte del valor técnico que vendemos. La mayoría de agencias optimiza Meta contra "leads de formulario". Nosotros mandamos a Meta los estados reales del CRM. Cambio de magnitud, no de % marginal.

01

Workflow disparado por cambio de stage

Cuando un Lead/Deal cambia de stage en el CRM, un webhook dispara un workflow N8N que manda el evento correspondiente al Conversions API de Meta.

4 eventosQualified · Meeting · Purchase (con value) · Lost (con razón)
Cada evento lleva el Source_Ad_ID capturado en la creación del lead (vía UTMs). Meta recibe la cadena completa: ad X → lead → cualificación → reunión → compra de Y €. Configurado en eventos custom del Events Manager. Verificable en el "Quality" tab del píxel.
02

Optimización de Meta cambia

Cuando le mandas Purchase a Meta en vez de Lead, el algoritmo deja de buscar gente que rellena formularios y empieza a buscar gente que compra.

Efecto medidoCPL baja en volumen, pero CPA real (cliente que paga) baja MÁS
Patrón visto en varios clientes: durante la transición, el CPL aparente puede subir (Meta filtra más). El CPA real (coste por cliente que paga) baja. Mensaje al cliente: "te van a entrar menos leads pero más cualificados". Hay que prepararlo psicológicamente antes del cambio, o piensa que rompiste algo.
03

Equivalente Google (en roadmap)

Google Ads tiene Enhanced Conversions y Offline Conversion Imports. Funcionalidad equivalente, sistematización aún manual cliente a cliente.

Próximo hitoWorkflow Google equivalente al de Meta — pendiente Fase 1
El concepto es idéntico: GCLID en lugar de Source_Ad_ID, formato CSV o Conversion Adjustment API, eventos custom. Lo pendiente es escribirlo como workflow estándar reutilizable. Si Julián tiene experiencia aquí, oro puro.

Dashboards: por qué HTML custom

Decisión tomada en abril 2026 después de descartar Looker Studio y Grafana. Cada cliente tiene su dashboard en cliente.aceleratucrm.com. Misma app, configs distintas.

Descartados

Looker · Grafana

Ambos resuelven el problema de visualización, pero rompen el modelo de producto que queremos vender.

  • Looker Studio: diseño genérico, no embebible en propio dominio, hay que operarlo manual cliente a cliente. Cero diferenciación visual.
  • Grafana: potente, pero estética de "monitoring tool". No transmite producto premium al cliente final.
  • Ambos: hosting externo del frontend = sin control sobre paleta / branding / experiencia
  • Ambos: blends complicados de mantener cliente a cliente
Elegido

HTML custom + JS + N8N webhooks

Template compartido + config JSON por cliente. Misma app sirve a todos, el JS detecta el subdominio y carga la config correspondiente.

  • Control total de paleta Acelera, branding en cada cliente
  • Subdominio propio cliente.aceleratucrm.com (PWA + responsive)
  • 12 secciones modulares activables por config (platform-aware)
  • 2 tiers: Nivel 1 incluido en Ads · Nivel 2 custom desde 1.500 €
  • Blends y métricas en JavaScript browser (no N8N) → cache, sin redeploy
  • PDF export, AI summary inline, count-up animations, bento layouts
Trade-off conocido: el template HTML/JS es un repo monolítico que Claude mantiene. Si quisiéramos que el cliente personalizara (drag & drop), habría que añadir una capa de componentes — Fase 3 del producto SaaS.

Sistema operativo IA con Claude Cloud

N8N invoca prompts Claude por SSH al VPS, que leen Sheet + CRM y producen JSON estructurado. Pipeline genérico que se aplica a cualquier flujo analítico recurrente. Aquí está el techo de escalabilidad — una de las preguntas para ti.

01

Pipeline canónico

Cron N8N → SSH al VPS → bash script → claude -p "<prompt>" → parser JSON entre marcadores → notificar.sh → dashboard interno (SSE).

StackN8N + SSH ed25519 + bash + claude-sonnet-4-6 + parser regex
El prompt termina con marcadores literales <<<SUMMARY>>>...<<<END>>> que el parser extrae. Si el modelo no encuentra novedades, devuelve <<<SKIP>>>. notificar.sh hace routing per-empleado per-cliente: lee asignaciones, escribe en el dashboard correcto. El dashboard interno tiene SSE para actualización en vivo.
02

Casos genéricos aplicables a cualquier cliente

El pipeline soporta cualquier prompt que lea datos + escriba conclusión. No es específico de un caso.

Tipos de flujoBriefing matutino · Score salud · Análisis semanal · Diagnóstico funnel · Informe mensual · Optimización propuestas · Monitor emails
Cada flujo es un par (prompt template, schedule, output destino). La capacidad técnica clave es que la lógica de negocio vive en el prompt, no en el código. Iterar = editar markdown. Esto permite que cualquier flujo nuevo (ej. "analiza el ROI por canal de este cliente cada lunes") sea un fichero de texto + una línea en N8N.
03

Coste: plan suscripción vs API

A nuestro volumen, plan suscripción Claude Pro ≈ 200 €/mes. Estimación API equivalente: 3-5 k$/mes. Diferencia x15-25.

Trade-offSuscripción tiene rate limits — 1-2 h de pausa si los alcanzas
Cuando llegamos al límite, N8N marca verde pero el siguiente claude -p falla con error. Solución actual: distribuir cargas en franjas horarias distintas (briefing 6:00, análisis semanal lunes 10:00, etc.). Esto es probablemente lo que más limita la escalabilidad lineal y donde tu opinión técnica es oro puro.

Decisiones razonadas con su trade-off

Cada una de estas elecciones tiene un coste. Las hicimos con el conocimiento que teníamos. Dime cuáles te parecen erróneas.

D1

N8N self-hosted vs Zapier/Make

Razón: coste predecible (CPX32 ~13 €/mes vs Zapier 200+ € a este volumen) + Code nodes + integración Postgres/SSH. Precio: single-instance, sin HA. Backups diarios.

D2

Sheets warehouse vs Postgres directo

Razón: velocidad iteración, cliente puede abrir, suficiente <50 k filas, cero coste. Precio: rendimiento. A 10 k filas el dashboard tarda. Migrar en Fase 2.

D3

Polling 15 min vs webhook real-time

Razón: setup pasa de 30 min UI a 5 min duplicar workflow. Sin mantener campos. Precio: latencia 15 min. Webhook se mantiene solo para WhatsApp inmediato.

D4

Lead = Deal aplanado vs N filas

Razón: simplicidad del modelo de datos para dashboards. ROAS coherente sin doble-conteo. Precio: complejidad del script enrichment, encapsulada en 1 Python por cliente.

D5

HTML custom vs Looker/Grafana

Razón: control paleta + embebible subdominio + PWA mobile + features exclusivas. Precio: mantener template. 1 cambio = redeploy global.

D6

Blends en JS browser vs N8N

Razón: menos workflows que mantener, cacheable, cambiar fórmula no toca infra. Precio: rendimiento browser (mitigado con cache 5 min).

D7

Claude Cloud plan vs API

Razón: coste fijo ≈ 200 €/mes vs API estimada 3-5 k$/mes. Precio: rate limits del plan, pausas 1-2 h cuando se alcanzan.

D8

Línea roja "no operativa comercial cliente"

Razón: capas 1-3 escalan como producto. Capa 4 ("qué hacer") rompe modelo SaaS y nos pivota a consultora. Precio: renunciamos a un trozo de fee enterprise.

Roadmap 4 fases

De producto-agencia custom (hoy) a producto vendible standalone (12-24 meses). Cada fase tiene un trigger distinto. Fase 1 ya tiene equipo asignado.

Fase 0 — HOY
Mayo 2026 · estado actual
Producto-agencia. Sistema custom por cliente. Cada uno con su Sheet, sus workflows, sus dashboards.
Setup costoso. ~10 h/mes Pablo + Víctor + Óscar por cliente activo.
Alto valor entregado. Tracking + dashboard + CAPI offline + IA insights.
No escala lineal. Cada cliente nuevo añade carga operativa proporcional.
Fase 1 — Profesionalización interna
Jun – Nov 2026 · 3-6 meses
Equipo: Domingo Vallejo (Poténciate, empresa separada, colaboración sin equity). Kick-off real 22 mayo 2026.
Migración warehouse Sheets → Postgres en VPS cuando se cruce umbral 10 clientes / 50 k filas.
Multi-tenancy en código — sacar config por cliente de scripts hardcoded a tabla canónica.
Observabilidad — Grafana + Sentry + uptime monitoring. Backups automatizados Postgres + N8N + Sheets legacy.
Refactor invocación Claude — sustituir SSH directo por capa más limpia (FastAPI + cola Redis a evaluar).
Documentación arquitectura — hoy vive en CLAUDE.md sueltos del workspace. Hay que consolidar.
Fase 2 — MVP SaaS escalable
Dic 2026 – Jun 2027 · 6-12 meses
Schema universal de 20 campos núcleo (lead_id, source, medium, campaign, ad_id, status, owner, qualified_at, meeting_held, deal_amount, won_at, lost_reason, lifetime_revenue, etc.) aplicable a cualquier CRM.
Conectores: Zoho + Hubspot + Pipedrive + Meta + Google + TikTok. Marketplace inicial de 6 integraciones.
Onboarding self-service para tier Starter (cliente conecta su CRM solo, sin Pablo en medio).
3 tiers definidos: Starter / Pro / Enterprise. Pricing validado con 5-10 clientes pago.
Dashboard estándar + 1 informe IA/semana automático + alertas email/Telegram configurables.
Fase 3 — Producto vendible standalone
Jul 2027 – May 2028 · 12-24 meses
Login centralizado + multi-tenant real (row-level security en Postgres o esquemas separados).
API pública para integraciones de terceros + webhooks salientes.
Marketplace de conectores — terceros pueden añadir conectores a CRMs/plataformas adicionales.
Plan Pro y Enterprise vendidos a agencias y empresas medianas.
Posible white-label para que agencias revendan con su propia marca.

13 preguntas + 3 peticiones de cierre

Para que esta sesión no se quede en "qué chulo" y produzca decisiones que pueda accionar la semana que viene.

Preguntas técnicas (8)

  • Arquitectura 1: N8N self-hosted, ¿hasta cuántos clientes aguanta single-instance? ¿Cluster / Temporal / Airflow / propio?
  • Arquitectura 2: Sheets → Postgres / BigQuery. ¿Mismo VPS o managed (Supabase / Neon / RDS)? Pros / contras según volumen.
  • Arquitectura 3: claude -p por SSH → ¿FastAPI + cola Redis delante? ¿O servicio HTTP propio con worker pool?
  • Arquitectura 4: Multi-tenancy. ¿RLS Postgres, schemas separados o DBs separadas?
  • Arquitectura 5: Plan Claude Pro no escala lineal. ¿Cuándo cruzar a API? ¿Self-hosted modelo más pequeño para tareas simples?
  • Producto 1: Schema universal de 20 campos. ¿Lista propuesta es la correcta? ¿Qué falta? ¿Qué sobra?
  • Producto 2: Conectores. ¿Qué CRM después de Zoho? Hubspot por volumen. ¿GoHighLevel? ¿Pipedrive?
  • Producto 3: ¿SaaS standalone self-service o producto white-label para agencias? Cambia mucho el roadmap.

Pricing + riesgo (5)

  • Pricing 1: Starter 49 € viable o destruye margen? ¿Pro 249 € competitivo?
  • Pricing 2: Compresión del trabajo manual. Hoy ~10 h/mes/cliente. ¿% automatizable realista a Fase 2?
  • Riesgo 1: GDPR / data residency. ¿Cifrado en reposo + DPA + servidor EU obligatorio?
  • Riesgo 2: Vendor lock-in Claude. ¿Plan B si Anthropic sube x3 o cambia plan?
  • Riesgo 3: Mantenimiento conectores. Meta cambia API cada 6 meses. ¿Quién mantiene? ¿Tests regresión automatizados?

Tres peticiones concretas para hoy

(1) Recomendación de arquitectura para Fase 1-2 — qué priorizar primero. (2) Validar / refutar los 20 campos del schema universal. (3) Decidir si entras en Fase 1 con Domingo o solo nos das criterio puntual.

Pablo apunta respuestas y enviamos resumen 3 bullet en 24 h