01 — RUNBOOK: Clonar a un Cliente Nuevo
Índice de la página
- 01Step-by-step técnico (manual + automatizado)
- 020. Pre-requisitos
- 031. Provisioning automatizado (clone-script)
- 1.1 Lo que el script automatiza (target v2.0)
- 1.2 Manual hasta que exista el script (v1.0 — proceso de hoy)
- 042. Provisioning manual (lo que NO se puede automatizar)
- 2.1 Pasarelas de pago — del cliente
- 2.2 Cuenta Meta Ads
- 2.3 Equipo de ventas (closer)
- 2.4 Decisiones de branding
- 053. Validación E2E (post-clone)
- 064. Caso especial: cliente con dominio propio
- 075. Lo que falta automatizar (backlog v2.0)
- 086. Roll-back / kill-switch
- 09CHANGELOG
Step-by-step técnico (manual + automatizado)
Pasos exactos que ejecuta Eric (o quien herede el rol DevOps) para llevar un cliente firmado a "infra lista". El objetivo de v2.0 es que el 80% de esto sea 1 click; en v1.0 todavía hay pasos manuales.
Versión: 0.1 (pre-script)
Última actualización: 2026-05-05
Tiempo estimado total: 4-6 horas (v1.0) → 30-60 min (v2.0 con clone_client.py)
0. Pre-requisitos
Antes de tocar este runbook, validar:
- Acuerdo comercial firmado con cliente.
- Cuestionario
03_DECISIONES_CLAVE.mdcompleto y firmado por cliente. -
_CONFIG.mddel cliente armado enclientes-tooaudience/<slug>/_CONFIG.mdcon todas las decisiones del cuestionario. - Slug del cliente decidido y único (validar que no choque con otro cliente). Convención:
<nombre-apellido>o<marca-slug>. Solo lowercase, sin acentos, separar con guiones. - Cliente ya dio acceso a: Meta Business Manager, YouTube Studio, Hotmart productor, dLocal productor, datos transferencia bancaria.
1. Provisioning automatizado (clone-script)
En v1.0 esto es manual paso a paso. Eric construye
scripts/clone_client.pydespués del launch de Martín, idealmente en Python con CLI tipopython3 clone_client.py --slug=<slug> --config=_CONFIG.md.
1.1 Lo que el script automatiza (target v2.0)
| Paso | API | Output |
|---|---|---|
| Crear proyecto Supabase | Supabase Management API | supabase_url, anon_key, service_role_key |
| Aplicar schema multi-tenant | psql contra el nuevo proyecto | tablas creadas con RLS habilitado |
Insertar fila en clients |
INSERT con datos de _CONFIG.md |
client_id UUID |
| Crear servicio Railway | Railway API | railway_service_id, deploy URL |
| Conectar repo bot a nuevo Railway service | Railway API | env vars seteadas |
| Crear nueva ruta en Vercel (no requiere deploy nuevo) | escribir en app/<slug>/page.tsx desde template |
commit a repo tooaudience-paraguas |
Generar client_config.json desde _CONFIG.md |
parseo + render del template | archivo en repo |
Crear carpeta Drive 01 — CLIENTES/<Nombre Cliente>/ |
Drive API | folder ID |
Replicar estructura _CLIENT_TEMPLATE/ en Drive |
Drive API copy | árbol PARA en blanco |
Clonar 19 checklists desde clientes-tooaudience/martin-rieznik/checklists/ con find-replace de martin → <slug> |
python script local | nuevas checklists en clientes-tooaudience/<slug>/checklists/ |
1.2 Manual hasta que exista el script (v1.0 — proceso de hoy)
Ejecutar UNO POR UNO en este orden:
Paso 1 — Supabase
- Login a supabase.com con cuenta TooAudience.
- New Project → nombre
tooaudience-<slug>→ regiónsa-east-1→ password fuerte → DB engine PostgreSQL 16. - Esperar provisioning (1-2 min).
- Copiar
URL,anon key,service_role key→ guardar en_CONFIG.md > infra.supabase. - Aplicar schema (mismo de Martín, en
db/schema_multitenant.sqldel repotooaudience-paraguas):
bash psql "<supabase_db_url>" < db/schema_multitenant.sql - Validar tablas creadas:
clients,leads,eventos,compras,mensajes_wa,miembros_grupo,variantes. - Habilitar RLS en todas las tablas (Supabase UI → Authentication → Policies → enable RLS).
- Insertar fila inicial:
sql INSERT INTO clients (slug, nombre, config_json) VALUES ( '<slug>', '<Nombre Cliente>', '<JSON desde _CONFIG.md>' );
Paso 2 — Railway
- Login a railway.app con cuenta TooAudience.
- New Project → conectar repo
tooaudience-bot-whatsapp→ branchmain. - Service name:
tooaudience-<slug>-bot. - Env vars (copiar de Martín y adaptar):
CLIENT_SLUG=<slug>CLIENT_ID=<UUID de la fila clients>SUPABASE_URL=<del paso 1>SUPABASE_SERVICE_KEY=<del paso 1>WA_API_TOKEN=<del paso 5>WA_PHONE_NUMBER_ID=<del paso 5>WA_VERIFY_TOKEN=<random string>OPENAI_API_KEY=<TooAudience shared>- Otros: ver
templates/_CONFIG.template.md > infra. - Trigger deploy → validar logs sin errores → obtener Railway URL.
Paso 3 — Vercel (ruta nueva, no proyecto nuevo)
- El proyecto Vercel
tooaudience-paraguasya existe (creado para Martín). NO se crea uno nuevo. - En el repo
tooaudience-paraguas:
bash git checkout -b add-client-<slug> cp -r app/martin app/<slug> # find-replace en app/<slug>/* de "martin" → "<slug>" - Generar
public/configs/<slug>.jsondesdetemplates/client_config.json.template(sustituir todas las variables). - Commit + push.
- Vercel auto-deploya → validar que
https://deacademia.com/<slug>/carga correctamente.
Paso 4 — Carpeta del cliente en repo Cortex
- Crear estructura local:
bash mkdir -p "clientes-tooaudience/<slug>/checklists" cp -r clientes-tooaudience/martin-rieznik/checklists/* clientes-tooaudience/<slug>/checklists/ cp clientes-tooaudience/martin-rieznik/00_CONTEXTO.md clientes-tooaudience/<slug>/00_CONTEXTO.md cp clientes-tooaudience/martin-rieznik/02_PLAN_INTERNO_EQUIPO.md clientes-tooaudience/<slug>/02_PLAN_INTERNO_EQUIPO.md - Find-replace de
martin→<slug>yMartín Rieznik→<Nombre Cliente>yLevantArte→<marca>en todos los archivos clonados. - Editar manualmente
00_CONTEXTO.mdcon datos específicos del nuevo cliente (hermano, web, decisiones, etc.). - Crear
_CONFIG.mddesdesop/lanzar-cliente/templates/_CONFIG.template.md.
Paso 5 — WhatsApp Cloud API (Meta)
- En Meta Business Manager (cuenta TooAudience), agregar al cliente como Business Account o crear sub-account.
- WhatsApp → Setup → comprar nuevo número (provisión dura ~30 min).
- Display name:
<Marca>(debe ser aprobado por Meta, ~24-48h). - Configurar webhook:
https://<railway-url>/webhook/whatsappcon verify token. - Aprobar plantillas de mensajes (hello_world, recordatorio_pre_webinar, post_compra_taller, etc.) — ~24h Meta.
- Capturar
phone_number_id,whatsapp_business_account_id,access_token→ guardar en_CONFIG.md > infra.wa_cloud_api. - Iniciar calentamiento del número: ver
clientes-tooaudience/<slug>/checklists/11_WHATSAPP_API_NUMEROS.md(curva 14 días).
Paso 6 — Drive del cliente
- En Drive
TooAudience(0AO3iOcjP6K-PUk9PVA): - Copiar carpeta
00 — SISTEMA TOOAUDIENCE/Templates/_CLIENT_TEMPLATE/→01 — CLIENTES/<Nombre Cliente>/. - Compartir carpeta con cliente (rol Editor o Comentarista según preferencia).
- Subir
_CONFIG.mdy_ROADMAP.mda la raíz de la carpeta del cliente. - Crear subcarpeta
R — Recursos/y subir lo recolectado del scraping.
2. Provisioning manual (lo que NO se puede automatizar)
Estos pasos requieren interacción humana porque dependen de UIs externas o aprobaciones de terceros.
2.1 Pasarelas de pago — del cliente
Esto lo hace el cliente con guía nuestra. Tiempo: 3-5 días dependiendo de aprobación de cuentas.
- Hotmart: cliente abre cuenta de productor, da acceso al equipo TooAudience. Crear 6 productos (TALLER_LUNES, TALLER_MARTES, TALLER_FULL, MEMBRESIA_ANUAL_1PAGO, MEMBRESIA_MENSUAL, MEMBRESIA_6_MESES). Capturar 6 checkout URLs.
- dLocal: cliente abre cuenta productor, da acceso. Crear 6 productos. Capturar URLs/IDs.
- Shopify: definir titularidad (TooAudience como master tienda multi-tenant es el default v1.0). Crear 6 productos. Capturar URLs.
- Skool (opcional): si cliente tiene comunidad Skool con productos pagos, crear 3 SKUs de membresía.
- Transferencia: cliente da datos bancarios (alias/CBU/banco/titular/CUIT). Cortex genera instructivo PDF desde
templates/transferencia_instructivo.template.md.
Ver checklist completa: clientes-tooaudience/<slug>/checklists/16_PASARELAS_PAGO.md.
2.2 Cuenta Meta Ads
Solo cliente puede dar acceso. Tiempo: < 1h.
- Cliente comparte Meta Business Manager con email TooAudience (rol Admin).
- Equipo TooAudience valida: Pixel ID + Conversions API access + Ad Account ID + permission Ads_Management.
- Configurar CAPI server-side desde Vercel
/api/capi-metacon Pixel ID + Access Token del cliente.
2.3 Equipo de ventas (closer)
Si el cliente comparte closer con otros, no requiere reclutamiento. Si no, ver checklist 15.
- Asignar closer principal + backup.
- Onboarding (2 sesiones de training con cliente y Jesús).
- Configurar handoff bot WA → closer (criterios + tooling).
2.4 Decisiones de branding
Solo cliente puede definir su identidad visual.
- Color primario hex.
- Color secundario hex.
- Tipografía (web-safe o Google Font).
- Logo (PNG transparente alta resolución + SVG si tiene).
- Subir logos a
public/clients/<slug>/logo.pngen repotooaudience-paraguas.
3. Validación E2E (post-clone)
Antes de declarar "cliente listo":
- Entrar a
https://deacademia.com/<slug>/desde dispositivo limpio (incógnito + WiFi distinto). - Completar quiz → ser redirigido a WhatsApp con mensaje pre-llenado.
- Mandar mensaje al WA del cliente → bot responde dentro de 60 seg con voz parametrizada del cliente.
- Validar que el lead aparece en Supabase con
client_idcorrecto. - Validar que evento
Leadllega a Meta Events Manager con match rate > 70%. - Visitar
/<slug>/tallery/<slug>/membresia→ precio correcto, todas las URLs de pasarelas funcionan. - Hacer compra test de $1 con tarjeta de testing en cada pasarela → validar webhook → registro en Supabase tabla
comprasconclient_idcorrecto. - Validar que el bot pone al lead en grupo pre-webinar.
- Validar que el cron job del recordatorio pre-webinar dispara (testear con timestamp adelantado).
4. Caso especial: cliente con dominio propio
Default: cliente vive en
deacademia.com/<slug>. Si quiere su propio dominio (<marca>.com):
- Cliente compra dominio.
- Cliente apunta DNS a Vercel project
tooaudience-paraguas(mismo proyecto, otro dominio asociado). - En Vercel: agregar dominio custom + esperar SSL.
- En
client_config.json > infra.base_url, cambiar ahttps://<marca>.com. - En el repo, crear redirect de
/→/<slug>para el dominio nuevo (Next.js middleware).
5. Lo que falta automatizar (backlog v2.0)
| Tarea manual hoy | Cómo automatizarla |
|---|---|
| Crear proyecto Supabase | Supabase Management API + script Python |
| Crear servicio Railway | Railway GraphQL API |
| Find-replace en archivos clonados | Script Python con jinja2 + variables del _CONFIG.md |
| Approval de plantillas WA | NO se puede — depende de Meta. Mitigación: tener pool de plantillas pre-aprobadas reusables. |
| Aprobación cuentas Hotmart/dLocal | NO se puede — depende del cliente. Mitigación: enviar tutorial + checklist 1-pager al cliente día -7. |
| Configurar branding (logo + colores) | Parcial: subida automática del logo a Vercel public folder; colores leen del JSON automáticamente. |
| Calentamiento WA número | NO se puede — proceso de 7-14 días definido por Meta. Mitigación: tener pool de números calentados rotativos. |
6. Roll-back / kill-switch
Si un cliente termina contrato:
- Pausar todas las campañas Meta del cliente (script:
pause_client_ads.py --slug=<slug>). - Dejar funnel + bot en lectura solo (no procesa nuevos leads, sí responde "el programa terminó").
- Exportar todos los datos del cliente desde Supabase (CSV completo de leads + compras + mensajes).
- Entregar exportes al cliente.
- Después de 90 días: archivar carpeta Drive + suspender Supabase project + Railway service.
- Conservar carpeta
clientes-tooaudience/<slug>/con banderaSTATUS=archived.
CHANGELOG
- 2026-05-05 — JT — v0.1 inicial. Pasos manuales documentados.
clone_client.pyqueda como TODO post-Martín.