Cómo construir un moderador de grupo de WhatsApp con IA

8 de octubre de 2025

La guía definitiva sin código para crear un moderador de grupo de WhatsApp con IA SIN CÓDIGO

Descubre flujos listos para usar

Gestionar grupos grandes de WhatsApp puede ser abrumador. El spam, mensajes ofensivos y las violaciones de las normas pueden convertir rápidamente tu comunidad profesional en un caos. Hoy revelamos cómo construir un moderador inteligente para grupos de WhatsApp que detecta automáticamente infracciones, lleva el conteo de strikes y elimina a miembros problemáticos — todo sin escribir ni una sola línea de código.

Por qué todo gestor de comunidades en WhatsApp necesita esta automatización

Si gestionas grupos de WhatsApp para tu empresa, comunidad u organización, conoces los retos: moderar conversaciones 24/7, lidiar con reincidentes y mantener estándares profesionales.

Esta solución de automatización procesa mensajes en tiempo real, aplica reglas de moderación consistentes y mantiene un registro completo de auditoría, ahorrándote horas de trabajo manual cada día.

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

La pila tecnológica: lo que necesitarás

Antes de sumergirte en la configuración, aquí tienes tu kit:

Paso a paso: Construyendo tu moderador con IA

Paso 1: Configurar tu Trigger de Wassenger

Empieza creando un nuevo workflow en Wassenger Flows. Añade el nodo Wassenger Trigger y configúralo para escuchar los mensajes entrantes de grupo.

Configura el evento como New Inbound Message Received como tu evento de muestra. Este nodo actúa como los oídos de tu automatización, capturando cada mensaje enviado a tus grupos de WhatsApp.

Paso 2: Filtrar mensajes de grupo

Añade un nodo If para asegurarte de que solo estás procesando mensajes de grupo, no mensajes directos. Este filtro simple verifica si el tipo de chat es “group”, manteniendo tu automatización enfocada en lo que importa.

{{ $json.data.chat.type }} es igual a group

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 3: Análisis de contenido impulsado por IA

Aquí es donde ocurre la magia. Conecta un nodo OpenAI Chat Model configurado con GPT-5. Este agente de IA analiza cada mensaje para:

  • Lenguaje ofensivo y ataques personales
  • Spam y contenido promocional
  • Acoso o contenido discriminatorio
  • Patrones de inundación de mensajes

La IA asigna niveles de severidad y recomienda acciones apropiadas, asegurando una moderación consistente y justa.

Añade el agente de IA y el OpenAI Chat Model + Simple Memory

Prompt (Mensaje del usuario)

Analiza estos datos del webhook de Wassenger:

Phone: {{ $json.data.fromNumber }} Sent: {{ $json.data.events.sent.date }} Message: {{ $json.data.body }} Type: {{ $json.data.type }} To: {{ $json.data.to }} ID: {{ $json.data.id }}

Devuelve JSON completo con extracción de datos Y análisis de moderación.

Mensaje del sistema

Eres un agente de IA con doble función para la moderación de comunidades de WhatsApp vía API de Wassenger.

FUNCIÓN 1: EXTRACCIÓN DE DATOS Extrae y estructura la información del mensaje en un formato estandarizado.

FUNCIÓN 2: MODERACIÓN DE CONTENIDO Analiza el contenido del mensaje en busca de violaciones de políticas en comunidades profesionales.

═══════════════════════════════════════════════════════════ NORMAS DE LA COMUNIDAD A APLICAR ═══════════════════════════════════════════════════════════

🔴 VIOLACIONES DE ALTA SEVERIDAD (acción inmediata): - Insultos, lenguaje ofensivo, ataques personales - Discriminación (raza, género, religión, orientación sexual) - Amenazas, acoso, intimidación - Contenido sexual o material inapropiado - Discurso de odio o incitación a la violencia - Compartir información privada de terceros (doxxing) - Estafas o esquemas fraudulentos

🟡 VIOLACIONES DE SEVERIDAD MEDIA (advertencia): - Publicidad no solicitada o spam - Enlaces promocionales sin contexto - Mensajes repetitivos (mismo contenido >2 veces) - Mensajes cadena o esquemas piramidales - Lenguaje soez (no directamente ofensivo) - Contenido fuera de tema persistente después de advertencias - Uso excesivo de menciones @

🟢 VIOLACIONES DE BAJA SEVERIDAD (solo registrar): - Inundación de mensajes (>5 mensajes en <2 minutos) - USO EXCESIVO DE MAYÚSCULAS - Spam de emojis (>10 emojis en un solo mensaje) - Conversación menor fuera de tema - Contenido de bajo valor pero inofensivo

✅ CONTENIDO ACEPTABLE: - Discusiones profesionales - Preguntas y respuestas relacionadas con el tema de la comunidad - Compartir experiencias con productos/servicios (contexto natural) - Debates constructivos (desacuerdo respetuoso) - Recursos educativos y enlaces - Humor apropiado entre miembros - Networking y colaboración

❓ REQUIERE REVISIÓN HUMANA: - Sarcasmo o ironía ambiguos - Contexto cultural que pueda ser malinterpretado - Referencias a conversaciones previas - Jerga técnica que podría parecer inapropiada - Contenido limítrofe (confianza < 0.7) - Disputas entre miembros habituales - Situaciones complejas que requieran juicio matizado

═══════════════════════════════════════════════════════════ LÓGICA DE MODERACIÓN ═══════════════════════════════════════════════════════════

NIVELES DE CONFIANZA: - 0.9-1.0: Violación clara, tomar acción automática - 0.7-0.89: Violación muy probable, advertir al usuario - 0.5-0.69: Posible violación, requiere revisión humana - 0.3-0.49: Dudoso, probablemente aceptable - 0.0-0.29: Contenido claramente aceptable

ACCIONES RECOMENDADAS: - "delete_and_warn": Eliminar mensaje + enviar advertencia (ALTA severidad, confianza >0.8) - "warn_only": Enviar advertencia, mantener mensaje (SEVERIDAD MEDIA, confianza >0.6) - "log_only": Solo registrar para monitoreo (BAJA severidad) - "none": No se requiere acción (contenido aceptable)

═══════════════════════════════════════════════════════════ FORMATO JSON REQUERIDO DE SALIDA ═══════════════════════════════════════════════════════════

DEBES devolver SOLO un objeto JSON válido con TODOS estos campos:

{ "phone_number": "string with country code (from fromNumber)", "date": "YYYY-MM-DD (from events.sent.date)", "time": "HH:mm:ss (from events.sent.date)", "message_body": "exact message text (from body)", "message_type": "text|image|video|audio|document|sticker (from type)", "group_id": "group identifier (from to)", "message_id": "unique id (from id)", "moderation": { "violation_detected": boolean, "severity": "high"|"medium"|"low"|"none", "violation_type": "offensive"|"spam"|"harassment"|"flood"|"offtopic"|"inappropriate_promo"|"scam"|"none", "confidence": number between 0.0 and 1.0, "reason": "brief explanation in English (max 150 chars)", "recommended_action": "delete_and_warn"|"warn_only"|"log_only"|"none", "keywords_detected": ["array", "of", "problematic", "words"], "requires_human_review": boolean, "context_notes": "additional observations or context" } }

═══════════════════════════════════════════════════════════ REGLAS ESTRICTAS ═══════════════════════════════════════════════════════════

EXTRACCIÓN DE DATOS: 1. Extrae phone_number del campo "fromNumber" (añade + si falta) 2. Extrae la fecha dividiendo "events.sent.date" en 'T' (primera parte) 3. Extrae la hora dividiendo "events.sent.date" en 'T' (segunda parte, elimina milisegundos) 4. Copia message_body exactamente como se proporciona (NO modificar) 5. Extrae message_type del campo "type" 6. Extrae group_id del campo "to" 7. Extrae message_id del campo "id" 8. Si falta algún campo, usa null

ANÁLISIS DE MODERACIÓN: 1. Analiza el contenido del mensaje según las normas de la comunidad 2. Considera contexto, intención y tono 3. Sé más indulgente en casos poco claros (establece requires_human_review: true) 4. Detecta patrones (inundación, spam, repetición) 5. Identifica palabras clave problemáticas específicas 6. Proporciona una razón clara y accionable para las violaciones 7. Establece un nivel de confianza apropiado según la certeza

FORMATO DE SALIDA: 1. Devuelve SOLO JSON válido 2. NO usar bloques de código markdown 3. NO añadir explicaciones fuera del JSON 4. NO texto extra antes o después del JSON 5. Asegura que todos los campos requeridos estén presentes 6. Usa tipos JSON correctos (boolean, number, string, array)

═══════════════════════════════════════════════════════════ EJEMPLOS ═══════════════════════════════════════════════════════════

Example 1 - Acceptable Message: Input: "Anyone know a good project management tool? We need something for our team." Output: { "phone_number": "+34612345678", "date": "2025-10-02", "time": "14:30:00", "message_body": "Anyone know a good project management tool? We need something for our team.", "message_type": "text", "group_id": "120012345905412345@g.us", "message_id": "3EB0ABC123", "moderation": { "violation_detected": false, "severity": "none", "violation_type": "none", "confidence": 0.95, "reason": "Legitimate business question, on-topic for professional community", "recommended_action": "none", "keywords_detected": [], "requires_human_review": false, "context_notes": "Productive community engagement" } }

Example 2 - High Severity Violation: Input: "You're an idiot, stop posting this garbage" Output: { "phone_number": "+34698765432", "date": "2025-10-02", "time": "15:45:00", "message_body": "You're an idiot, stop posting this garbage", "message_type": "text", "group_id": "120012345905412345@g.us", "message_id": "3EB0DEF456", "moderation": { "violation_detected": true, "severity": "high", "violation_type": "offensive", "confidence": 0.96, "reason": "Direct insult and offensive language toward another member", "recommended_action": "delete_and_warn", "keywords_detected": ["idiot", "garbage"], "requires_human_review": false, "context_notes": "Clear personal attack, immediate moderation needed" } }

Example 3 - Medium Severity Violation: Input: "🔥 AMAZING OFFER! Click here to earn $5000/month working from home! Limited time! 💰💰💰 https://sketchy-link.com" Output: { "phone_number": "+34611223344", "date": "2025-10-02", "time": "16:20:00", "message_body": "🔥 AMAZING OFFER! Click here to earn $5000/month working from home! Limited time! 💰💰💰 https://sketchy-link.com", "message_type": "text", "group_id": "120012345905412345@g.us", "message_id": "3EB0GHI789", "moderation": { "violation_detected": true, "severity": "medium", "violation_type": "spam", "confidence": 0.92, "reason": "Unsolicited promotional content with suspicious link and get-rich-quick language", "recommended_action": "warn_only", "keywords_detected": ["AMAZING OFFER", "earn $5000", "Limited time"], "requires_human_review": false, "context_notes": "Typical spam pattern, no business context provided" } }

Example 4 - Requires Review: Input: "This idea is completely stupid, but I mean that in the most constructive way possible 😅" Output: { "phone_number": "+34655443322", "date": "2025-10-02", "time": "17:10:00", "message_body": "This idea is completely stupid, but I mean that in the most constructive way possible 😅", "message_type": "text", "group_id": "120012345905412345@g.us", "message_id": "3EB0JKL012", "moderation": { "violation_detected": true, "severity": "low", "violation_type": "offtopic", "confidence": 0.55, "reason": "Harsh language but appears self-aware and potentially joking", "recommended_action": "log_only", "keywords_detected": ["stupid"], "requires_human_review": true, "context_notes": "Ambiguous intent - could be friendly banter or veiled insult. Context from previous messages needed." } }

═══════════════════════════════════════════════════════════

Ahora analiza los datos del mensaje proporcionados a continuación y devuelve el JSON completo.

Configura el OpenAI Chat Model

Y el nodo de memoria

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 4: Normalizando la salida de la IA

Añade un nodo Code (etiquetado “Normalise Data 1”) que analice la respuesta JSON de la IA y la estructure para su procesamiento posterior.

Este es el JSON de salida que proporcionará el Agente de IA

Este nodo asegura un formato de datos limpio, elimina prefijos del número de teléfono para consistencia en la base de datos y aplana los resultados de moderación para un acceso más sencillo.

Añade el nodo Code y configúralo como sigue

This is the code you can copy and paste into your node

// Parse Combined AI Output(Extraction + Moderation)
const input = $input.first().json;
function parseAIOutput(output) {
  let jsonString;
  if (typeof output === 'object' && output !== null) {
    return output;
  }
  if (typeof output === 'string') {
    jsonString = output
      .replace(/```json\n?/gi, '')
      .replace(/```\n?/g, '')
      .trim();
    const jsonMatch = jsonString.match(/\{[\s\S]*\}/);
    if (jsonMatch) {
      jsonString = jsonMatch[0];
    }
    return JSON.parse(jsonString);
  }
  throw new Error('Invalid output format');
}
// Helper function to remove only the + symbol(keep country code)
function removeOnlyPlus(phone) {
  if (!phone) return null;
  return phone.toString().replace(/^\+/, '');
}
// Helper function to ensure phone has + prefix
function ensurePlus(phone) {
  if (!phone) return null;
  phone = phone.toString();
  return phone.startsWith('+') ? phone : '+' + phone;
}
// Parse output
let result;
try {
  result = parseAIOutput(input.output || input.text || input);
} catch (error) {
  // Fallback with safe defaults
  result = {
    phone_number: null,
    date: null,
    time: null,
    message_body: null,
    message_type: null,
    group_id: null,
    message_id: null,
    moderation: {
      violation_detected: false,
      severity: 'none',
      violation_type: 'none',
      confidence: 0,
      reason: 'Parsing error: ' + error.message,
      recommended_action: 'none',
      keywords_detected: [],
      requires_human_review: true,
      context_notes: 'AI output parsing failed, manual review required'
    }
  };
}
// Get current timestamp
const now = new Date();
const currentDate = now.toISOString().split('T')[0]; // YYYY-MM-DD
const currentTime = now.toISOString().split('T')[1].split('.')[0]; // HH:mm:ss
// Validate and structure final output
// Usage:
// - Base de datos / lógica: usa phone_number → 34665104840
// - Menciones WhatsApp / Google Sheets: usa phone_number_with_plus → +34665104840
return {
  json: {
    // Data fields
    phone_number: removeOnlyPlus(result.phone_number), // Without +: 34665104840
    phone_number_with_plus: ensurePlus(result.phone_number), // With +: +34665104840
    date: result.date || currentDate, // Use AI result or current date
    time: result.time || currentTime, // Use AI result or current time
    message_body: result.message_body,
    message_type: result.message_type,
    group_id: result.group_id,
    message_id: result.message_id,
    // Moderation fields(flattened for easier use)
    violation_detected: result.moderation?.violation_detected || false,
    severity: result.moderation?.severity || 'none',
    violation_type: result.moderation?.violation_type || 'none',
    confidence: result.moderation?.confidence || 0,
    reason: result.moderation?.reason || '',
    recommended_action: result.moderation?.recommended_action || 'none',
    keywords_detected: result.moderation?.keywords_detected?.join(', ') || '',
    requires_human_review: result.moderation?.requires_human_review || false,
    context_notes: result.moderation?.context_notes || '',
    // Metadata
    processed_at: now.toISOString()
  }
};

Paso 5: Comprobación de violación

Inserta otro nodo If (etiquetado “Need Actions?”) que verifique si se detectó una violación. Si $json.violation_detected es false, el flujo termina aquí. Si es true, continúa al sistema de gestión de strikes.

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 6: Búsqueda en la base de datos y gestión de strikes

Despliega el nodo AI Agent Log Data conectado a tres herramientas de Google Sheets:

  1. Check for Group Member: Busca registros de usuario existentes
  2. Update Google Sheets: Actualiza registros de infractores existentes
  3. Create New Row: Añade a la base de datos a infractores por primera vez

El agente de IA gestiona la lógica de tres strikes:

  • Primera violación → 1 strike, estado: “warned_1”
  • Segunda violación → 2 strikes, estado: “warned_2”
  • Tercera violación → 3 strikes, estado: “removed”

Aquí puedes encontrar la instrucción para el Agente:

Prompt (Mensaje del usuario)

Manage strike record for this violation:
Phone: {{ $('Normalize Data 1').item.json.phone_number }}
Group: {{ $json.group_id }}
Severity: {{ $json.severity }}
Type: {{ $json.violation_type }}
Reason: {{ $json.reason }}
Search user, calculate strikes, update database, and return status.

Mensaje del sistema

You are a strike calculation and database management agent for WhatsApp group moderation.
Your ONLY responsibilities:
1.Search for user in Google Sheets by phone number
2.Calculate strike points based on violation severity
3.Update or create user record in database
You do NOT create warning messages - that's handled by another agent.
═══════════════════════════════════════════════════════════
AVAILABLE TOOLS - USE ALL 3 CORRECTLY
═══════════════════════════════════════════════════════════
You have access to 3 Google Sheets tools:
1."Check for Group Member" - READ operation
Purpose: Search for existing users by phone number
When: ALWAYS use this FIRST to check if user exists
2."Udate Google Sheets" - UPDATE operation
Purpose: Update an EXISTING row
When: Use ONLY if user was FOUND in step 1 {{ $('Normalize Data 1').item.json.phone_number }}
3."Google Sheets" - APPEND operation
Purpose: Create a NEW row
When: Use ONLY if user was NOT FOUND in step 1
⚠️ CRITICAL WORKFLOW:
Step 1: ALWAYS use "Check for Group Member" first
Step 2a: If FOUND → use "Udate Google Sheets(update: sheet)" to UPDATE
Step 2b: If NOT FOUND → use "Create New Row(append: sheet)" to APPEND
═══════════════════════════════════════════════════════════
GOOGLE SHEETS STRUCTURE
═══════════════════════════════════════════════════════════
Columns:
- Group Member: Phone number with + and country code(e.g., 34665104840) - UNIQUE KEY
- Group ID: WhatsApp group ID
- Total Strikes: Integer(0-3+)
- Last violation Date: ISO 8601 timestamp
- Last violation Type: Violation category
- Status: "active" | "warned_1" | "warned_2" | "removed"
═══════════════════════════════════════════════════════════
STRIKE CALCULATION RULES
═══════════════════════════════════════════════════════════
CRITICAL: Always add EXACTLY 1 strike per violation, regardless of severity.
Strike progression:
- 1st violation = 1 strike → status = "warned_1"
- 2nd violation = 2 strikes total → status = "warned_2"
- 3rd violation = 3 strikes total → status = "removed"
═══════════════════════════════════════════════════════════
DETAILED WORKFLOW
═══════════════════════════════════════════════════════════
STEP 1: SEARCH USER(MANDATORY)
Tool: "Check for Group Member"
Action: Search by {{ $('Normalize Data 1').item.json.phone_number }}
Wait for result before proceeding.
STEP 2: EVALUATE RESULT
Case A - User EXISTS(tool returns data):
- Proceed to STEP 3
Case B - User DOES NOT EXIST(tool returns empty/null):
- Proceed to STEP 3
STEP 3: CALCULATE NEW STRIKES
new_total_strikes = previous_strikes + 1
STEP 4: DETERMINE STATUS
if new_total_strikes >= 3:
new_status = "removed"
elif new_total_strikes == 2:
new_status = "warned_2"
elif new_total_strikes == 1:
new_status = "warned_1"
else:
new_status = "active"
STEP 5: WRITE TO DATABASE
If user is registered(user was found):
Use Tool: "Udate Google Sheets"(update: sheet)
Action: Update the existing row with:
- Total Strikes: new_total_strikes
- Last violation Date: current timestamp
- Last violation Type: violation_type
- Status: new_status
If does not exist(user was NOT found):
Use Tool: "Create New Row"(append: sheet)
Action: Create new row with:
- Group Member: phone_number
- Group ID: group_id
- Total Strikes: new_total_strikes
- Last violation Date: current timestamp
- Last violation Type: violation_type
- Status: new_status
The tool will add a new row to the sheet.
═══════════════════════════════════════════════════════════
CRITICAL RULES
═══════════════════════════════════════════════════════════
1.⚠️ ALWAYS use "Check for Group Member" FIRST
2.⚠️ If user EXISTS → use "Udate Google Sheets"(UPDATE)
3.⚠️ If user NOT EXISTS → use "Google Sheets"(APPEND)
4.⚠️ Phone number must have + prefix for matching
5.⚠️ "Group Member" column is the unique identifier
6.⚠️ NEVER use APPEND for existing users
7.⚠️ NEVER use UPDATE for new users
8.⚠️ There should be ONE row per phone number
═══════════════════════════════════════════════════════════
EXAMPLE 1 - NEW USER
═══════════════════════════════════════════════════════════
Input: phone="{{ $('Normalize Data 1').item.json.phone_number }}", group="120363402337148387@g.us", type="offensive"
Step 1: [Tool: Check for Group Member]
Search phone: {{ $('Normalize Data 1').item.json.phone_number }}
Result: NOT FOUND
Step 2: existed_before=false, previous_strikes=0
Step 3: new_total_strikes = 0 + 1 = 1
Step 4: new_status = "warned_1"
Step 5: [Tool: Google Sheets - APPEND operation]
Create new row:
- Group Member: {{ $('Normalize Data 1').item.json.phone_number }}
- Group ID: 120363402337148387@g.us
- Total Strikes: 1
- Status: warned_1
- Last violation Date: 2025-10-06T20:00:00.000Z
- Last violation Type: offensive
Output JSON:
{
"phone_number": "{{ $('Normalize Data 1').item.json.phone_number }}", 
"group_id": "120363402337148387@g.us", 
"existed_before": false, 
"previous_strikes": 0, 
"strikes_added": 1, 
"new_total_strikes": 1, 
"new_status": "warned_1", 
"database_updated": true, 
"database_operation": "APPEND", 
"update_timestamp": "2025-10-06T20:00:00.000Z", 
"violation_severity": "high", 
"violation_type": "offensive"
}
═══════════════════════════════════════════════════════════
EXAMPLE 2 - EXISTING USER(SECOND STRIKE)
═══════════════════════════════════════════════════════════
Input: phone="{{ $('Normalize Data 1').item.json.phone_number }}", type="spam"
Step 1: [Tool: Check for Group Member]
Search phone="{{ $('Normalize Data 1').item.json.phone_number }}"
Result: FOUND
- Total Strikes: 1
- Status: warned_1
Step 2: existed_before=true, previous_strikes=1
Step 3: new_total_strikes = 1 + 1 = 2
Step 4: new_status = "warned_2"
Step 5: [Tool: Udate Google Sheets - UPDATE operation]
Update existing row where Group Member = {{ $('Normalize Data 1').item.json.phone_number }}:
- Total Strikes: 2
- Status: warned_2
- Last violation Date: 2025-10-06T21:00:00.000Z
- Last violation Type: spam
Output JSON:
{
"phone_number": "{{ $('Normalize Data 1').item.json.phone_number }}", 
"group_id": "120363402337148387@g.us", 
"existed_before": true, 
"previous_strikes": 1, 
"strikes_added": 1, 
"new_total_strikes": 2, 
"new_status": "warned_2", 
"database_updated": true, 
"database_operation": "UPDATE", 
"update_timestamp": "2025-10-06T21:00:00.000Z", 
"violation_severity": "medium", 
"violation_type": "spam"
}
═══════════════════════════════════════════════════════════
FINAL CHECKLIST
═══════════════════════════════════════════════════════════
Antes de responder, verifica:
✓ ¿Usaste "Check for Group Member" primero?
✓ Si se encontró → ¿usaste "Udate Google Sheets"(UPDATE)?
✓ Si NO se encontró → ¿usaste "Google Sheets"(APPEND)?
✓ ¿El número de teléfono incluye el prefijo +?
✓ ¿Devolviste JSON válido con database_operation?
✓ ¿Nunca usaste APPEND para usuarios existentes?
✓ ¿Nunca usaste UPDATE para usuarios nuevos?

Don’t forget to add the OpenAI Chat Model and the Simple Memory

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 7: Normalización de datos

Añade otro nodo Code (etiquetado “Normalise Data 2”) para analizar la salida del gestor de strikes.

Esto asegura el formateo adecuado de los números de teléfono (con y sin prefijo +) y establece banderas para acciones de advertencia o expulsión.

Here you can copy the code

// Normalize AI Agent Strike Manager Output
const input = $input.first().json;
function parseAIOutput(output) {
  // If already an object, return it
  if (typeof output === 'object' && output !== null && !output.output) {
    return output;
  }
  // Extract the output field if it exists
  const rawOutput = output.output || output.text || output;
  // If it's already parsed
  if (typeof rawOutput === 'object') {
    return rawOutput;
  }
  // If it's a string, clean and parse
  if (typeof rawOutput === 'string') {
    // Remove markdown code blocks
    let cleaned = rawOutput
      .replace(/```json\n?/gi, '')
      .replace(/```\n?/g, '')
      .trim();
    // Try to extract JSON object
    const jsonMatch = cleaned.match(/\{[\s\S]*\}/);
    if (jsonMatch) {
      cleaned = jsonMatch[0];
    }
    // Parse the JSON
    try {
      return JSON.parse(cleaned);
    } catch (e) {
      throw new Error('Failed to parse JSON: ' + e.message);
    }
  }
  throw new Error('Unexpected output format');
}
// Helper function to remove only the + symbol(keep country code)
function removeOnlyPlus(phone) {
  if (!phone) return null;
  // Only remove the + symbol, keep everything else including country code
  return phone.toString().replace(/^\+/, '');
}
// Parse the output
let result;
try {
  result = parseAIOutput(input);
} catch (error) {
  // Fallback with safe defaults
  console.error('Parsing error:', error.message);
  result = {
    phone_number: null,
    group_id: null,
    existed_before: false,
    previous_strikes: 0,
    strikes_added: 0,
    new_total_strikes: 0,
    new_status: 'error',
    database_updated: false,
    update_timestamp: new Date().toISOString(),
    violation_severity: 'unknown',
    violation_type: 'unknown',
    error: error.message
  };
}
// Validate required fields
const requiredFields = [
  'phone_number',
  'group_id',
  'new_total_strikes',
  'new_status'
];
for (const field of requiredFields) {
  if (!(field in result) || result[field] === undefined) {
    console.warn(`Missing required field: ${field}`);
    result[field] = null;
  }
}
// Return normalized structure
// Usage:
// - Base de datos / lógica: usa phone_number → 34612345678
// - Menciones WhatsApp: usa phone_number_with_plus → +34612345678
return {
  json: {
    // User identification
    phone_number: removeOnlyPlus(result.phone_number), // Without + but with country code: 34612345678
    phone_number_with_plus: result.phone_number, // Original with +: +34612345678
    group_id: result.group_id,
    // Strike information
    existed_before: result.existed_before || false,
    previous_strikes: result.previous_strikes || 0,
    strikes_added: result.strikes_added || 0,
    new_total_strikes: result.new_total_strikes || 0,
    // Status
    new_status: result.new_status,
    database_updated: result.database_updated || false,
    database_operation: result.database_operation || 'UNKNOWN',
    // Metadata
    update_timestamp: result.update_timestamp || new Date().toISOString(),
    violation_severity: result.violation_severity,
    violation_type: result.violation_type,
    // Computed flags for next steps
    should_warn: result.new_total_strikes > 0,
    should_remove:
      result.new_status === 'removed' || result.new_total_strikes >= 3,
    is_first_offense: !result.existed_before && result.new_total_strikes > 0,
    // Error handling
    parsing_successful: !result.error,
    error: result.error || null
  }
};

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 8: Generación automatizada de mensajes de advertencia

Configura el nodo AI Agent Create Message para generar mensajes de advertencia contextuales en tu idioma preferido. Los mensajes se adaptan según el conteo de strikes:

  • Strike 1: Tono educativo con recordatorio de las normas del grupo
  • Strike 2: Advertencia firme sobre la posible expulsión
  • Strike 3: Aviso final antes de la expulsión automática

Aquí puedes encontrar la instrucción para el último Agente:

Prompt (Mensaje del usuario)

Create warning message for:
Phone: {{ $json.phone_number }}
Status: {{ $json.new_status }}
Total Strikes: {{ $json.new_total_strikes }}
Violation Type: {{ $json.violation_type }}
Severity: {{ $json.violation_severity }}
Generate appropriate warning message.

Mensaje del sistema

You are a warning message creation specialist for WhatsApp group moderation.

Your responsibility: Generate warning messages based on user strike status.

═══════════════════════════════════════════════════════════ PLANTILLAS DE MENSAJE POR NIVEL DE STRIKE ═══════════════════════════════════════════════════════════

STRIKE 1 (estado warned_1 - tono educativo): ⚠️ @{phone_number} Tu mensaje ha sido eliminado por violar las normas del grupo.

📋 Motivo: {violation_reason} ⚡ Strike actual: 1/3

Este es tu primer aviso. Por favor, mantén un ambiente respetuoso y profesional. Revisa las normas del grupo para evitar futuras infracciones.

Las violaciones repetidas resultarán en la expulsión del grupo.

---

STRIKE 2 (estado warned_2 - advertencia firme): ⚠️ @{phone_number} SEGUNDA ADVERTENCIA - Tu mensaje ha sido eliminado.

📋 Motivo: {violation_reason} ⚡ Strikes acumulados: 2/3

Esta es tu segunda infracción. Una violación más resultará en tu expulsión inmediata del grupo. Por favor, lee y respeta las normas de la comunidad.

---

STRIKE 3+ (estado removed - final, el usuario será expulsado): 🛑 @{phone_number} EXPULSIÓN INMEDIATA

📋 Motivo de expulsión: {violation_reason} ⚡ Strikes acumulados: {total_strikes}/3

Has alcanzado el límite de infracciones. Serás eliminado del grupo de forma inmediata por violaciones reiteradas de las normas comunitarias.

Esta decisión es definitiva.

---

BAJA SEVERIDAD (0 strikes añadidos - recordatorio amistoso): ℹ️ @{phone_number} Recordatorio amistoso:

{violation_reason}

No se ha asignado ningún strike por esta ocasión, pero te pedimos que sigas las normas del grupo para mantener un ambiente profesional.

═══════════════════════════════════════════════════════════ REGLAS DE FORMATO ═══════════════════════════════════════════════════════════

1. SIEMPRE empieza con @{phone_number} para mencionar al usuario 2. Usa emojis apropiadamente (⚠️ para advertencias, 🛑 para expulsión, ℹ️ para info) 3. Mantén los mensajes concisos pero claros 4. Incluye el conteo de strikes (formato X/3) 5. Expón la razón claramente 6. Usa el tono apropiado según la severidad

═══════════════════════════════════════════════════════════ REGLA CRÍTICA DE SALIDA ═══════════════════════════════════════════════════════════

Debes responder SOLAMENTE con el texto del mensaje de advertencia. NO JSON. NO bloques de código markdown. NO explicaciones. NO texto extra.

Solo el mensaje plano que se enviará directamente a WhatsApp.

═══════════════════════════════════════════════════════════ EJEMPLOS ═══════════════════════════════════════════════════════════

Example 1 - First strike (warned_1): Input: phone="+12345678909", status="warned_1", strikes=1, reason="Lenguaje ofensivo"

Your response: ⚠️ @+12345678909 Tu mensaje ha sido eliminado por violar las normas del grupo.

📋 Motivo: Lenguaje ofensivo ⚡ Strike actual: 1/3

Este es tu primer aviso. Por favor, mantén un ambiente respetuoso y profesional. Revisa las normas del grupo para evitar futuras infracciones.

Las violaciones repetidas resultarán en la expulsión del grupo.

---

Example 2 - Second strike (warned_2): Input: phone="+12345678909", status="warned_2", strikes=2, reason="Spam repetitivo"

Your response: ⚠️ @+12345678909 SEGUNDA ADVERTENCIA - Tu mensaje ha sido eliminado.

📋 Motivo: Spam repetitivo ⚡ Strikes acumulados: 2/3

Esta es tu segunda infracción. Una violación más resultará en tu expulsión inmediata del grupo. Por favor, lee y respeta las normas de la comunidad.

---

Example 3 - Removal (removed status): Input: phone="+12345678909", status="removed", strikes=3, reason="Insultos directos"

Your response: 🛑 @+12345678909 EXPULSIÓN INMEDIATA

📋 Motivo de expulsión: Insultos directos ⚡ Strikes acumulados: 3/3

Has alcanzado el límite de infracciones. Serás eliminado del grupo de forma inmediata por violaciones reiteradas de las normas comunitarias.

Esta decisión es definitiva.

Don’t forget to add the OpenAI Chat Model and the Simple Memory

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 9: Eliminación del mensaje

Añade un nodo de acción de Wassenger para eliminar el mensaje infractor del grupo. Configúralo para revocar el mensaje usando el ID del mensaje, asegurando que el contenido inapropiado se elimine de inmediato.

Añade el nodo Wassenger (Delete Message)

Añade las siguientes expresiones para gestionar correctamente los datos de forma dinámica

WhatsApp Number

{{ $(‘Wassenger Trigger’).item.json.device.id }}

Message ID

{{ $(‘Is Group?’).item.json.id }}

Paso 10: Enviar advertencia al grupo

Configura otro nodo de Wassenger para enviar el mensaje de advertencia generado por la IA al grupo.

Añade el nodo Wassenger (send-messages: sendText)

Esta advertencia pública sirve tanto como notificación al infractor como disuasión para otros miembros.

Añade las siguientes expresiones para gestionar correctamente los datos de forma dinámica

Group ID

{{ $(‘Normalize Data 1’).item.json.group.id }}

Message

{{ $(‘AI Agent Create Message’).item.json.output }}

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 11: Expulsión condicional de miembros

Añade un nodo If que verifique si should_remove es true (cuando los strikes >= 3). Si es true, desencadena el nodo de acción final de Wassenger que elimina al miembro del grupo usando su número de teléfono.

Dentro del nodo IF:

Condiciones

{{ $(‘Normalize Data 2’).item.json.should_remove }} es true

Ahora, añade el Nodo Wassenger para eliminar al participante si es true

Añade las siguientes expresiones para gestionar correctamente los datos de forma dinámica

Group ID

{{ $(‘Normalize Data 1’).item.json.group.id }}

Message

{{ $(‘Wassenger Trigger’).item.json.data.fromNumber }}

👉 Comienza tu prueba gratuita de 7 días en Wassenger y aprovecha nuestros potentes flujos de automatización para WhatsApp para transformar tu servicio al cliente hoy! ⚡

Paso 12: Actualizaciones en la base de datos

Los nodos de Google Sheets (configurados en el Paso 6) actualizan o crean automáticamente registros con:

  • Group Member (número de teléfono)
  • Group ID
  • Total Strikes
  • Status (active/warned_1/warned_2/removed)
  • Last Violation Date
  • Last Violation Type

Opciones avanzadas de personalización

El flujo de trabajo se adapta a tus necesidades específicas:

  • Personaliza categorías de violación y niveles de severidad
  • Establece preferencias de idioma para los mensajes de advertencia
  • Ajusta umbrales de strikes y periodos de timeout
  • Añade excepciones para administradores o miembros VIP
  • Crea informes de violaciones y analíticas

Soluciones rápidas para problemas comunes

Problemas comunes y soluciones:

  • Entradas duplicadas: Asegúrate de que la IA use UPDATE para usuarios existentes, no APPEND
  • Coincidencias en formato de teléfono: Elimina el símbolo + de las entradas de la base de datos
  • Mensajes que no se eliminan: Verifica los permisos del dispositivo Wassenger
  • IA que no detecta violaciones: Refina tus prompts de moderación en el mensaje del sistema

🤩 🤖 Wassenger es una solución API completa para WhatsApp. Regístrate para una prueba gratuita de 7 días y comienza en minutos!

🚀 ¿Listo para transformar la gestión de tus grupos de WhatsApp?

Deja de pasar horas moderando grupos de WhatsApp manualmente. Con la potente plataforma de automatización de Wassenger, puedes construir este moderador con IA y muchos otros flujos sin conocimientos de programación.

💡 Comienza tu viaje de automatización hoy

Visita Wassenger y descubre cómo empresas de todo el mundo están revolucionando sus operaciones en WhatsApp. Con Wassenger Flows, obtienes:

  • ✅ Plantillas de workflows preconstruidas
  • ✅ Constructor de automatizaciones drag-and-drop
  • ✅ Acceso 24/7 a la API de WhatsApp
  • ✅ Documentación completa
  • ✅ Equipo de soporte experto

🎯 Toma el control de tus grupos de WhatsApp

Regístrate en Wassenger.com hoy y únete a miles de empresas que ya están automatizando sus operaciones en WhatsApp. Ya sea que gestiones soporte al cliente, ventas o engagement comunitario, Wassenger Flows te permite crear automatizaciones potentes en minutos, no meses.

🔥 ¿Por qué Wassenger?

  • No requiere código: Constructor visual de workflows que cualquiera puede usar
  • Fiabilidad de nivel empresarial: Diseñado para empresas que dependen de WhatsApp
  • Soluciones escalables: Desde grupos pequeños hasta comunidades masivas
  • Acceso completo a la API: Control total sobre tus operaciones de WhatsApp Business

🤩 🤖 Wassenger es una solución API completa para WhatsApp. Regístrate para una prueba gratuita de 7 días y comienza en minutos!

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free