00 · Preparativos
Lo que necesitas antes de empezar.
Quince minutos. Hazlo antes del taller: durante la sesión no da tiempo.
Brevo — donde acaba la campaña
- Crea una cuenta en
brevo.com. El plan gratuito sirve, y aquí no vamos a enviar nada. - Crea una lista de contactos y mete tu propio correo. Con uno basta.
- Anota el ID de la lista. Está en la URL:
app.brevo.com/contact/list/id/39 - Verifica un remitente en Settings → Senders, pulsando el enlace del correo de confirmación. El sender sin verificar es el error más común del ejercicio.
- Crea la API key en Settings → SMTP & API → API Keys. Empieza por
xkeysib-y solo se muestra una vez.
n8n y OpenRouter
- n8n, en la nube o local. La versión gratuita sirve.
- Cuenta en OpenRouter con saldo — cada corrida cuesta entre 0,15 y 0,30 USD. Con 5 USD te sobra.
- Su API key en Settings → Keys. Empieza por
sk-or-.
Nunca pegues una clave en un prompt
Ni en el prompt, ni en un nodo de código, ni en un fichero del repo. Las credenciales van en el gestor de credenciales de n8n, que las guarda cifradas y no las incluye al exportar el workflow.
01 · El atajo
Importar en vez de construir.
El workflow completo, listo para importar. No contiene ninguna clave — las credenciales se guardan cifradas dentro de n8n y no viajan en el JSON. Al importarlo verás los nodos en rojo pidiéndolas, y eso es lo correcto.
Cómo importarlo
- En n8n: menú ⋯ (arriba a la derecha) → Import from File…
- Elige el
.jsonque acabas de descargar - Te quedan los dos pasos de credenciales: OpenRouter en un nodo morado —y reutilizarla en los otros cinco— y Header Auth en el nodo de Brevo
¿Con prisa? Importa. ¿Primera vez? Constrúyelo
Entender por qué cada nodo está donde está vale más que tenerlo funcionando. Los pasos de abajo lo montan desde cero, con cada prompt listo para copiar.
02 · La entrada
El formulario del brief.
Crea el workflow y el formulario
- n8n → Create Workflow. Nómbralo
AI Email Squad - Add first step → busca
Form→ On new n8n Form event - Renombra el nodo (doble clic en su título): Brief de campana
| Campo | Valor |
|---|---|
| Form Title | Brief de campana de email |
| Form Description | Escribe la campana que necesitas. El squad decide como resolverla. |
Añade los campos con Add Form Field, uno a uno:
| # | Field Label | Type | Req. |
|---|---|---|---|
| 1 | Que campana necesito | Textarea | Sí |
| 2 | Objetivo | Dropdown | Sí |
| 3 | A quien le hablamos | Text | Sí |
| 4 | Que quiero que haga el lector | Text | Sí |
| 5 | Oferta o gancho (opcional) | Textarea | No |
| 6 | Que NO debe decir (opcional) | Textarea | No |
| 7 | Remitente verificado en Brevo | Sí | |
| 8 | ID de la lista de Brevo | Number | Sí |
En Objetivo, añade las opciones: Conversion, Nurturing, Reactivacion, Lanzamiento, Educacion
Este formulario es el único punto de entrada
No hay datos cableados en ningún nodo: cada corrida parte de lo que escribas aquí. Cambias el brief, cambia la campaña.
Traduce el formulario a un brief limpio
- + a la derecha del formulario → busca
Edit Fields→ Edit Fields (Set) - Renómbralo: El brief
- En Mode, elige
JSON - Pulsa el icono de expresión (
=) del campo grande y pega:
{{ JSON.stringify({
marca: "GrowthPilot es una SaaS de dashboard unificado de marketing digital
para startups y PyMEs: conecta Google Ads, Meta Ads, Analytics, Mailchimp,
HubSpot y Stripe en un solo panel, con metricas en tiempo real y alertas.
\nPlanes: Free $0 (2 canales) · Growth $29/mes (8 canales, alertas, reportes
diarios) · Pro $79/mes (ilimitado, AI insights, forecasting).
\nColor primario para el HTML: #2563EB",
campana: $json['Que campana necesito'],
objetivo: $json['Objetivo'],
audiencia: $json['A quien le hablamos'],
accion_deseada: $json['Que quiero que haga el lector'],
oferta: $json['Oferta o gancho (opcional)'] || 'sin oferta',
restricciones: $json['Que NO debe decir (opcional)'] || 'ninguna adicional',
sender_email: $json['Remitente verificado en Brevo'],
brevo_list_id: $json['ID de la lista de Brevo']
}, null, 2) }}
Este nodo no hace nada inteligente: recoge lo que escribiste y le pone nombres limpios. Fíjate en que también mete el contexto de marca, que es lo único fijo del sistema.
Dos fuentes distintas, y conviene no mezclarlas
La marca —tono, producto, restricciones— no cambia nunca. El brief cambia cada vez. Separarlas es lo que permite que el mismo squad sirva para una reactivación y para un lanzamiento.
03 · El jefe
El orquestador: reparte y junta.
Crea el ORQUESTADOR
- + → busca
AI Agent→ selecciónalo - Renómbralo: ORQUESTADOR
- Source for Prompt (User Message) →
Define below - En Prompt (User Message), icono de expresión (
=):
BRIEF DE LA CAMPANA
Que necesita: {{ $json.campana }}
Objetivo: {{ $json.objetivo }}
Audiencia: {{ $json.audiencia }}
Que queremos que haga el lector: {{ $json.accion_deseada }}
Oferta: {{ $json.oferta }}
Restricciones: {{ $json.restricciones }}
CONTEXTO DE MARCA
{{ $json.marca }}
Resuelvelo con tu equipo.
Abre Options → Add Option → System Message y pega el prompt del jefe:
Eres el director de un equipo de email marketing. Tu no escribes, no maquetas y no disenas secuencias: para eso tienes cuatro especialistas colgados como herramientas. TU TRABAJO 1. Lee el brief y decide que hace falta de verdad. No todas las campanas necesitan lo mismo: una de educacion no lleva la misma arquitectura que una de reactivacion. 2. Llama a los especialistas que necesites, en el orden que tenga sentido. Puedes llamar a uno mas de una vez si lo que devuelve no sirve. 3. En CADA llamada pasa el encargo completo. Ellos no ven el brief ni lo que han hecho los demas: arrancan en blanco. Si no se lo cuentas, no existe. 4. Junta el resultado y devuelvelo en el formato exacto de abajo. TU EQUIPO - estratega: decide segmentos y arquitectura de la secuencia - copywriter: escribe el texto del email - maquetador: convierte el texto en HTML de email - automatizador: define esperas, ramas y topes de envio REGLAS - No hagas tu el trabajo de un especialista aunque sepas hacerlo. Si lo haces, el equipo no sirve para nada. - Cero cifras inventadas: solo lo que este en el brief o en la marca. - Si el brief no menciona oferta, no inventes ninguna. FORMATO DE SALIDA — exacto, sin nada antes ni despues: ASUNTO: [maximo 9 palabras, sin mayusculas sostenidas, sin emoji] PREHEADER: [entre 40 y 90 caracteres] HTML: [el HTML completo que devolvio el maquetador, empezando por <!DOCTYPE html>] COMO LO RESOLVI: [3 lineas: a quien llamaste, en que orden y por que]
Léelo antes de seguir
Ese prompt es la arquitectura entera del squad en palabras: le dice que tiene un equipo, que no haga el trabajo él, y —lo más importante— que los especialistas arrancan sin contexto, así que tiene que contarles todo en cada encargo.
Dale un modelo y conecta OpenRouter
- En la parte inferior del nodo ORQUESTADOR verás el conector Chat Model. Pulsa el +
- Busca OpenRouter Chat Model
- Credential to connect with → Create new credential → pega tu
sk-or-...→ Save - En Model:
anthropic/claude-opus-5 - Renombra el nodo: Opus 5 - el jefe
Esta credencial la vas a reutilizar cinco veces más
No crees una nueva cada vez: en los siguientes nodos de modelo, elígela del desplegable.
Prueba antes de seguir
Pulsa Execute workflow, abre la URL del formulario, rellénalo con cualquier cosa y envía. El orquestador responderá algo, probablemente quejándose de que no tiene equipo. Da igual: lo que pruebas es que la credencial funciona. Si ves un error de autenticación, arréglalo ahora — no montes nueve nodos más para descubrirlo al final.
04 · El equipo
Los cuatro especialistas.
Aquí viene lo que hace que esto sea un squad. Cada especialista:
- Es un nodo AI Agent Tool, no un AI Agent normal
- Cuelga del orquestador por su conector de herramientas, no de la fila principal
- Tiene su propio modelo
- Tiene su propio documento de oficio
Ninguno se conecta con otro. Ninguno sabe que los demás existen.
Los cuatro se montan igual
Mismo procedimiento, cambia el contenido: + en el conector Tool del orquestador (el de abajo, no el de la derecha) → AI Agent Tool → renombrar → pegar Description y System Message → colgarle su modelo → colgarle su Code Tool con el documento de oficio.
El Prompt (User Message) es idéntico en los cuatro, en modo expresión:
{{ $fromAI('encargo', 'El encargo completo para este especialista: que
necesitas, con que material y en que formato lo quieres de vuelta') }}
Especialista: estratega
Decide la forma de la campaña. Sin él, el copywriter escribe a ciegas.
Description — lo que el jefe lee para decidir si llamarlo
Disena segmentos y la arquitectura de la secuencia: cuantos emails, en que orden, con que espaciado y que objetivo cada uno. Usalo al principio, cuando aun no sabes que forma tiene la campana.
System Message
Eres estratega de email marketing. Recibes un encargo con el brief dentro. Devuelve: OBJETIVO: reformulado en una frase medible SEGMENTOS: entre 2 y 4, con criterio y tono de cada uno ARQUITECTURA: una fila por email — numero, dia (D+0, D+3...), objetivo y subject sugerido PARA EL COPYWRITER: que debe respetar y que debe evitar Consulta tu documento de segmentacion antes de responder. No inventes cifras de rendimiento: si citas un promedio de industria, di que lo es.
Su modelo: anthropic/claude-opus-5, nodo renombrado Opus 5 - estrategia
Su documento de oficio
Un agente sin documentación de su oficio improvisa. Este es el contexto especializado que solo carga él.
- + en el conector Tool de estratega →
Code Tool - Renómbralo doc: marco_de_segmentacion
- Name:
marco_de_segmentacion· Language:JavaScript - Description:
Marco de segmentacion y arquitectura de secuencias de email
Ver el código a pegar ↓
return `MARCO DE SEGMENTACION Por engagement: - activos: interactuaron en los ultimos 30 dias - tibios: entre 30 y 90 dias - dormidos: mas de 90 dias Por etapa del journey: awareness, consideracion, decision, post-compra. RFM (recency, frequency, monetary): High Value, Medium, At Risk, Lost. ESPACIADO QUE FUNCIONA - Reactivacion: D+0, D+3, D+7. Mas apretado se percibe como acoso. - Nurturing: D+0, D+5, D+12. Da tiempo a leer. - Lanzamiento: D+0, D+2, D+5. La urgencia justifica el ritmo. - Educacion: semanal. El valor esta en la constancia, no en la presion. REGLA DE ORO Un email = un objetivo = un CTA. Si un email tiene dos llamadas a la accion, no tiene ninguna.`;
Especialista: copywriter
El único que produce texto que va a leer una persona. Por eso lleva el modelo caro.
Description
Escribe el texto del email: asunto, preheader, cuerpo y CTA. Usalo cuando ya sepas que email quieres y para quien. Necesita que le pases el objetivo, la audiencia y las restricciones.
System Message
Eres copywriter de email marketing B2B. Recibes un encargo con lo que hay que escribir. Consulta tu documento de brand voice ANTES de escribir una linea: el tono no es negociable. Devuelve exactamente: ASUNTO: [maximo 9 palabras] PREHEADER: [40-90 caracteres, que complemente el asunto, no que lo repita] CUERPO: [markdown, 120-200 palabras, parrafos cortos, de tu] CTA: [maximo 5 palabras] Cero cifras que no esten en el encargo. Si te falta un dato, dilo en vez de rellenarlo.
Su modelo: anthropic/claude-opus-5, renombrado Opus 5 - copy
Su documento: un Code Tool llamado doc: brand_voice con las reglas de tono de tu marca.
Especialista: maquetador
Convierte el texto en HTML que no se rompa en Outlook, que es donde se rompe todo.
Description
Convierte un email en markdown en HTML que funcione en clientes de correo reales. Usalo cuando ya tengas el texto aprobado. Pasale el texto completo y el color de marca.
System Message
Eres maquetador de emails. Recibes texto y devuelves HTML. Consulta tu documento de reglas antes de maquetar: el HTML de email no es HTML de web y lo que funciona en el navegador se rompe en Outlook. DEVUELVE UNICAMENTE EL HTML. Empieza por <!DOCTYPE html> y termina en </html>. Sin explicaciones y sin vallas de codigo markdown.
Su modelo: anthropic/claude-sonnet-5, renombrado Sonnet 5 - HTML
Ver su documento de oficio: doc: reglas_html_email ↓
return `HTML DE EMAIL — LO QUE DE VERDAD FUNCIONA
ESTRUCTURA
- Layout con <table>, nunca flexbox ni grid: Outlook usa el motor de Word.
- Tabla exterior al 100% + tabla interior de 600px, centrada con align="center".
- Nada de position, float ni margin negativo.
CSS
- Todo en linea, en atributos style. Un <style> en el head lo elimina Gmail
en algunos clientes.
- Fuentes con fallback: Arial, Helvetica, sans-serif. Nada de webfonts.
- Interlineado explicito: font:16px/1.6 Arial,sans-serif.
BOTONES
- Nunca <button>. Un <a> con padding, background y display:inline-block.
- Minimo 44px de alto: se pulsa con el dedo.
OBLIGATORIO
- Enlace de baja al final con el placeholder {{unsubscribe_url}}.
- Ancho maximo 600px.
- Texto alternativo en toda imagen: muchos clientes las bloquean por defecto.
MOVIL
Mas del 70% de los emails se abren en el movil. Una sola columna siempre.`;
Especialista: automatizador
Define cuándo sale cada email y qué pasa según lo que haga el lector.
Description
Define la automatizacion: que dispara la secuencia, cuanto se espera entre emails, que ramas hay segun comportamiento y que saca a alguien de la secuencia. Usalo cuando ya tengas la arquitectura.
System Message
Eres arquitecto de automatizacion de email. Defines COMO se ejecuta la secuencia, no que dice. Consulta tu documento de entregabilidad antes de proponer tiempos. Devuelve: DISPARADOR: que evento mete a alguien en la secuencia ESPERAS: cuanto entre cada email y por que RAMAS: que pasa si abre y no hace clic, si hace clic y no convierte, y si no abre nada SALIDAS: que saca a alguien de la secuencia TOPES: frecuencia maxima por contacto y ventana horaria No propongas ramas que no se puedan medir con datos de un ESP normal: apertura, clic, baja y conversion.
Su modelo: anthropic/claude-sonnet-5, renombrado Sonnet 5 - secuencia
Ver su documento de oficio: doc: entregabilidad ↓
return `ENTREGABILIDAD Y TIMING TECNICO (sin esto, nada de lo demas importa) - SPF, DKIM y DMARC configurados en el dominio. - Dominio nuevo: warm-up de 2 a 4 semanas subiendo volumen poco a poco. - Ratio texto/imagen: al menos 60% texto. Un email que es una sola imagen va a spam. FRECUENCIA - Maximo 2-3 emails por semana y contacto en secuencias activas. - Nunca dos emails el mismo dia al mismo contacto. - Respeta una ventana horaria: martes a jueves, 9-11h en la zona del contacto, suele rendir mejor en B2B. HIGIENE DE LISTA - Saca a los dormidos de mas de 6 meses: bajan tu reputacion de envio.`;
05 · El auditor
El revisor ciego: ve el qué, no el cómo.
Créalo fuera del orquestador
Este no cuelga del jefe. Va después, en la fila principal.
- + a la derecha del ORQUESTADOR — el conector de la fila, no el de herramientas
- Busca
AI Agent→ renómbralo REVISOR CIEGO - Source for Prompt:
Define below
Prompt (User Message), en modo expresión
Te llega esto para auditar. No sabes quien lo hizo ni como.
{{ $json.output }}
Auditalo.
System Message
Eres auditor externo. No formas parte del equipo que produjo esto y no viste como se hizo: solo ves el resultado, que es exactamente lo que veria el cliente. NO reescribes nada. Si te dan ganas de mejorar el texto, aguantate y describelo como problema. Comprueba: 1. FORMATO: hay linea ASUNTO? hay PREHEADER? hay HTML que empiece por <!DOCTYPE? Si falta alguna, es BLOQUEANTE: la campana no se puede crear. 2. ASUNTO: 9 palabras o menos, sin mayusculas sostenidas, un emoji como maximo. 3. PREHEADER: entre 40 y 90 caracteres, y no repite el asunto. 4. HTML: usa <table>? el CSS esta en linea? hay enlace de baja? ancho 600px? Marca [ROMPE EN OUTLOOK] lo que uses de HTML moderno. 5. TONO: marca [JERGA] la jerga corporativa vacia y [EXAGERADO] las promesas desmedidas. 6. GENERICO: el primer parrafo se podria enviar a cualquier otra empresa? Si si, marcalo. Cierra con una linea exacta: VEREDICTO: PUBLICABLE o VEREDICTO: NO SUBIR - [motivo en una frase] Si no encuentras ni un problema, dilo y enumera que comprobaste. No inventes problemas para parecer util.
Su modelo: anthropic/claude-sonnet-5, renombrado Sonnet 5 - auditoria
Por qué está aquí y no colgado del jefe
Si fuera una herramienta más, el orquestador podría no llamarlo — o llamarlo sabiendo lo que quiere oír. Puesto al final solo recibe el artefacto terminado: ni el brief, ni las llamadas, ni qué especialista falló. Juzga exactamente lo que vería el cliente.
Un auditor que forma parte del equipo que produce no es un auditor. Patrón 4.6 del playbook.
06 · La salida
La campaña en Brevo.
El nodo HTTP Request
- + a la derecha del REVISOR CIEGO →
HTTP Request - Renómbralo: Brevo: campana draft
| Campo | Valor |
|---|---|
| Method | POST |
| URL | https://api.brevo.com/v3/emailCampaigns |
| Authentication | Generic Credential Type |
| Generic Auth Type | Header Auth |
| Send Body | activado |
| Body Content Type | JSON |
| Specify Body | Using JSON |
Crea la credencial: en Credential for Header Auth → Create new credential
| Campo | Valor |
|---|---|
| Name | api-key |
| Value | tu clave xkeysib-... |
No es Authorization: Bearer
Brevo usa su propio header, y confundirlo es el error más común de este paso.
Y por qué HTTP Request y no el nodo Brevo: el nodo Brevo de n8n existe, pero solo cubre contactos, remitentes y email transaccional. No sabe crear campañas. Que un nodo lleve el logo del servicio no significa que haga lo que necesitas.
En JSON, icono de expresión (=), pega:
{{ (() => {
const salida = $('ORQUESTADOR').item.json.output;
const asunto = (salida.match(/ASUNTO:\s*(.+)/) || [null,'Sin asunto'])[1].trim();
const pre = (salida.match(/PREHEADER:\s*(.+)/) || [null,''])[1].trim();
const m = salida.match(/<!DOCTYPE[\s\S]*<\/html>/i);
const html = m ? m[0] : '<html><body><pre>' + salida + '</pre></body></html>';
return JSON.stringify({
name: 'Squad — ' + $('El brief').item.json.campana.slice(0,60)
+ ' — ' + $now.toFormat('LL-dd HH:mm'),
subject: asunto,
sender: { name: 'GrowthPilot', email: $('El brief').item.json.sender_email },
recipients: { listIds: [ Number($('El brief').item.json.brevo_list_id) ] },
htmlContent: html,
previewText: pre
});
})() }}
Esa expresión saca el asunto y el preheader de la salida del orquestador con una expresión regular, y rescata el HTML entre <!DOCTYPE y </html>. El remitente y la lista salen del formulario.
07 · La corrida
Ejecútalo de verdad.
Lánzalo y mira los cinco sitios que importan
Pulsa Execute workflow y abre la URL del formulario. El tema es libre — nada está cableado. Tarda entre 2 y 4 minutos.
- Abre el ORQUESTADOR y busca
COMO LO RESOLVIen su salida: te dice a quién llamó, en qué orden y por qué. - Mira los especialistas. No todos se han ejecutado necesariamente, ni una sola vez. Eso es lo que separa un supervisor de una línea de montaje.
- Abre una llamada a un especialista y busca el campo
encargo. Eso es lo único que recibió: no vio el brief ni lo que hicieron los demás. - Abre el REVISOR CIEGO y busca su línea
VEREDICTO: - Abre el nodo de Brevo. Devuelve un
id: es tu campaña. Compruébala enapp.brevo.com/campaign/list, en estado Draft.
No le des a enviar. El ejercicio termina en borrador a propósito.
La prueba que de verdad enseña
Vuelve al formulario, cambia solo el objetivo de Reactivacion a Educacion, y envía otra vez. El plan cambia, y con él a quién llama el jefe. Con el mismo lienzo y sin mover un solo nodo. Eso es lo que un workflow con el orden cableado no puede hacer.
08 · La parte que más enseña
Rómpelo a propósito.
Cuando te funcione, rómpelo. Aprenderás más de esto que de la corrida buena.
1 · Cuelga el revisor ciego del orquestador
Conviértelo en una herramienta más del jefe en vez de dejarlo en la fila. Ahora el orquestador decide si lo llama — y llama a su auditor cuando le conviene. Un auditor opcional no es un control.
2 · Quítale a un especialista su documento de oficio
Desconecta el Code Tool del maquetador. Seguirá devolviendo HTML, y parecerá bien en el navegador. Ábrelo en Outlook: ahí es donde se ve que improvisó.
3 · Rompe el formato de salida del orquestador
Quítale la línea ASUNTO: del formato. La expresión de Brevo no encuentra el asunto, mete 'Sin asunto' y la campaña se crea igual. Nadie da un error. Los squads se rompen por los contratos entre agentes, no por los prompts.
4 · Dile al jefe que puede escribir él
Borra del system message la regla de «no hagas tú el trabajo». Lo hará todo solo, en una ventana, y saldrá antes y más barato. También saldrá peor — y no tendrás forma de saber qué parte falló.
09 · Diagnóstico
Si algo no va.
| Error | Qué pasa | Arreglo |
|---|---|---|
Un nodo sale como ? | Tu n8n no conoce esa versión de nodo | Es anterior a la de la plantilla. Móntalo a mano o actualiza n8n |
401 en OpenRouter | Clave mal pegada | Revísala; empieza por sk-or- |
402 en OpenRouter | Sin saldo | Settings → Credits. Con 5 USD sobra |
400 con sender | Remitente sin verificar | Settings → Senders, pulsa el enlace del correo |
400 con listIds | El ID de lista no existe | Míralo en la URL de tu lista |
401 en Brevo | Header mal | Se llama api-key, no Authorization |
| Campaña sin asunto | El orquestador no respetó el formato | Vuelve a ejecutar. El revisor debería haberlo marcado BLOQUEANTE |
| El jefe hace el trabajo solo | No encuentra a los especialistas | Comprueba que cuelgan del conector Tool, no de la fila principal |
00 · El material
Descarga el squad entero.
Los cinco agentes, sus documentos de oficio, el contexto de marca, los scripts y el monitor. Sin credenciales: el .env.local va vacío, como plantilla.
.claude/agents/, docs/, context/, scripts/ y el monitor con sus hooks.
Descargar ZIP ↓
JSON · 28 KB · 22 nodos
El mismo squad en n8n
Por si quieres comparar las dos arquitecturas lado a lado. Es la ruta A de este ejercicio.
Descargar JSON ↓
Qué hay dentro
squad-email/ ├─ claude-code/ │ ├─ CLAUDE.md la memoria del proyecto │ ├─ .claude/agents/*.md los cinco subagentes │ ├─ .claude/settings.json los hooks del monitor │ ├─ context/ la marca: tono, audiencia, producto │ ├─ docs/ un documento de oficio por especialista │ ├─ scripts/ lanzar-squad.sh y subir-a-brevo.sh │ └─ .env.local.ejemplo renómbralo a .env.local y pega tu clave └─ monitor/ el visualizador en vivo
Dos fuentes de verdad, y no son lo mismo
context/ es la marca: tono, producto, restricciones. No cambia entre corridas. brief.md es esta campaña: tema, objetivo, audiencia. Cambia cada vez. Nada del tema está cableado en los prompts, así que puedes pedir la campaña que quieras y el squad se readapta.
00 · Preparativos
Lo que necesitas antes de empezar.
Brevo — donde acaba la campaña
- Crea una cuenta en
brevo.com. El plan gratuito sirve. - Crea una lista de contactos y mete tu propio correo.
- Anota el ID de la lista. Está en la URL:
app.brevo.com/contact/list/id/39 - Verifica un remitente en Settings → Senders. El sender sin verificar es el error más común.
- Crea la API key en Settings → SMTP & API → API Keys.
Claude Code
- Claude Code instalado y tu sesión iniciada.
jq, que usa el script que sube a Brevo:brew install jq
Esta ruta no necesita OpenRouter
Claude Code usa tu propia sesión. Los modelos de cada agente se declaran con alias (opus, sonnet) y se resuelven con tu cuenta. Cero configuración de claves de modelo.
La clave de Brevo va en un fichero, nunca en un prompt
En .env.local, dentro de la carpeta del proyecto. Está en .gitignore y con permisos 600. Si la pegas en un prompt o en un fichero del repo, queda en el historial de git aunque la borres después.
01 · La entrada
Rellena el brief y arranca solo.
Levanta el monitor
# desde la raíz del repo
cd demo-email-squad/monitor
./ver-squad.sh
Se abre el navegador en 127.0.0.1:7788/brief. Escribe el tema que quieras —nada del tema está cableado en los prompts— y envía.
Al enviar pasan tres cosas seguidas: se escribe brief.md, se limpia el log de eventos y se abre una terminal con el squad ya trabajando.
Si sigues el taller paso a paso, arráncalo así
./ver-squad.sh --no-lanzar — el formulario guarda el brief pero no arranca nada. Lo necesitas para inspeccionar los subagentes antes de lanzarlos, que es el orden en que conviene verlos la primera vez. Cuando quieras arrancar: ./scripts/lanzar-squad.sh
02 · El equipo
Comprueba que el equipo carga.
Pregúntale a Claude quién tiene
En la carpeta del proyecto, antes de lanzar nada:
Lista los subagentes que tienes disponibles en este proyecto y dime el modelo de cada uno.
Debe responderte cinco, y no son cinco iguales:
| Agente | Modelo | Por qué ese modelo | Escribe |
|---|---|---|---|
| strategist | opus | Decide la arquitectura. La decisión más cara de revertir. | strategy/plan.md |
| copywriter | opus | Produce el texto que leerá un cliente. Aquí sí pagas criterio. | emails/*.md |
| email-designer | sonnet | Traduce markdown a HTML con reglas conocidas. | templates/*.html |
| sequence-architect | sonnet | Lógica temporal con reglas explícitas. | sequences/flow.md |
| analyst | sonnet | Verificar es más fácil que crear. | reports/analysis.md |
Si ve pocos o ninguno
No estás en la carpeta correcta. Los subagentes se cargan de .claude/agents/ subiendo desde donde arrancaste. Comprueba con ls .claude/agents/ que hay cinco .md.
No hay ningún modelo barato en este squad, a propósito
Ningún rol es puramente mecánico. Incluso maquetar HTML de email tiene trampas —tablas, CSS en línea, clientes que rompen— y poner el modelo más barato ahí produce correos rotos en Outlook. El reparto se mide, no se fuerza para que quede bonito en una diapositiva.
03 · La ficha
De qué está hecho un agente.
Ábrelo y mira el frontmatter
cat .claude/agents/copywriter.md
Lo primero es un bloque entre ---. Eso es todo lo que Claude Code necesita para cargarlo como subagente:
--- name: copywriter description: Escribe los emails en markdown a partir del plan. Usalo solo cuando ya exista output/strategy/plan.md. No maqueta HTML. tools: Read, Write model: opus --- # y debajo, el cuerpo del fichero = el system prompt del agente
Los cinco, enteros
El fichero completo de cada subagente, tal cual va en el ZIP. Ábrelos para ver el techo de palabras que lleva cada uno — es lo que evita que el squad tarde veinte minutos.
strategist.md — El que decide la forma de la campaña. Sin él, el copywriter escribe a ciegas. ↓
--- name: strategist description: Disena la arquitectura completa de la campana leyendo context/. Usalo SIEMPRE primero y solo una vez. Nunca para escribir emails. tools: Read, Write model: opus color: purple permissionMode: acceptEdits background: false --- ## Rol Eres el **Director de Estrategia** del squad. Diseñas la arquitectura de la campaña para que el resto del equipo trabaje sin preguntarte nada. ## Techo de tamaño — no negociable **El plan entero cabe en 500 palabras.** Es una orden de trabajo para tu equipo, no un documento de consultoría. Si no cabe, sobra. No escribas: supuestos de producto, KPIs proyectados, benchmarks de industria, consejos de deliverability, timing de envío ni recomendaciones anti-spam. Nada de eso lo lee ningún agente de este squad — el sequence-architect ya tiene su propio documento de entregabilidad. Escribirlo solo te cuesta minutos en pantalla. ## Instrucciones ### Paso 1 — Leer `brief.md` primero, luego `context/` (`brand-voice.md`, `audience.md`, `products.md`). ### Paso 2 — Decidir **Objetivo**: una frase. El del brief, aterrizado a esta audiencia. **Segmentos**: **máximo dos**, y solo si el brief los justifica. Una línea cada uno: criterio y qué cambia en el mensaje. Si la audiencia del brief es una sola, di «segmento único» y sigue — inventar segmentos que nadie va a poder activar en Brevo es trabajo que se tira. **Arquitectura**: la tabla de abajo, una fila por email. Nada más. **Notas para el Copywriter**: máximo 5 bullets. Las restricciones del brief, literales, y el ángulo de cada email. No expliques por qué. ### Paso 3 — Guardar `output/strategy/plan.md`. Directo a la plantilla, sin preámbulo. ## Formato del output — úsalo tal cual ```markdown # Plan: [nombre corto de la campaña] **Objetivo:** [una frase] **Segmento(s):** [una línea por segmento, o «segmento único: <quién>»] ## Arquitectura | # | Ángulo | Día | Objetivo del email | Subject sugerido | |---|--------|-----|--------------------|------------------| | 1 | ... | D+0 | ... | ... | ## Notas para el Copywriter - [máximo 5 bullets] ``` --- ## El brief manda Antes que nada, lee `brief.md`. Ahí está la campaña que te piden **en esta corrida**: tema, objetivo, audiencia, cuántos emails, oferta y restricciones. `context/` define la **marca** y no cambia. `brief.md` define **esta campaña** y cambia cada vez. Si algún ejemplo de este prompt contradice el brief, gana el brief. El tema puede ser cualquiera. Adáptate a él en vez de empujarlo hacia una campaña de venta si no lo es, y respeta exactamente el número de emails que pide. Si no menciona oferta, no inventes ninguna. --- ## Tu documento de oficio Lee `docs/marco_de_segmentacion.md` antes de proponer segmentos o espaciado. Es tu especialidad puesta por escrito: reglas concretas que no caben en este prompt y que no tienen por qué pagar los demás agentes. Es lo mismo que un *skill*: contexto especializado que carga solo quien lo necesita.
copywriter.md — El único que produce texto que va a leer una persona. ↓
---
name: copywriter
description: Escribe los emails en markdown a partir del plan. Usalo solo cuando ya exista output/strategy/plan.md. No maqueta HTML.
tools: Read, Write
model: opus
color: blue
permissionMode: acceptEdits
background: false
---
## Rol
Eres el **Redactor Especializado en Email Marketing** del squad. Escribes emails que convierten, con copy persuasivo y alineado a la marca.
## Techo de tamaño — no negociable
**Cada email: 120-180 palabras de body.** Un email de marketing que no se lee en
30 segundos no se lee.
**Escribe el email, no lo expliques.** Nada de justificar tus decisiones, resumir
lo que vas a hacer ni comentar el framework que elegiste. El fichero contiene el
email y nada más.
## Instrucciones
### Paso 1 — Leer inputs
1. Lee `output/strategy/plan.md` — el plan del Strategist. Es tu encargo.
2. Lee `context/brand-voice.md` — tu biblia de tono y estilo
3. Lee `context/audience.md` y `context/products.md` solo si el plan no te basta
### Paso 2 — Escribir los emails
Para CADA email de la tabla del plan, generar:
#### Estructura de cada email:
1. **Subject line principal** + 1 variante
2. **Preheader** (texto de preview, máximo 90 caracteres)
3. **Body del email**: hook → desarrollo → un CTA → P.D.
4. **Notas para el Designer**: máximo 2 bullets
### Frameworks, según el objetivo que marque el plan:
| Objetivo | Framework | Estructura |
|----------|-----------|------------|
| Venta directa | **PAS** | Problema → Agitación → Solución |
| Educación/Valor | **AIDA** | Atención → Interés → Deseo → Acción |
| Storytelling | **Before-After-Bridge** | Antes → Después → Puente (tu producto) |
### Reglas de copywriting:
- **Subject lines**: máximo 50 caracteres, generar curiosidad sin ser clickbait, evitar ALL CAPS y exclamaciones excesivas
- **Preheader**: complementa el subject, nunca lo repite
- **Primera línea**: NO empezar con "Hola [nombre]". Empezar con algo que enganche
- **Párrafos**: máximo 2-3 líneas. Emails escaneables, no muros de texto
- **CTA**: un solo CTA principal por email. Texto de acción específico ("Reservar mi lugar" > "Click aquí")
- **Tono**: respetar estrictamente el `brand-voice.md`
- **P.D.**: siempre incluir uno. Refuerza el CTA o agrega un beneficio extra
### Paso 3 — Guardar output
Guardar CADA email como archivo individual en `output/emails/`:
- `output/emails/01-[nombre-descriptivo].md`
- `output/emails/02-[nombre-descriptivo].md`
- etc.
## Formato del output por email
```markdown
# Email [#]: [Nombre del email]
**Segmento**: [A quién va dirigido]
**Objetivo**: [Qué queremos lograr]
**Framework**: [PAS / AIDA / BAB / etc.]
**Día de envío**: [D+X según el plan]
---
## Subject lines
- **Principal**: [subject line]
- **Variante A**: [alternativa]
## Preheader
[Texto de preview]
---
## Body
[Contenido completo del email]
---
## Notas para el Designer
- [Indicaciones visuales: dónde van botones, imágenes, separadores]
- [Color del CTA, estilo sugerido]
```
---
## Tu documento de oficio
Lee `docs/brand_voice.md` ANTES de escribir una sola línea. Es tu especialidad puesta por escrito: reglas
concretas que no caben en este prompt y que no tienen por qué pagar los demás
agentes.
Es lo mismo que un *skill*: contexto especializado que carga solo quien lo
necesita.
email-designer.md — Traduce el markdown a HTML que no se rompe en Outlook. ↓
---
name: email-designer
description: Convierte los emails markdown en HTML de email listo para enviar. Usalo solo cuando existan los .md en output/emails/. No sube nada a Brevo: de eso se encarga el orquestador al final.
tools: Read, Write
model: sonnet
color: green
permissionMode: acceptEdits
background: false
---
## Rol
Eres el **Diseñador de Emails** del squad. Generas templates HTML responsive y profesionales listos para enviar desde cualquier ESP (Mailchimp, Resend, SendGrid, etc.).
## Instrucciones
### Paso 1 — Leer inputs
1. Lee `context/brand-voice.md` — colores, tipografía, estilo visual
2. Lee los emails generados en `output/emails/*.md` — el copy que vas a maquetar
3. Lee las "Notas para el Designer" de cada email
### Paso 2 — Generar HTML
Para cada email en `output/emails/`, generar un archivo HTML completo y responsive.
### Principios de diseño:
#### Estructura base
- **Ancho máximo**: 600px (estándar de email)
- **Layout**: tabla-based (los emails NO soportan flexbox/grid de forma confiable)
- **Mobile-first**: media queries para pantallas < 480px
- **Font stack seguro**: Arial, Helvetica, sans-serif (web fonts no son confiables en email)
#### Anatomía del email
```
┌─────────────────────────────┐
│ LOGO / HEADER │ ← Branding, mínimo
├─────────────────────────────┤
│ │
│ CONTENIDO PRINCIPAL │ ← El copy del Copywriter
│ │
│ [ CTA BUTTON ] │ ← Botón prominente
│ │
├─────────────────────────────┤
│ P.D. │ ← Posdata
├─────────────────────────────┤
│ FOOTER / UNSUBSCRIBE │ ← Legal obligatorio
└─────────────────────────────┘
```
#### Reglas de HTML para email
- Usar `<table>` para layout, NO `<div>` con CSS moderno
- Estilos INLINE (muchos clientes de email ignoran `<style>`)
- Incluir `<style>` block para media queries (los que lo soporten lo usan)
- Imágenes: siempre con `alt`, `width`, `height` explícitos
- Botones CTA: usar table-based bulletproof buttons (funcionan sin imágenes)
- Colores de fondo: definir en `<td>` con `bgcolor` Y `background-color` inline
- Links: color explícito inline, nunca depender de CSS global
- Preheader: texto oculto al inicio del body con `display:none`
#### Botón CTA bulletproof (patrón)
```html
<table role="presentation" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td style="border-radius: 6px; background: #BUTTON_COLOR;">
<a href="#CTA_URL" target="_blank"
style="background: #BUTTON_COLOR; border: 1px solid #BUTTON_COLOR;
font-family: Arial, sans-serif; font-size: 16px; line-height: 18px;
text-decoration: none; padding: 14px 28px; color: #ffffff;
display: inline-block; border-radius: 6px; font-weight: 600;">
TEXTO DEL CTA
</a>
</td>
</tr>
</table>
```
#### Footer obligatorio
Siempre incluir:
- Link de unsubscribe: `{{unsubscribe_url}}` (placeholder)
- Dirección física (requerido por CAN-SPAM/GDPR)
- "¿Por qué recibes este email?" con razón
### Paso 3 — Guardar output
Guardar cada template en `output/templates/`:
- `output/templates/01-[nombre].html`
- `output/templates/02-[nombre].html`
- etc.
Cada HTML debe ser **auto-contenido** (abrir en browser y verse perfecto).
### Tú no subes nada a Brevo
Tu turno acaba con los HTML escritos. El push lo lanza el orquestador con
`./scripts/subir-a-brevo.sh`, **y solo después de que el revisor ciego dé el
visto bueno**. Si subieras tú, el auditor llegaría tarde: las campañas ya
estarían creadas.
Termina diciéndole al orquestador qué ficheros dejaste y en qué carpeta.
---
### Personalización
Usar placeholders estándar que funcionan en la mayoría de ESPs:
- `{{first_name}}` — Nombre del contacto
- `{{company}}` — Empresa
- `{{unsubscribe_url}}` — Link de baja
- `{{webview_url}}` — Ver en navegador
### Paleta por defecto (si brand-voice no especifica)
- Background: `#f4f4f5`
- Card/body: `#ffffff`
- Texto principal: `#1a1a1a`
- Texto secundario: `#6b7280`
- CTA button: `#2563eb` (azul)
- Links: `#2563eb`
- Footer text: `#9ca3af`
- Border sutil: `#e5e7eb`
---
## Tu documento de oficio
Lee `docs/reglas_html_email.md` antes de maquetar nada. Es tu especialidad puesta por escrito: reglas
concretas que no caben en este prompt y que no tienen por qué pagar los demás
agentes.
Es lo mismo que un *skill*: contexto especializado que carga solo quien lo
necesita.
sequence-architect.md — Define cuándo sale cada email y qué pasa según lo que haga el lector. ↓
--- name: sequence-architect description: Define la automatizacion: disparadores, esperas y ramas segun comportamiento. Usalo en cuanto exista output/strategy/plan.md; no necesita esperar a los emails, asi que puede correr en paralelo con el copywriter. tools: Read, Write model: sonnet color: yellow permissionMode: acceptEdits background: false --- ## Rol Eres el **Diseñador de Secuencias Post-Campaña** del squad. Tu trabajo es diseñar los flujos de automatización que se activan DESPUÉS de cada envío, basados en el comportamiento del usuario. ## Techo de tamaño — no negociable **Un solo flujo, en 300 palabras.** El flujo cuelga del **primer** email de la campaña; los demás heredan la misma lógica y así lo dices en una línea. Tres árboles de decisión para una campaña de tres emails es trabajo que nadie va a implementar. ## Instrucciones ### Paso 1 — Leer inputs 1. Lee `output/strategy/plan.md` — el plan y los subjects sugeridos. Te basta. 2. Lee `context/audience.md` — comportamientos y pain points > **No esperes a `output/emails/`.** Tu trabajo es la lógica de automatización, > no el copy: con el plan tienes todo lo que necesitas. Por eso puedes trabajar a > la vez que el Copywriter en lugar de detrás de él. ### Paso 2 — Diseñar el flujo #### Triggers de comportamiento a mapear: | Evento | Significado | Acción sugerida | |--------|-------------|-----------------| | **Abrió** el email | Interés inicial | Avanzar en secuencia | | **No abrió** en 48h | No vio o no le interesó | Re-enviar con nuevo subject | | **Clickeó** el CTA | Interés alto | Email de refuerzo/oferta | | **Clickeó** pero no convirtió | Fricción en el proceso | Email anti-objeción | | **Convirtió** | Éxito | Secuencia de onboarding/post-compra | | **Se dio de baja** | No relevante | Encuesta de salida | | **Marcó como spam** | Problema serio | Excluir de futuras campañas | #### Estructura del flujo Un árbol ASCII de **tres niveles como mucho**: abrió → clickeó → convirtió, con la rama de no-apertura. Cada hoja indica qué email sale y cuándo. No desarrolles sub-secuencias completas dentro del árbol: si una rama merece su propia campaña, dilo en una línea y sigue. ### Reglas de secuencias: 1. **Tiempos de espera mínimos**: - Entre emails del mismo flujo: mínimo 24h - Re-envío por no apertura: 48h - Secuencia de re-engagement: 7 días entre intentos 2. **Máximo de emails por flujo**: - Secuencia de venta: máximo 5 emails - Post-compra/onboarding: máximo 4 emails - Re-engagement: máximo 3 intentos antes de limpiar 3. **Exit conditions** (cuándo sacar a alguien del flujo): - Convirtió → sale del flujo de venta - Se dio de baja → sale de TODO - Respondió el email → alerta al equipo para atención manual 4. **Prioridad de flujos**: - Si un contacto está en 2 flujos simultáneos, el de mayor prioridad gana - Prioridad: Transaccional > Post-compra > Venta > Nurture > Re-engagement 5. **Contenido de cada email del flujo**: - Definir: objetivo, subject line, resumen del body, CTA - NO escribir el copy completo (eso lo hace el Copywriter si se necesita) ### Paso 3 — Guardar output Guardar en `output/sequences/flow.md`, con la plantilla de abajo y nada más. ## Formato del output — úsalo tal cual ```markdown # Flujo post-campaña Cuelga del email 1. Los emails 2 y 3 reutilizan la misma lógica. ## Diagrama [Árbol ASCII, 3 niveles máximo] ## Emails del flujo | # | Trigger | Espera | Subject | Objetivo | |---|---------|--------|---------|----------| | 1.1 | Abrió + no clickeó | D+2 | ... | Nurture | | 1.2 | No abrió | D+2 | ... | Re-send | ## Condiciones de salida - [Cuándo sale alguien del flujo] ``` --- ## Tu documento de oficio Lee `docs/entregabilidad.md` antes de proponer tiempos o frecuencias. Es tu especialidad puesta por escrito: reglas concretas que no caben en este prompt y que no tienen por qué pagar los demás agentes. Es lo mismo que un *skill*: contexto especializado que carga solo quien lo necesita.
analyst.md — El revisor ciego. No es del equipo: audita al final y por separado. ↓
--- name: analyst description: Revisor ciego. Audita SOLO el artefacto final que le pases, sin el brief ni el proceso. Invocalo al final y por separado, nunca como un paso mas del equipo: un auditor que vio como se hizo no es un auditor. tools: Read, Write, Grep model: sonnet color: orange permissionMode: acceptEdits background: false --- ## Rol Eres el **revisor ciego**. Te pasan un artefacto terminado y decides si sale o no sale. No viste cómo se hizo, y así tiene que ser. ## Techo de tamaño — no negociable **400 palabras.** Un veredicto, los desvíos del brief y los tres problemas que de verdad importan. Quien te lee necesita decidir en un minuto si publica. **No inventes métricas.** Nada de proyectar open rates o conversiones: no tienes datos de esta lista, y un número inventado con tabla alrededor parece un dato. Juzga lo que puedes juzgar — el texto, los subjects, los CTAs, el HTML y la coherencia con el brief. ## Instrucciones ### Paso 1 — Leer lo que te pasaron Los emails (`output/emails/*.md`), su HTML (`output/templates/*.html`) y `brief.md`. Si el orquestador te pasó algo más, ignóralo: solo juzgas el resultado, no el proceso. ### Paso 2 — Auditar **A. Contra el brief.** ¿Responde al tema y al objetivo? ¿Respeta las restricciones? ¿Es el número de emails que pedían? Marca `[FUERA DE BRIEF]` cada desvío, **citando literal** la frase que se sale. **B. Los tres problemas más graves.** Solo tres, ordenados. Cada uno con severidad (**Crítico** / **Advertencia**), dónde está, y cómo se arregla en una línea. Qué mirar: subjects de más de 50 caracteres, CTAs ambiguos, emails sin P.D., HTML sin unsubscribe, muros de texto, personalización rota. **C. El veredicto.** `PUBLICABLE` o `NO PUBLICABLE`, en esa palabra exacta. Si es lo segundo, di qué hay que corregir para que pase. ### Paso 3 — Guardar `output/reports/analysis.md` ## Formato del output — úsalo tal cual ```markdown # Auditoría — [nombre de la campaña] **VEREDICTO: [PUBLICABLE | NO PUBLICABLE]** [Dos frases: por qué.] ## Desvíos del brief - `[FUERA DE BRIEF]` "[cita literal]" — [qué restricción incumple] - (o «ninguno») ## Problemas | # | Severidad | Dónde | Problema | Arreglo | |---|-----------|-------|----------|---------| | 1 | Crítico | email-2.md | ... | ... | ``` --- ## Contrato de salida — no negociable Tu turno **no termina** hasta que hayas usado la herramienta `Write` para crear `output/reports/analysis.md` con el informe completo. Responder con el análisis en el chat **no cuenta como entregarlo**. Si el fichero no existe, tu trabajo no existe: nadie puede auditarlo después, y el orquestador solo recibe tu resumen, no tu razonamiento. Antes de cerrar, comprueba que el fichero está escrito. Si no lo está, escríbelo ahora.
La description es lo único que lee el jefe
Cada subagente arranca sin contexto heredado. Por eso las description dicen cuándo usarlos y qué debe existir antes: son lo único que lee el orquestador para decidir a quién delega. Una description vaga produce un jefe que delega mal.
04 · La corrida
Lanza el squad y no le des el orden.
El prompt del orquestador
Es el que lanzar-squad.sh ya carga por ti. Fíjate en lo que no dice:
Lee brief.md. Eres el orquestador de este squad: decide tú a qué especialistas llamas, en qué orden y si necesitas que alguno repita su trabajo. Tienes cuatro: strategist, copywriter, email-designer y sequence-architect. No hagas tú el trabajo de ninguno aunque sepas hacerlo. Y como arrancan sin contexto, incluye en cada encargo todo lo que necesiten. Esto es una campaña de tres emails, no un proyecto de consultoría: cada agente tiene un techo de palabras y esperas que lo respete. Cuando el plan esté listo, el copywriter y el sequence-architect pueden trabajar a la vez: el segundo solo necesita el plan. Cuando el equipo termine, invoca al analyst por separado y pásale ÚNICAMENTE el email final y su HTML. No le cuentes el brief, ni a quién llamaste, ni qué salió mal por el camino. Si su veredicto es PUBLICABLE, sube las campañas con ./scripts/subir-a-brevo.sh y dime los IDs que devuelve.
No dice el orden. Eso es exactamente lo que separa un supervisor de una línea de montaje.
Cómo saber si de verdad está delegando
En el transcript debe aparecer una fila por subagente, con su nombre y su color. Si no las ves, Claude está haciendo el trabajo él mismo y el ejercicio no está demostrando nada.
05 · En directo
El monitor: la colmena en vivo.
Página local que muestra los cinco subagentes encendiéndose mientras trabajan. Pensada para proyectar: tipografía grande y cero jerga en pantalla.
| Qué muestra | Por agente |
|---|---|
| Estado | en espera · trabajando (borde azul, punto latiendo) · terminado |
| Modelo | opus o sonnet, leído del frontmatter |
| Acción actual | el fichero que está leyendo o escribiendo en este segundo |
| Cronómetro | el tiempo de ese agente, no el total |
| Lo que devuelve | el resumen que entrega al orquestador al terminar |
El dato más interesante de la pantalla
Ese último: el orquestador no ve el trabajo de sus agentes, solo ese resumen. Verlo en directo explica de golpe por qué el aislamiento de contexto cambia el resultado.
Qué deberías ver, y cuándo
0:30
strategist encendido. El jefe ya leyó el brief y delegó.
2:00
Plan listo → copywriter y sequence-architect encienden a la vez. Dos tarjetas azules simultáneas: eso es el paralelismo.
3:30
email-designer maquetando. Es el que más output produce.
5:00
Entra el analyst, solo y al final. Dura unos 40 segundos.
5:30
Veredicto y fin. Una corrida completa ronda los 5-6 minutos.
Arráncalo antes de lanzar el squad
Los hooks solo capturan lo que pasa mientras están activos. Si abres el monitor a mitad, los agentes que ya trabajaron aparecen «en espera» con 0 acciones y parece que no hicieron nada.
Cómo funciona por dentro
Claude Code ─hooks─→ .claude/hooks/registrar.sh ─→ .monitor/eventos.jsonl
│
monitor/servidor.py ←──tail┘
│ SSE
monitor/index.html
El registrador es shell puro y hace exit 0 siempre: un hook de Stop que devuelva un código distinto de cero puede bloquear la corrida. El servidor solo usa la librería estándar y escucha únicamente en 127.0.0.1: nada sale ni entra de la máquina.
06 · Los artefactos
Revisa lo que dejó.
Cinco carpetas, cinco autores
output/strategy/plan.md ← el strategist output/emails/*.md ← el copywriter output/templates/*.html ← el email-designer output/sequences/flow.md ← el sequence-architect output/reports/analysis.md ← el analyst
Abre el informe del analyst y busca VEREDICTO:. Y abre un .html en el navegador: se ve tal cual llegará al correo.
Que existan los ficheros es parte del ejercicio
Un agente que solo responde en el chat no deja nada que auditar después. Por eso sus prompts dicen «archivos, no chat».
07 · La salida
Sube la campaña a Brevo.
Primero la clave, después un solo comando
La clave va en .env.local, en la carpeta del proyecto:
BREVO_API_KEY=xkeysib-...
Después, sin argumentos:
./scripts/subir-a-brevo.sh
Saca la clave del .env.local, y el remitente y el ID de lista del brief.md que escribió el formulario. Verás una línea por email:
OK — Campaign ID: 12 (draft)
Compruébalo en app.brevo.com/campaign/list. No le des a enviar.
El auditor va antes que el push, y no al revés
El email-designer maqueta y para: no sube nada. El push lo lanza el orquestador después del veredicto. Si subiera el diseñador, el revisor ciego llegaría tarde: las campañas ya estarían creadas.
08 · La parte que más enseña
Rómpelo a propósito.
Cuando te funcione, rómpelo. Aprenderás más de estos cinco experimentos que de la corrida buena.
1 · Quítale el techo de palabras al estratega
Borra de su ficha la línea que dice que el plan cabe en 500 palabras. En una prueba real, ese mismo agente sin techo produjo un plan de 4.845 palabras y 34 secciones para tres emails, y tardó 6 minutos y medio en escribirlo. Una sección entera —deliverability, SPF/DKIM, benchmarks de industria— no la leía ningún otro agente. Se generaba para nadie.
2 · Quítale el contrato de salida al analyst
Borra el párrafo que le obliga a escribir el fichero. Volverá a auditar en el chat y a no dejar analysis.md. Cuando el orquestador solo recibe un resumen, el trabajo que no queda en un fichero no existe.
3 · Cámbiale el marcador al copywriter
El script extrae el asunto buscando la línea **Principal**: en el markdown. Cámbiala por otra cosa. Las campañas llegan a Brevo sin asunto — y nadie da un error por el camino. Los squads se rompen por los contratos entre agentes, no por los prompts.
4 · Deja que el diseñador suba a Brevo
Devuélvele la herramienta Bash y dile que suba las campañas él. Funciona. Y el auditor opinará sobre unas campañas que ya están creadas: su veredicto deja de servir para algo.
5 · Sácalos de .claude/agents/
Mueve los cinco ficheros a una carpeta cualquiera. Claude los leerá como texto plano y hará los cinco papeles seguidos en la misma ventana de contexto. Parece que funciona: salen los mismos ficheros. Pero el analyst estará auditando un texto que él mismo escribió veinte mil tokens antes, y eso no es una auditoría. Es la diferencia entre un squad y un agente disfrazado de cinco.
09 · Diagnóstico
Si algo no va.
| Síntoma | Causa | Arreglo |
|---|---|---|
| Ve pocos subagentes o ninguno | Arrancaste desde otra carpeta | ls .claude/agents/ — deben ser cinco |
| Agentes «en espera» aunque trabajaron | Abriste el monitor a mitad | Reinicia el monitor y vuelve a lanzar |
Address already in use | El puerto está ocupado | ./ver-squad.sh 9000 |
Falta BREVO_API_KEY | No está en .env.local | Revisa el fichero en la carpeta del proyecto |
jq es requerido | Falta la dependencia | brew install jq |
404 List ID does not exist | El ID de lista no es de tu cuenta | Míralo en la URL de la lista en Brevo |
400 con sender | Remitente sin verificar | Settings → Senders, pulsa el enlace del correo |
| Campañas sin asunto | Falta la línea **Principal**: | El script extrae el asunto de ahí |
| La corrida tarda 20 minutos | Agentes sin techo de palabras | Mira el experimento 1 de la sección anterior |
Lo que este squad no hace
No envía correos. No mide resultados reales — el analyst audita coherencia con el brief, no rendimiento de campaña. Y no sustituye la aprobación humana: los borradores existen precisamente para que alguien los revise antes de programarlos.