Ofertas de retención
Un widget que puedes incrustar donde tu alumno va a cancelar, con ofertas que Stripe ejecuta de verdad. Funciona en cualquier web, sin depender de ningún plugin nuestro.
Cuando un alumno va a darse de baja, lo normal es perderlo en silencio. Este widget se pone en esa pantalla y le ofrece alternativas que Stripe ejecuta de verdad: pausar, cambiar de nivel, cambiar de plan o un descuento.
Funciona en cualquier web —WordPress con o sin nuestro plugin, o un HTML plano—, porque el navegador nunca ve tu secreto de servidor. Si tu comunidad usa nuestro plugin, su página de baja enseña las mismas ofertas y se comporta igual.
Cómo se monta
1. Tu backend acuña un token para ese alumno
Esta llamada es de servidor a servidor, con tu secreto. Nunca desde el navegador:
curl -X POST https://track.alloop.ch/membership/campus/widget-token \
-H "Authorization: Bearer TU_SECRETO_DE_SERVIDOR" \
-H "Content-Type: application/json" \
-d '{"subscription_id": "sub_1ABC..."}'{ "ok": true, "token": "eyJ…", "expires_in": 1800 }El token dura 30 minutos y va firmado con esa suscripción dentro. Por eso puede vivir en el navegador sin riesgo: nadie puede cambiar un campo para tocar la suscripción de otro.
2. Pones el widget en tu página
<div id="alloop-campus" data-token="EL_TOKEN_DEL_PASO_1"></div>
<script src="https://track.alloop.ch/static/alloop-campus.js" defer></script>Opcionales en el <div>: data-title, data-accent, data-cancel-text y data-api.
3. Escuchas lo que decide el alumno
El widget no cancela ni redirige por su cuenta —no sabe dónde está incrustado—. Avisa y tú decides:
const w = document.getElementById('alloop-campus');
w.addEventListener('alloop-campus:applied', (e) => {
// Aceptó una oferta: se queda. e.detail.type es 'pause', 'next_level', 'discount'…
// e.detail.next_charge = { amount, currency, at } con su próximo cobro, cuando Stripe lo da.
location.href = '/mi-cuenta?retenido=1';
});
w.addEventListener('alloop-campus:declined', () => {
// Dijo que no a todo: aquí sigues TÚ con tu flujo de cancelación.
document.getElementById('mi-formulario-de-baja').hidden = false;
});Los cinco eventos: ready, applied, declined, cooldown y error.
Las ofertas
Se configuran por cliente. Cinco tipos, y todos se ejecutan de verdad en Stripe:
| Tipo | Qué hace |
|---|---|
next_level | Lo matricula en el siguiente nivel |
pause | Aplaza el cobro N meses, conservando lo pagado |
downgrade | Cambia a un plan más barato |
free_days | Añade N días gratis después de lo ya pagado |
discount | Aplica un cupón, enseñando antes el precio exacto que pagará |
El descuento enseña el precio antes de aplicarse
Un descuento escrito como «40 % los 2 próximos meses» no dice lo que paga cada alumno. Quien paga cada trimestre recibe el 40 % en una factura de tres meses, y quien paga cada año puede no recibir nada. Por eso la tarjeta no enseña solo tu etiqueta: enseña lo que Stripe va a cobrar a ese alumno, calculado con su suscripción real.
- En la tarjeta: el precio de su próximo cobro tachado, el precio con descuento y la fecha.
Debajo, cuánto tiempo cubre y qué pagará después:
149 €89,40 € el 27 sept · Cubre 3 meses · después, 149 € cada trimestre. El título lo cuenta en sus ciclos de cobro: «40 % en tu próximo trimestre». - Nada se aplica al primer clic. Al pulsar la tarjeta sale el resumen (próximo cobro, fecha, hasta cuándo cubre y precio después) con un botón Aplicar descuento y otro para volver.
- Al aplicarlo, la confirmación dice el importe y la fecha del próximo cobro: «Tu próximo cobro será de 89,40 € el 27 de septiembre de 2026, en vez de 149 €».
Un descuento que no rebaja su próximo cobro no se le ofrece. Pasa con un cupón de dos meses a alguien que paga cada año y no renueva hasta dentro de ocho: el cupón caduca antes de su siguiente factura. Ofrecérselo gastaría su única oferta a cambio de nada.
Si Stripe no responde en ese momento, la tarjeta sale igual, con tu etiqueta y sin precio: el cálculo nunca impide que el alumno vea sus opciones.
Por qué next_level existe
Es la oferta que ningún flujo de cancelación tiene, y responde al motivo más común en una academia: "ya terminé mi nivel". A esa persona un descuento no le sirve —no se va por precio, se va porque acabó— y encima le regalas margen. Lo que la retiene es matricularla en A2.
Cambia el precio de su suscripción sin cargo inmediato: conserva lo que ya pagó y el nuevo precio entra en el siguiente ciclo. No pierde el acceso en ningún momento, que es lo último que quieres cuando estaba a punto de irse.
La pausa funciona en trimestral y anual
Muchas herramientas solo saben pausar suscripciones mensuales, y las academias venden trimestral y anual. Aquí la pausa aplaza el siguiente cobro los meses que sean, sin anular ninguna factura: pausar un plan anual no regala el año.
Tres reglas que el widget respeta
- Las ofertas salen por olas. Primero lo que resuelve el motivo (cambiar de nivel, pausar); el descuento aparece el último, y solo si el alumno ha dicho que no a lo anterior. Enseñar la rebaja de entrada se la regala a quien se iba a quedar de todas formas.
- Una vez cada 30 días por alumno (configurable). Si las ve cada vez que entra a su cuenta, aprende que hay rebajas permanentes y deja de pagar precio completo. Dentro de esa ventana el widget no pinta nada.
- Una oferta por suscripción. Lo impone el servidor: no se pueden encadenar pausas ni apilar descuentos.
Lo que este widget NO hace, a propósito
No abre un modal a pantalla completa, no intercepta el botón de cancelar y no manda ningún email al alumno. Es justo lo que hace que la gente odie los flujos de cancelación: acaban yéndose igual, pero enfadados. Aquí el alumno llega porque quiere irse, y se le enseña una alternativa una sola vez.
Cómo sabes que funciona
Con un alumno de prueba (test-alloop), acuña un token y abre la página. Debe verse la primera ola
de ofertas. Pulsa una y comprueba en Stripe que la suscripción cambió: la confirmación del
widget no es la prueba, el cambio en Stripe sí.
Para un descuento, compara el precio de la tarjeta con la próxima factura de esa suscripción en Stripe tras aplicarlo: tienen que coincidir al céntimo.
Si no aparece nada, revisa en este orden:
| Síntoma | Causa probable |
|---|---|
| El widget no pinta nada | Ese alumno está en el periodo de espera de 30 días, o no hay ofertas configuradas |
401 en las llamadas | El token caducó (dura 30 min) o se acuñó para otro cliente |
| "Ya has aplicado una oferta" | Correcto: es de un solo uso por suscripción |
| Sale la oferta pero falla al aplicar | Falta el price_id o el cupón en la configuración |
| A un alumno no le sale el descuento | Ese cupón no rebajaría su próximo cobro (por ejemplo, paga cada año y el cupón caduca antes de su renovación), o el cupón está limitado a otro producto |
| El descuento sale sin precio | Stripe no respondió al calcularlo; la oferta funciona igual |
Siguiente paso
Este widget actúa en el momento en que alguien pulsa cancelar. Para los dos que se van sin que te enteres —el que ya canceló y aún no ha perdido el acceso, y aquel a quien le falló la tarjeta— están los dos rescates automáticos, que salen solos.
Y vuelve a Campus para medir la actividad que alimenta todo esto.
¿Te atascas? Pregúntale a tu IA
Pregúntale a tu IA
Esta documentación está pensada para leerse con una IA al lado. Abre tu asistente con el contexto de alloop ya cargado y pregúntale lo que necesites, en tu idioma.
Para qué NO sirve: una IA no ve tu panel, tus pagos ni tus datos, y puede equivocarse. Si un ingreso no aparece, algo toca tu producción o necesitas una respuesta oficial, escríbenos: esto no sustituye al soporte.
Del campus a tus anuncios
Meta y Google solo ven una parte de tus ventas, y ninguna de las dos sabe qué pasó después. Devolverles las ventas completas y el comportamiento real del alumno es lo que hace que dejen de buscar compradores y empiecen a buscar alumnos.
Los dos rescates automáticos
Dos correos que salen solos y recuperan alumnos que ibas a perder sin enterarte: al que canceló y aún no ha perdido el acceso, y a quien le falló la tarjeta en la renovación.