DEV Community

jesus manrique
jesus manrique

Posted on • Originally published at guayoyo.tech

Tú Apruebas, la IA Publica: Circuito de Aprobación Humana vía WhatsApp — Parte 4 de 5

Tu pipeline ya genera copy y genera imágenes. El siguiente paso es la decisión más importante: ¿publicas o no?

El patrón "human-in-the-loop" es lo que separa un juguete de IA de una herramienta de producción real. El humano decide. La IA ejecuta. Y el canal más inmediato para esa decisión: WhatsApp.

La Arquitectura de Aprobación

IA genera copy + imagen → WhatsApp Preview (texto + imagen)
                              ↓
                         Tú respondes:
                    ┌──────┴──────┐
                   OK             NO (+ feedback)
                    ↓              ↓
              Publica en      Regenera con
              IG/TikTok       las correcciones
                    ↓              ↓
         WhatsApp: "✅       Vuelve a enviar
         Publicado"           preview
Enter fullscreen mode Exit fullscreen mode

Tiempo total de revisión: 30 segundos. Abres WhatsApp, ves la imagen, lees el copy. Si te gusta, "OK". Si no, "NO, cambia el tono a más técnico". La IA entiende el feedback en lenguaje natural.

Opciones de Integración WhatsApp

Opción A: Evolution API (recomendada para self-hosted)

Evolution API es un gateway WhatsApp open-source que expone una API REST limpia:

# Docker
docker run -d -p 8080:8080 atendai/evolution-api

# Enviar mensaje de texto
POST http://localhost:8080/message/sendText/evolution
Headers: apikey: YOUR_API_KEY
Body: {
  "number": "584140108660",
  "text": "📱 *Nuevo post listo para revisión:*\n\n{ copy }\n\n¿OK o NO?"
}

# Enviar imagen
POST http://localhost:8080/message/sendMedia/evolution
Headers: apikey: YOUR_API_KEY
Body: {
  "number": "584140108660",
  "mediatype": "image",
  "caption": "Preview del post",
  "media": "https://tu-servidor/images/preview.png"
}
Enter fullscreen mode Exit fullscreen mode

Opción B: Meta WhatsApp Cloud API (oficial)

Requiere un Meta Business Account verificado. Más burocrático pero más estable:

POST https://graph.facebook.com/v21.0/{phone_number_id}/messages
Headers: Authorization: Bearer {meta_token}
Body: {
  "messaging_product": "whatsapp",
  "to": "584140108660",
  "type": "image",
  "image": { "link": "https://tu-servidor/images/preview.png", "caption": "¿OK o NO?" }
}
Enter fullscreen mode Exit fullscreen mode

Opción C: Webhook directo a OpenClaw (la que usamos en esta serie)

Si tu asistente de IA ya está conectado a WhatsApp vía OpenClaw, el webhook n8n envía el preview y OpenClaw escucha tu respuesta:

// n8n → OpenClaw webhook
POST https://ai.guayoyo.tech/plugins/webhooks/approval
Body: {
  "action": "send_preview",
  "recipient": "+584140108660",
  "copy": "texto del post...",
  "image_url": "https://...",
  "brief_id": "post-2026-05-14-001"
}
Enter fullscreen mode Exit fullscreen mode

El Circuito en n8n

Nodo 1: Enviar Preview por WhatsApp

// HTTP Request → Evolution API
const preview = {
  number: "584140108660",
  text: `📱 *Nuevo post para revisar*\n\n${$json.hook}\n\n${$json.body}\n\n${$json.hashtags}\n\n${$json.cta}\n\n---\nResponde *OK* para publicar o *NO* + feedback`,
  delay: 500
};
// Si hay imagen, enviar primero la imagen y luego el texto
Enter fullscreen mode Exit fullscreen mode

Nodo 2: Esperar Respuesta (Webhook)

n8n expone un Webhook node que espera la respuesta:

Webhook Node (POST /approval-response)
  ↓
IF node: ¿El texto contiene "OK"?
  ├─ Sí → Continuar a publicación
  └─ No → Extraer feedback → Regenerar
Enter fullscreen mode Exit fullscreen mode

Configuración del Webhook en n8n:

  • Método: POST
  • Path: /approval-response
  • Response: { "status": "received" }

OpenClaw escucha tu WhatsApp y cuando respondes "OK" o "NO...", reenvía al webhook de n8n.

Nodo 3: Switch — OK o NO

const response = $input.first().json.body.toLowerCase();

if (response.includes("ok") && !response.includes("no ok")) {
  return [{ action: "publish", data: $input.first().json }];
} else {
  // Extraer feedback después de "NO"
  const feedback = response.replace(/^no[,\s]*/i, "").trim();
  return [{ action: "regenerate", feedback: feedback, data: $input.first().json }];
}
Enter fullscreen mode Exit fullscreen mode

Nodo 4: Timeout — 30 Minutos

Si no respondes en 30 minutos, el flujo guarda un borrador y te avisa:

// n8n Wait node configurado a 30 minutos
// Si expira sin respuesta:
const draft = {
  copy: $json.copy,
  image_url: $json.image_url,
  status: "draft_timeout",
  timestamp: new Date().toISOString()
};
// Guardar en base de datos o Google Sheet
// Enviar WhatsApp: "⏰ El post de las 10am quedó en borrador. Revísalo cuando puedas."
Enter fullscreen mode Exit fullscreen mode

Flujo Completo del Circuito

1. Agente genera copy + SD genera imagen
         ↓
2. WhatsApp Preview: "📱 Nuevo post para revisar"
         ↓
3. Webhook espera tu respuesta (timeout 30 min)
         ↓
    ┌────┴────┐
   OK         NO + feedback
    ↓          ↓
4a. Publicar   4b. Regenerar
    IG/TikTok    (volver al agente
    ↓            con el feedback)
5. WhatsApp:     ↓
   "✅ Listo"  Nuevo preview
Enter fullscreen mode Exit fullscreen mode

Por Qué WhatsApp y No un Dashboard

Dashboard Web WhatsApp
Requiere abrir navegador + login Ya lo tienes abierto
Tienes que ir a buscarlo Te llega solo
~2-3 minutos por revisión ~30 segundos por revisión
Solo en desktop En cualquier lado

La fricción mata la consistencia. Si publicar requiere 3 pasos extra, al tercer día dejas de hacerlo. Con WhatsApp, es un reflejo: ves, respondes, listo.

Seguridad: Solo Tú Apruebas

El webhook de aprobación solo acepta respuestas de tu número:

// En el webhook de OpenClaw
if (incoming.from !== "+584140108660") {
  return { status: "ignored", reason: "not_authorized" };
}
Enter fullscreen mode Exit fullscreen mode

Nadie más puede aprobar publicaciones. El circuito es humano, pero la seguridad es programática.


¿Listo para un pipeline de contenido donde tú decides y la IA ejecuta? En Guayoyo Tech construimos el circuito completo — desde la generación hasta la publicación, con tu aprobación en cada paso.

Top comments (0)