Pasar al contenido principal
osky
Cómo eliminar estudiantes de cursos específicos en SendPulse desde tu bot de WhatsApp
Tema SendPulse Academy + WhatsApp Bot

Cómo eliminar estudiantes de cursos específicos en SendPulse desde tu bot de WhatsApp

Hasta hace poco, cuando querías sacar a un estudiante de la academia en SendPulse, la única opción era borrarlo de todos los cursos de un jalón. Nada de cirugía fina: machete parejo. Eso cambió. Ahora puedes seleccionar exactamente de cuáles cursos lo sacas, y el sistema te avisa que el progreso en esos cursos se borra de forma permanente. Esta guía te explica cómo conectar esa funcionalidad a tu bot de WhatsApp para que el proceso sea automático, limpio y sin que tengas que entrar al panel cada vez que un alumno cancela o cambia de plan.

Flujo de automatizacion conectando WhatsApp con API de SendPulse

El caso de uso más común en producción: un usuario te manda un mensaje por WhatsApp pidiendo cancelar su suscripción a un curso específico. Tu bot recibe eso, identifica al contacto, llama a la API de SendPulse para removerlo del curso correcto, y le confirma la baja. Todo sin intervención humana. Así funciona en 2026 cualquier operación de academia que se respete.


Requisitos

  • Cuenta activa en SendPulse con módulo Academy habilitado
  • Bot de WhatsApp configurado en SendPulse (Chatbot Builder) o integración externa vía API REST de SendPulse
  • API Key y API Secret de tu cuenta SendPulse (Settings → API)
  • Node.js 20+ si vas a usar el snippet de este tutorial, o cualquier lenguaje que haga peticiones HTTP
  • Acceso al panel de Academy para verificar los IDs de cursos

Paso 1 — Obtén tu token de acceso a la API de SendPulse

Antes de hacer cualquier llamada, necesitas un Bearer token. SendPulse usa OAuth 2.0 con client_credentials.

curl -X POST https://api.sendpulse.com/oauth/access_token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "client_credentials",
    "client_id": "TU_API_KEY",
    "client_secret": "TU_API_SECRET"
  }'

La respuesta te da un access_token con vigencia de una hora. Guárdalo en memoria o en caché con TTL de 3500 segundos. No lo hardcodees en el código fuente — usa variables de entorno.

// .env
SENDPULSE_CLIENT_ID=tu_api_key
SENDPULSE_CLIENT_SECRET=tu_api_secret

Paso 2 — Identifica los IDs de los cursos en Academy

Desde el panel de SendPulse, entra a Academy → Cursos. Cada curso tiene un ID numérico visible en la URL cuando lo abres: academy.sendpulse.com/course/XXXXXX/edit. Anota esos IDs — los vas a necesitar para la llamada de eliminación.

Si quieres hacerlo programático, puedes listar cursos vía API:

const res = await fetch('https://api.sendpulse.com/academy/courses', {
  headers: { Authorization: `Bearer ${token}` }
});
const { data } = await res.json();
// data es un array con id, title, etc.

Paso 3 — Encuentra el ID del estudiante por su número de WhatsApp

Cuando el usuario manda un mensaje desde WhatsApp, tu bot recibe su número de teléfono. Necesitas cruzarlo con el contacto en SendPulse para obtener su student_id en Academy.

async function getStudentByPhone(phone, token) {
  // Busca el contacto en la lista de contactos de SendPulse
  const res = await fetch(
    `https://api.sendpulse.com/addressbooks/contacts/get/by/variable`,
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        variable_name: 'phone',
        variable_value: phone
      })
    }
  );
  const data = await res.json();
  return data?.data?.[0]?.id ?? null;
}

Advertencia de producción: El número de teléfono en WhatsApp llega en formato internacional sin + (ej. 5215512345678). Normaliza siempre antes de buscar. Un mismatch de formato te va a dar falsos negativos y el estudiante nunca se borrará.


Paso 4 — Llama al endpoint para eliminar al estudiante de cursos seleccionados

Esta es la parte nueva que SendPulse habilitó. El endpoint acepta un array de course_ids para que la eliminación sea quirúrgica.

async function removeStudentFromCourses(studentId, courseIds, token) {
  const res = await fetch(
    `https://api.sendpulse.com/academy/students/${studentId}/remove`,
    {
      method: 'DELETE',
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        course_ids: courseIds // ej. [1023, 1087]
      })
    }
  );

  if (!res.ok) {
    const err = await res.json();
    throw new Error(`Error al eliminar: ${JSON.stringify(err)}`);
  }

  return await res.json();
}

Advertencia crítica: El progreso del estudiante en esos cursos se elimina de forma permanente e irreversible. No hay papelera de reciclaje. Si tu flujo tiene un error de lógica y manda el course_id equivocado, perdiste los datos del alumno sin vuelta atrás. Valida dos veces antes de ejecutar.


Paso 5 — Integra esto en el flujo de tu bot de WhatsApp

En el Chatbot Builder de SendPulse, crea un flujo con estos pasos:

  1. Trigger: El usuario escribe algo como "cancelar curso" o "darme de baja"
  2. Acción — Input: Pregúntale de cuál curso quiere darse de baja (muéstrale un menú con botones de respuesta rápida con los nombres de tus cursos)
  3. Acción — Webhook: Llama a tu backend con el número del usuario y el curso seleccionado
  4. Tu backend: Ejecuta los pasos 1-4 de este tutorial
  5. Acción — Enviar mensaje: Confirma la baja al usuario

Si usas n8n o Make como middleware, el nodo HTTP Request en n8n hace exactamente las llamadas de arriba. Solo mapea las variables del webhook entrante a los campos del body.

// Ejemplo de payload que tu bot manda a tu backend
{
  "phone": "5215512345678",
  "course_id": 1023,
  "confirm": true
}

Paso 6 — Maneja los errores con gracia

En producción, estas cosas pasan:

  • El estudiante no existe en Academy (se registró pero nunca activó el curso)
  • El token expiró justo en medio de la petición
  • El course_id no corresponde a ningún curso activo
try {
  const studentId = await getStudentByPhone(phone, token);
  if (!studentId) {
    return bot.sendMessage(phone, 'No encontré tu cuenta. Escríbenos a soporte.');
  }
  await removeStudentFromCourses(studentId, [courseId], token);
  bot.sendMessage(phone, `Listo, te dimos de baja del curso. Tu progreso fue eliminado.`);
} catch (err) {
  console.error(err);
  bot.sendMessage(phone, 'Hubo un error. Intenta de nuevo o contacta soporte.');
}

Advertencias finales de producción

  • Logs obligatorios: Registra cada eliminación con timestamp, phone, student_id y course_ids. Si algo sale mal, necesitas auditoría.
  • Confirmación doble: Antes de ejecutar el DELETE, manda un mensaje de confirmación al usuario: "¿Seguro que quieres cancelar el curso X? Responde SI para continuar." Un paso más previene errores humanos y berrinches post-eliminación.
  • Rate limits: La API de SendPulse tiene límites. Si tienes muchos usuarios cancelando simultáneamente, implementa una cola (BullMQ, Redis) en lugar de llamadas directas.
  • Notifica al equipo: Manda un aviso interno (Slack, email, lo que uses) cada vez que se ejecute una baja. Que el equipo sepa quién se fue y de qué curso.

Con esto tienes un flujo completo, desde que el usuario manda un mensaje hasta que queda fuera del curso, sin tocar el panel manualmente.