Gestión de suscripciones
Este documento describe el sistema completo de gestión de suscripciones y consentimiento de Joryio, que gestiona suscripciones por canal, suscripciones basadas en listas/temas, encabezados List-Unsubscribe de RFC 8058, manejo de rebotes y funciones de cumplimiento.
Índice
- Resumen
- Modelos de datos
- Suscripciones de canal
- Integración con SDK web
- Listas de suscripción
- Doble opt-in
- Grupos de suscripción por número (SMS y WhatsApp)
- Encabezado List-Unsubscribe (RFC 8058)
- Página de preferencias alojada y baja
- Página de preferencias (diseño personalizado)
- Manejo de rebotes
- Variables de plantilla Liquid
- Filtros de segmento
- Referencia de API
- Configuración
- Cumplimiento
Resumen
El sistema de gestión de suscripciones de Joryio ofrece:
- Suscripciones por canal: rastrea la aceptación/exclusión de email, SMS, WhatsApp, notificaciones push y Viber.
- Suscripciones basadas en listas: permite que los usuarios se suscriban a temas o listas de correo específicos.
- Cumplimiento de RFC 8058: encabezados de baja en un clic para mejorar la entregabilidad de email.
- Manejo de rebotes: gestión automática de rebotes suaves y permanentes.
- Registro de auditoría: historial completo de cambios de suscripción para cumplimiento.
- Filtrado de segmentos: dirige usuarios según su estado de suscripción.
Modelos de datos
Suscripción de canal (por usuario)
Cada usuario tiene un estado de suscripción para cada canal de comunicación:
interface ChannelSubscription {
status: 'optedIn' | 'subscribed' | 'unsubscribed';
optInDate?: Date;
optOutDate?: Date;
optInSource?: string; // 'api', 'web_form', 'import', 'manual'
consentText?: string; // Texto de consentimiento mostrado al aceptar
}
interface EmailSubscription extends ChannelSubscription {
bounceType?: 'soft' | 'hard' | null;
bounceCount?: number;
lastBounceAt?: Date;
isValid?: boolean; // false si tuvo un rebote permanente
}
interface UserSubscriptions {
email?: EmailSubscription;
sms?: ChannelSubscription;
whatsapp?: ChannelSubscription;
push?: ChannelSubscription;
viber?: ChannelSubscription;
}
Lista de suscripción
Las listas son temas o categorías a los que los usuarios pueden suscribirse:
interface SubscriptionList {
id: string;
organizationId: string;
workspaceId: string;
name: string;
description?: string;
channels: ('email' | 'sms' | 'whatsapp' | 'push' | 'viber')[];
isPublic: boolean; // Mostrar en el centro de preferencias
type: 'marketing' | 'transactional';
requireDoubleOptIn: boolean;
archivedAt?: Date;
createdAt: Date;
updatedAt: Date;
}
Pertenencia a lista
Rastrea a qué listas está suscrito cada usuario:
interface ListSubscription {
contactId: string;
listId: string;
channel: 'email' | 'sms' | 'whatsapp' | 'push' | 'viber';
status: 'optedIn' | 'subscribed' | 'unsubscribed';
subscribedAt?: Date;
unsubscribedAt?: Date;
optInSource?: string;
}
Suscripciones de canal
Tipos de estado
| Estado | Descripción |
|---|---|
optedIn | El usuario completó la confirmación de doble opt-in. |
subscribed | El usuario está suscrito (aceptación simple). |
unsubscribed | El usuario se dio de baja. |
pending | Pendiente de confirmación: pidió suscribirse y aún no ha confirmado el doble opt-in. No recibe mensajes hasta confirmar; al confirmar pasa a subscribed. Lo fija un flujo de confirmación (por ejemplo, el doble opt-in de Delivyr), nunca los SDK. |
Actualizar el estado de canal
// Mediante API
await subscriptionsApi.updateChannelSubscription(userId, 'email', {
status: 'unsubscribed',
source: 'preference_center',
reason: 'User requested via preference center'
});
El evento de suscripción
Cada vez que una persona pasa a estar suscrita, Joryio registra el evento de plataforma message.subscribed - la contrapartida de message.unsubscribed. Úsalo como disparador de un journey (por ejemplo, una serie de bienvenida tras suscribirse al newsletter) o en un segmento ("realizó message.subscribed en los últimos 7 días").
- Una vez por cambio real. Se registra cuando un canal o una lista pasa de ningún estado,
unsubscribedopendingasubscribed/optedIn. Volver a guardar el mismo consentimiento, o un contacto que ya estaba suscrito, no registra nada. Con doble opt-in se registra cuando la persona confirma, no cuando se le pide. - Propiedades:
channel,scope(channel/list),listId,source,platform,optInSource,status,previousStatus,resubscribe.listIdaparece en una lista;platformnombra la tienda en una suscripción desde una tienda;resubscribeestruetras una baja anterior. source- cómo ocurrió:store_newsletter,store_checkout,store_registration,store_customer_record,landing_page_form,in_app_form,website_form,api,dashboard,sdk,preference_center,double_opt_in,keyword,push_permission,journey.keywordes una respuesta START,push_permissionel primer token push,journeyun paso Actualizar usuario,double_opt_inuna suscripción pendiente confirmada.- No se registra para el historial. Las importaciones de contactos, las sincronizaciones de almacén de datos, las altas masivas en listas y la sincronización inicial o la conciliación programada de una tienda escriben el estado de suscripción pero ningún evento: esas personas ya estaban suscritas, no acaban de suscribirse, y una importación grande no debe iniciar miles de journeys de bienvenida. Las señales en vivo de la tienda - una suscripción al newsletter, la casilla del checkout, una actualización del cliente - sí se registran.
- Las reglas de consentimiento no cambian. Una nueva suscripción se aplica solo a ese contacto, y una queja o un rebote duro solo los puede levantar el personal de Joryio - una nueva suscripción rechazada no registra nada. Como todo evento, pertenece a un único espacio de trabajo.
El evento de baja. message.unsubscribed registra cada baja: un enlace o cabecera de baja, la página de preferencias, una respuesta STOP y - desde 2026-11-02 - un miembro del equipo en el panel (unsubscribeSource admin), la API (api), el SDK (sdk) y una baja de una tienda (store_sync). Es un registro de la baja para segmentos, condiciones y Data Streaming; un journey no empieza con él.
Prácticas recomendadas
- Registra siempre la fuente de los cambios de suscripción.
- Guarda el texto de consentimiento cuando los usuarios acepten.
- Para cumplir el RGPD, usa doble opt-in con usuarios europeos.
Integración con SDK web
El SDK web de Joryio permite gestionar las preferencias de suscripción de usuarios directamente desde tu sitio o aplicación web.
Instalación
<!-- Mediante etiqueta script (servida desde la API de Joryio) -->
<script src="https://sdk.joryio.com/web/1/joryio.min.js"></script>
<!-- O mediante npm -->
npm install @joryio/web-sdk
Tipos de estado de suscripción
El SDK proporciona tres valores de estado de suscripción:
| Estado | Descripción |
|---|---|
SubscriptionStatus.OPTED_IN | El usuario aceptó explícitamente (por ejemplo, doble opt-in confirmado). |
SubscriptionStatus.SUBSCRIBED | El usuario está suscrito pero no aceptó explícitamente. |
SubscriptionStatus.UNSUBSCRIBED | El usuario se dio de baja. |
Definir suscripciones de canal
import { JoryioSDK, SubscriptionStatus } from '@joryio/web-sdk';
// Inicializa el SDK
const sdk = new JoryioSDK({ sdkKey: 'jry_sdk_web_...' });
// Define la suscripción de un canal (solo escritura por seguridad, sin getters)
sdk.user.setSubscription('email', SubscriptionStatus.OPTED_IN);
sdk.user.setSubscription('sms', SubscriptionStatus.SUBSCRIBED);
sdk.user.setSubscription('push', SubscriptionStatus.UNSUBSCRIBED);
sdk.user.setSubscription('whatsapp', SubscriptionStatus.SUBSCRIBED);
// Define varios canales a la vez
sdk.user.setSubscriptions({
email: SubscriptionStatus.OPTED_IN,
sms: SubscriptionStatus.UNSUBSCRIBED,
whatsapp: SubscriptionStatus.SUBSCRIBED,
push: SubscriptionStatus.OPTED_IN
});
Gestionar grupos de suscripción (listas)
// Añade el usuario a un grupo/lista de suscripción
sdk.user.addToSubscriptionGroup('newsletter-list-id', 'email');
sdk.user.addToSubscriptionGroup('product-updates-id', 'push');
// Elimina el usuario de un grupo/lista de suscripción
sdk.user.removeFromSubscriptionGroup('newsletter-list-id', 'email');
// El parámetro de canal es opcional; el predeterminado es 'email'
sdk.user.addToSubscriptionGroup('weekly-digest-id');
Notas de seguridad
El objeto User del SDK es solo de escritura por motivos de seguridad:
- No hay método
getSubscriptions(): impide que otros sitios/scripts lean datos de suscripción del usuario. - No hay métodos getter: todas las operaciones son escrituras unidireccionales al backend.
- Autenticación con clave de SDK: todas las solicitudes se autentican con tu clave de SDK.
- El SDK siempre actúa como «el usuario actual»:
setSubscription/addToSubscriptionGroupno reciben ID de destino; se aplican a quien el SDK identifica actualmente (el propio ID de un visitante anónimo o el usuario enviado aidentify()). Un visitante no puede cambiar mediante el SDK las suscripciones de otro. - Con autenticación de SDK activada, un cambio de suscripción que nombra a un usuario debe llevar el token de ese usuario. El cambio de un visitante anónimo sobre sí mismo se acepta - no tiene token que mostrar -, pero se rechaza un
anonymousIdque ya pertenece a un usuario identificado, para que el consentimiento de una persona no pueda cambiarse con un identificador antiguo de otra. Con Identidad de SDK estricta activada, también se rechazan los cambios de suscripción anónimos: llama antes aidentify(userId). La excepción es una baja, que se acepta siempre (abajo). - Las bajas se entregan siempre. Un
unsubscribedde canal y una baja de grupo se aceptan para cualquier persona en cuyo nombre actúa el SDK: un visitante anónimo, alguien que se excluyó del seguimiento o rechazó el consentimiento de seguimiento, y también con Identidad de SDK estricta. Los SDK las mantienen en cola y las reintentan aunque se llame aoptOut(), se deniegue el consentimiento o se llame awipeData(); todo lo demás (suscribirse, atributos, eventos) se detiene. La única regla que sigue aplicando: con autenticación de SDK, unanonymousIdque pertenece a un usuario identificado no puede cambiar el consentimiento de ese usuario sin su token. Detalles: Las retiradas se entregan siempre. Se aceptan incluso mientras la ingesta de eventos de la cuenta está en pausa por facturación. - Las primeras altas están abiertas; volver a suscribir a quien se dio de baja, no. Como en cualquier SDK del lado del cliente, la clave es pública, así que sin SDK Authentication un
userIdes solo una afirmación. Un alta por primera vez (un canal o una lista de la que la persona nunca se dio de baja) se acepta para cualquier usuario. Volver a suscribir a una persona que se dio de baja explícitamente - su propia baja o la de una lista, una respuesta STOP, o una baja en su email o teléfono hecha por otro contacto - solo se acepta para un usuario verificado con SDK Authentication o para el propio perfil anónimo del visitante; si no, la solicitud recibe403concode: "verified_identity_required"(vuelve a suscribirlo desde tu servidor con la API). UnanonymousIdque pertenece a una persona identificada cuenta como unuserIdno verificado: se acepta una primera alta para esa persona, pero no volver a suscribirla después de una baja. Recomendado: activa el doble opt-in en las listas que se alimentan de formularios o apps públicos - un alta desde el SDK en esa lista envía el email de confirmación en lugar de suscribir. - Las suscripciones siguen a la persona al iniciar sesión. Cuando un visitante anónimo se identifica y su perfil anónimo se fusiona con un perfil existente, pasan tanto sus suscripciones de canal como su pertenencia a listas. Donde los dos perfiles no coinciden, gana la baja de cualquiera de los dos. Una fusión nunca borra un estado que ya tiene el perfil que se conserva; un estado que traslada (una baja) se escribe en el historial de suscripciones de ese perfil con el origen
identity_merge.
Compatibilidad con TypeScript
import {
JoryioSDK,
SubscriptionStatus,
SubscriptionChannel,
SubscriptionPreferences
} from '@joryio/web-sdk';
const sdk = new JoryioSDK({ sdkKey: 'jry_sdk_web_...' });
// Actualizaciones de suscripción seguras por tipos
const preferences: SubscriptionPreferences = {
email: SubscriptionStatus.OPTED_IN,
sms: SubscriptionStatus.UNSUBSCRIBED,
};
sdk.user.setSubscriptions(preferences);
// Selección de canal segura por tipos
const channel: SubscriptionChannel = 'email';
sdk.user.setSubscription(channel, SubscriptionStatus.OPTED_IN);
Ejemplo: página de configuración de preferencias
// En tu página de configuración
function handleSubscriptionToggle(channel, isEnabled) {
sdk.user.setSubscription(
channel,
isEnabled ? SubscriptionStatus.SUBSCRIBED : SubscriptionStatus.UNSUBSCRIBED
);
}
// Uso
handleSubscriptionToggle('email', true); // Suscribirse a email
handleSubscriptionToggle('sms', false); // Darse de baja de SMS
Ejemplo: registro al newsletter
function subscribeToNewsletter(email) {
// Primero identifica el usuario
sdk.identify(email);
sdk.setAttributes({ email: email });
// Después suscríbelo a la lista de newsletter
sdk.user.setSubscription('email', SubscriptionStatus.OPTED_IN);
sdk.user.addToSubscriptionGroup('newsletter-list-id', 'email');
}
Listas de suscripción
Crear una lista
const list = await listsApi.create({
name: 'Weekly Newsletter',
description: 'Our weekly digest of product updates',
channels: ['email'],
isPublic: true, // Mostrar en el centro de preferencias
type: 'marketing',
requireDoubleOptIn: false
});
Gestionar miembros
// Suscribe un usuario a una lista
await subscriptionsApi.subscribeToList(userId, listId, 'email', {
source: 'api',
consentText: 'Weekly newsletter signup'
});
// Da de baja un usuario
await subscriptionsApi.unsubscribeFromList(userId, listId, 'email');
// Operaciones masivas (nunca vuelven a suscribir contactos que se dieron de baja)
await listsApi.bulkAddMembers(listId, contactIds, 'email');
await listsApi.bulkRemoveMembers(listId, contactIds, 'email');
Listas públicas frente a privadas
- Listas públicas (
isPublic: true): se muestran en el centro de preferencias; los usuarios pueden gestionarlas. - Listas privadas (
isPublic: false): solo las gestionan los administradores; no se muestran a usuarios.
Doble opt-in
El doble opt-in añade un paso de confirmación a una lista: la persona rellena un formulario, recibe un único email con un enlace firmado y se añade a la lista solo después de hacer clic en él. Se aplica a las listas a las que se une desde un formulario de landing page o un formulario de mensaje in-app; una suscripción escrita por la API o por una importación masiva se añade directamente.
El valor por defecto del workspace
Ajustes > Suscripciones > Double opt-in tiene dos controles:
- Activar el doble opt-in por defecto para las listas nuevas - desactivado por defecto. Es un valor por defecto para listas nuevas, no una política: una lista creada mientras está activo empieza con "Requerir doble opt-in" marcado, y cambiar el interruptor después no toca las listas existentes.
- Plantilla del email de confirmación - "Email de confirmación integrado" o una de las plantillas de email del workspace (ver más abajo).
La anulación por lista
Cada lista lleva su propia casilla Requerir doble opt-in (Suscripciones > Listas, en el diálogo de creación y edición; la tabla de listas la muestra como "Obligatorio" u "Opcional"). Siempre prevalece sobre el valor por defecto del workspace - una elección explícita en la lista nunca la sobrescribe el ajuste. Por la API el campo es requireDoubleOptIn; omítelo en la petición de creación para tomar el valor por defecto del workspace, o pasa true / false para decidir en esa lista.
Qué aspecto tiene una suscripción pendiente
Cuando un envío de formulario nombra una lista que requiere confirmación:
- El perfil de la persona se crea o actualiza con los valores del formulario como siempre, pero la pertenencia a la lista no se escribe - no se guarda nada para la lista hasta que hace clic. No hay ninguna fila de miembro "pendiente" que encontrar en la lista.
- Al mensaje de agradecimiento del formulario se le añade "Revisa tu bandeja de entrada para confirmar la suscripción." en el idioma de la página.
- El evento de formulario enviado lleva
listsSubscribed(listas a las que se unió de inmediato) ylistsPending(listas que esperan confirmación), para que un journey pueda distinguirlas. - Se envía un único email de confirmación para todas las listas pendientes juntas, como email transaccional a través de la configuración de email del propio workspace. La misma persona que pide las mismas listas otra vez dentro de la misma hora no recibe un segundo email.
- El enlace es válido durante 7 días. Al hacer clic, la persona se suscribe a todas las listas que nombra el enlace con origen
double_opt_iny ve una pequeña página de confirmación en el idioma del formulario. Un enlace caducado o alterado muestra "Este enlace de confirmación ya no es válido. Rellena el formulario de nuevo para recibir otro."
El email de confirmación
Sin una plantilla elegida, Joryio envía su email de confirmación integrado en el idioma de la página (inglés, hebreo, español, griego o árabe; cualquier otro cae en inglés): un asunto "Confirma tu suscripción", los nombres de las listas, un botón "Confirmar suscripción" y una línea que pide al destinatario ignorar el email si no fue él.
Para usar tu propio diseño, elige una de tus plantillas de email como Plantilla del email de confirmación. Se renderiza con estas variables:
| Variable | Valor |
|---|---|
{{ confirm_url }} | El enlace de confirmación firmado. Obligatorio - una plantilla que no referencia confirm_url no se usa y en su lugar se envía el email integrado, porque un email de confirmación sin su enlace nunca puede confirmarse. |
{{ list_names }} | Los nombres de las listas pendientes, separados por comas ("Weekly Newsletter, Product Updates"). |
{{ lists }} | Las listas pendientes como objetos con id y name, para un bucle. |
{{ brand }} | El nombre del workspace (o "us" cuando no tiene). |
{{ language }} | El código de idioma de la página del formulario, p. ej. en. |
El asunto de la plantilla se renderiza con las mismas variables; una plantilla sin asunto usa el integrado. La plantilla también se omite, con un aviso en los logs, cuando ya no existe o falla al renderizarse - la persona sigue recibiendo el email integrado. Las variables de persona ({{ user.first_name }} y el resto) están disponibles como en cualquier email transaccional.
<p>You asked to receive updates from {{ brand }}:</p>
<ul>
{% for list in lists %}
<li>{{ list.name }}</li>
{% endfor %}
</ul>
<p><a href="{{ confirm_url }}">Confirm subscription</a></p>
<p>If this was not you, ignore this email and nothing changes.</p>
Doble opt-in por SMS
El doble opt-in por SMS pide a cada nuevo suscriptor de SMS que confirme desde su propio teléfono antes de recibir cualquier mensaje de marketing. Funciona con todos los proveedores de SMS y está desactivado por defecto.
Activarlo
Configuración > Suscripciones > Doble opt-in por SMS:
- Pedir confirmación a los nuevos suscriptores de SMS - activado o desactivado para el espacio de trabajo.
- Nombre de la marca - sustituye
{{brand}}en los mensajes. Vacío = el nombre del espacio de trabajo. - Mensaje de confirmación - por defecto:
{{brand}}: Reply YES to receive texts. Msg & data rates may apply. Reply STOP to opt out.No se puede guardar si el mensaje no nombra la marca ({{brand}}o el nombre de la marca), no pide responder YES (u otra palabra de alta de la lista de palabras clave, como START, SI o כן) y no explica cómo darse de baja (STOP u otra palabra de baja). Como máximo 320 caracteres. - Responder al confirmar - activado por defecto:
{{brand}}: You're subscribed to texts. Msg & data rates may apply. Reply STOP to opt out.También debe nombrar la marca y la baja. - Caduca tras - días que una solicitud sigue abierta, de 1 a 30, 7 por defecto.
- Enviar un recordatorio - desactivado por defecto; si se activa, un recordatorio (el mismo mensaje de confirmación) tras las horas indicadas, antes de que la solicitud caduque.
Qué pasa con un nuevo suscriptor de SMS
Con el ajuste activado, un nuevo alta de SMS desde cualquier origen que no sea la confirmación del propio contacto - un formulario o landing page, la API, los SDK, una sincronización de tienda, una importación de contactos o una sincronización de almacén de datos - se guarda como Pendiente de confirmación (pending) en lugar de suscrito, y el contacto recibe un mensaje de confirmación:
- Se envía desde el número de SMS predeterminado del espacio de trabajo - el número del que el contacto recibiría mensajes - por la vía normal de SMS, como mensaje del sistema: no es una campaña, se cobra como cualquier SMS y aparece en los registros de SMS. Nunca se envía a un número que se dio de baja (STOP), y respeta las horas de silencio como un mensaje transaccional (decide el ajuste "excepción para transaccionales"); un mensaje que cae en una ventana de silencio espera a que termine.
- Una solicitud envía un mensaje (más el recordatorio opcional). Volver a pedirlo mientras el contacto sigue pendiente no envía otro.
- Un contacto pendiente de confirmación no recibe ningún SMS de campañas ni de journeys, en ningún modo de audiencia.
- La página del contacto muestra "Pendiente de confirmación" en la tarjeta de SMS, con cuándo se envió el mensaje y cuándo caduca la solicitud.
Confirmación, rechazo y caducidad
- YES (o cualquier palabra de alta de la lista compartida - START, YES, SI, SÍ, OUI, JA, ΝΑΙ, نعم, כן y las que añadas) desde el teléfono del contacto a tu número lo deja suscrito, con origen de alta
double_opt_in. Solo se confirman los contactos pendientes del espacio de trabajo al que pertenece el número que recibe el mensaje. Si "Responder al confirmar" está activado, reciben la respuesta una vez. Un YES de alguien que no está pendiente sigue las reglas habituales de START. - STOP mientras está pendiente lo deja dado de baja; no se envía nada más.
- Sin respuesta, la solicitud caduca tras los días indicados: el estado de SMS vuelve a quedar vacío (nunca "dado de baja" - nadie se dio de baja) y el historial muestra "Confirmación caducada". Una sincronización de tienda o de almacén de datos no vuelve a preguntar tras una caducidad; un nuevo alta por formulario, API o SDK sí.
Contactos dados de baja
Con el doble opt-in por SMS activado, volver a suscribir a un contacto dado de baja - por STOP o por cualquier otra baja de SMS, desde la API, el panel, el SDK o una importación con Anular bajas - se trata como un alta nueva: el contacto pasa a Pendiente de confirmación y recibe un mensaje de confirmación, y solo queda suscrito tras responder YES. Una segunda solicitud mientras está pendiente no envía nada. Si no responde, la solicitud caduca y vuelve a quedar dado de baja; no se envía nada más (ningún recordatorio). Un contacto que había enviado STOP sigue mostrando la advertencia habitual (en la respuesta de la API como sms_stop_provider_block, en la página del contacto y en el resumen de la importación): el proveedor de SMS puede bloquear el mensaje de confirmación hasta que envíe START, y si lo rechaza con su propio código de STOP (por ejemplo Twilio 21610, código 1 de Delivyr) el contacto vuelve a quedar dado de baja con la nota de historial "provider still blocks: re-opted out". Las importaciones sin la casilla de anulación y las sincronizaciones de tienda nunca vuelven a suscribir a un contacto dado de baja, así que nunca se le envía un mensaje.
Importaciones
La página de importación indica cuándo está activado el doble opt-in por SMS. Cada nuevo alta de SMS del archivo pasa a Pendiente de confirmación y recibe un mensaje de confirmación (en torno a un minuto después de la importación). Con Anular bajas, los contactos del archivo dados de baja de SMS se tratan igual: un mensaje, suscritos solo tras YES y de vuelta a dados de baja si no responden (ver arriba); sin ella siguen dados de baja y no reciben mensaje. Marca Ya confirmado (tengo prueba) solo si tienes prueba de que las personas del archivo ya confirmaron su alta de SMS; se guardan entonces como suscritas sin mensaje. Ambas casillas requieren el permiso de cumplimiento.
Cuentas de Delivyr
Delivyr tiene su propio doble opt-in. Cuando el número de SMS del espacio de trabajo está en una cuenta de Delivyr, Joryio no envía una segunda confirmación: los nuevos altas de SMS se registran como siempre, y Delivyr retiene cada mensaje a un número sin confirmar (motivo de fallo "Not confirmed yet") y pregunta ella misma al contacto hasta que responda YES allí. Un contacto que Delivyr informa como pendiente de confirmación se confirma en Joryio con su YES a través del webhook de Delivyr.
Grupos de suscripción por número (SMS y WhatsApp)
Una lista de suscripción vinculada a un remitente específico - es decir, que incluye un senderId - funciona como un grupo de suscripción por número. Para SMS, el grupo es por número; para WhatsApp, es por WABA (cuenta de WhatsApp Business). Así, un contacto puede darse de baja de los mensajes de un número o WABA y seguir suscrito a otros.
Alcance y almacenamiento de las bajas
- Las bajas se guardan por grupo. Cada grupo por número registra su propio estado de baja, independiente del consentimiento global del contacto para el canal y de otros números o WABA.
- Tanto las campañas como los recorridos respetan las bajas. Antes de enviar, el sistema comprueba el estado de baja del destinatario en el grupo del número o WABA remitente. Si el contacto se dio de baja de ese grupo, el envío se omite. En un recorrido, el contacto avanza al siguiente paso: se omite el mensaje, no el recorrido.
- Número predeterminado de SMS. Si envías desde el número predeterminado del espacio de trabajo, las bajas se aplican al grupo de ese número.
Alcance de STOP / START entrantes
Cuando un destinatario responde con una palabra clave, esta se aplica al número concreto (SMS) o WABA (WhatsApp) en el que recibió el mensaje:
STOP(y cualquier otra palabra clave de baja salvoSTOPALL) se aplica al grupo por número o por WABA: da de baja al contacto únicamente de los mensajes de ese número o WABA.STOPALLse aplica a todo el canal: da de baja al contacto de todos los números o WABA de ese canal.STARTvuelve a suscribir al contacto al grupo de ese mismo número o WABA.
Los espacios de trabajo son marcas distintas, así que un STOP da de baja al contacto de esa marca, no de toda la cuenta. Ese alcance viene de la URL de webhook entrante, que lleva un único espacio de trabajo.
Joryio no puede deducir la marca a partir del propio mensaje. Los remitentes se identifican por nombre (por ejemplo Acme), mientras que una respuesta llega a un número de teléfono: no hay nada que permita relacionarlos.
Por eso, cada respuesta y cada baja que llega a una URL entrante se registra en el espacio de trabajo de esa URL. Si una cuenta de proveedor da servicio a más de una marca, configura una URL entrante distinta por número en el portal del proveedor, o dale a cada marca su propia cuenta de proveedor. De lo contrario, un STOP destinado a la Marca B se registra en la Marca A, y la Marca B sigue enviando.
Palabras clave
El manejo de palabras clave entrantes de SMS se compone de tres capas: una base en inglés siempre activa, valores predeterminados localizados (activados por defecto) y tus propias adiciones personalizadas. Todas se combinan al buscar coincidencias.
Base en inglés (siempre activa, no se puede eliminar)
Son necesarias para cumplir la FCC y la CTIA, y no se pueden desactivar:
| Tipo | Palabras clave |
|---|---|
| Baja | STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT, OPT OUT, OPT-OUT |
| Alta | START, YES, UNSTOP, SUBSCRIBE, OPTIN |
| Ayuda | HELP, INFO |
REVOKE y OPTOUT forman parte de la base de palabras de baja (la norma de la FCC de abril de 2025 sobre revocación de consentimiento por SMS). Siempre se respetan; no tienes que añadirlas ni activarlas.
Valores predeterminados localizados (activados por defecto, acumulativos)
Las palabras habituales de baja, alta y ayuda en otros idiomas se reconocen de forma predeterminada, para que cada contacto pueda darse de baja en su idioma. Por ejemplo:
| Idioma | Baja | Alta | Ayuda |
|---|---|---|---|
| Hebreo | הסר, הסרה, עצור, ביטול, הפסק | התחל, הצטרף, כן | עזרה, מידע |
| Español | PARE, BASTA, CANCELAR, ALTO | SI, ALTA | AYUDA |
| Francés | ARRET, ARRÊT, DESABONNER | OUI | AIDE |
| Alemán | STOPP, ABBESTELLEN | JA | HILFE |
| Portugués | PARAR, SAIR |
Adiciones personalizadas (por organización)
En Configuración → SMS / Suscripciones puedes añadir tus propias palabras clave de baja, alta y ayuda (incluidas palabras de baja para todo el canal). La base y los valores localizados se muestran como solo lectura junto a la lista personalizada editable, por lo que solo gestionas tus adiciones. Las palabras clave de SMS se configuran a nivel de organización. Se aplican a todos los espacios de trabajo de la organización, así que cambiarlas requiere el permiso de nivel de empresa org_settings:write; los miembros de un espacio de trabajo sin él ven la lista en solo lectura.
| Tipo | Palabras clave |
|---|---|
| Baja | STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, OPTOUT, OPT-OUT |
| Alta | START, UNSTOP, SUBSCRIBE, YES, OPTIN, OPT-IN |
Solo STOPALL se aplica a todo el canal; las demás palabras de baja anteriores se aplican al grupo por número o WABA. Lo mismo ocurre con las palabras personalizadas de baja para todo el canal que configures para SMS: se comportan como STOPALL, mientras que las palabras de baja normales se limitan al número donde llegó el mensaje.
Cómo se toleran las variaciones menores en las coincidencias
La coincidencia de mensajes entrantes no distingue mayúsculas y tolera la puntuación y los espacios, conforme a las directrices de la CTIA de respetar las variaciones menores. Antes de buscar coincidencias, se normalizan tanto la primera palabra como el cuerpo completo del mensaje: se eliminan la puntuación y los espacios de los extremos, y las letras ASCII se pasan a mayúsculas. Por tanto, Stop, STOP!, " stop " y STOP. cuentan como STOP.
La normalización es segura para caracteres no ASCII: el hebreo, el árabe y otros sistemas de escritura no tienen mayúsculas ni minúsculas, así que se conservan sin cambios (הסר sigue siendo הסר); solo se recortan la puntuación y los espacios externos.
Volver a suscribirse tras una baja
La forma de volver depende de cómo se dio de baja el contacto:
- Envió STOP (u otra palabra de baja). El contacto puede enviar
START(u otra palabra de alta) desde ese mismo teléfono, lo que levanta la baja para el número. También puedes volver a suscribir explícitamente solo a ese contacto - mediante la API, un SDK, la página del contacto, su propia página de preferencias o formularios, o una importación con "Override unsubscribes" marcado; consulta Contactos que comparten un email o un teléfono. En SMS, el proveedor (p. ej. Twilio) suele mantener su propio bloqueo sobre el número, que ninguna API levanta: hasta que el contacto envíeSTART, el proveedor puede seguir rechazando tus mensajes. - Un consentimiento de la tienda. Solo en los casos de Consentimiento de marketing de las tiendas, por ejemplo un cliente con sesión iniciada que marca la casilla de marketing en el checkout tras darse de baja con un enlace.
- Se dio de baja en una página alojada o centro de preferencias → puede volver a darse de alta en el sitio. Un contacto que se dio de baja mediante un enlace o centro de preferencias (no enviando un mensaje) puede suscribirse de la misma forma, por ejemplo con
{{ resubscribe_url }}o reactivando SMS en el centro de preferencias.
Precedencia y mecanismo seguro
- La baja global del canal prevalece sobre los grupos. Una baja global de canal - por ejemplo, todo el canal SMS o WhatsApp del contacto con el estado
unsubscribed- es un bloqueo definitivo que prevalece sobre cualquier suscripción de grupo. Si el canal está dado de baja globalmente, ningún grupo por número puede volver a habilitar envíos a ese contacto. - Alternativa segura para todo el canal. Si no se puede resolver el grupo por número o WABA, el sistema adopta una alternativa segura y aplica la baja a todo el canal, en lugar de arriesgarse a seguir enviando mensajes a quien intentó darse de baja.
Seguridad de mensajes entrantes
- Los webhooks entrantes se verifican mediante firma; los mensajes
STOPoSTARTfalsificados se rechazan. - Los proveedores que no admiten la verificación de firma entrante se rechazan para palabras clave entrantes.
Un número de envío - un número de SMS, un número de WhatsApp o un remitente de Viber - solo puede conectarse a un espacio de trabajo en tu organización. Otras organizaciones nunca afectan a tus números: un mensaje entrante solo se compara con los números de la organización cuya cuenta de proveedor lo recibió, y los números de WhatsApp se confirman con Meta al conectarlos. Conectar un número que ya está conectado en otro lugar se rechaza; desconéctalo allí primero. Los STOP, START, HELP y las respuestas entrantes se aplican en el espacio de trabajo al que pertenece el número, y un mensaje entregado para otro espacio de trabajo se rechaza en lugar de adivinar. Los nombres de remitente alfanuméricos no pueden recibir respuestas, así que no tienen esta limitación.
Los números de SMS en una cuenta de Twilio o Vonage se confirman de la misma forma: el proveedor debe listar el número en la cuenta conectada, o el número no se conecta. Los números de otros proveedores no se pueden confirmar y se marcan como No verificable - la regla de un solo espacio de trabajo indicada arriba sigue aplicándose.
Las bajas por teléfono siguen al número dentro de un espacio de trabajo, igual que las bajas de email siguen a la dirección: un contacto duplicado con el mismo número en ese espacio de trabajo también queda bloqueado, y un START levanta el bloqueo solo en su propio espacio de trabajo.
Un grupo por número solo funciona con un remitente que pueda recibir respuestas. Un número de teléfono es bidireccional: los destinatarios pueden responder y STOP funciona. Un nombre de remitente alfanumérico es unidireccional: los destinatarios no pueden responder, por lo que las palabras clave STOP o de baja no funcionarán. La disponibilidad de remitentes alfanuméricos depende de la configuración de tu proveedor de SMS.
Alcance del enlace de baja en nodos de recorrido de SMS y Viber
Un paso de mensaje de SMS o Viber en un recorrido incluye un enlace de baja cuyo alcance puedes elegir en cada nodo. El remitente de «De» define la lista de suscripción, de modo que, por defecto, el enlace de baja (y un STOP entrante) elimina al contacto únicamente de la lista de ese remitente; seguirá pudiendo recibir mensajes de tus otros remitentes.
En los nodos de mensaje de SMS y Viber, el control «El enlace de baja elimina de:» ofrece:
| Opción | Comportamiento |
|---|---|
| Lista de este remitente (predeterminada) | El enlace de baja da de baja al contacto únicamente de la lista del número o remitente que envía, igual que el alcance de un STOP enviado por mensaje. |
| Todos los SMS / Todo Viber (global) | El enlace de baja da de baja al contacto de todo el canal, equivalente a STOPALL. |
La opción predeterminada (lista del remitente) es la más precisa y predecible, y mantiene el enlace de baja coherente con el alcance de STOP entrante. Amplíala al ámbito global solo cuando un nodo represente realmente una baja de todo el canal. Refleja el alcance de List-Unsubscribe del email (global frente a list): el mismo modelo global frente a lista, aplicado por nodo a SMS y Viber.
Las bajas de email siguen a la dirección (contactos duplicados)
La misma dirección de email puede pertenecer legítimamente a más de un contacto en un espacio de trabajo; por ejemplo, si una persona se importó dos veces o se creó desde fuentes distintas. Las bajas de email y los rebotes duros se registran para la dirección de email (dentro del espacio de trabajo), no solo para el registro de contacto que recibió el mensaje. Esto coincide con el tratamiento del consentimiento de email en plataformas de engagement maduras y garantiza que se respete la baja de la persona, aunque un registro duplicado aún parezca suscrito.
Qué implica
- La baja cubre todos los duplicados. Cuando alguien se da de baja - desde tu enlace de baja, el encabezado List-Unsubscribe de un clic, una página de preferencias o una queja de spam - se suprimen todos los contactos de ese espacio de trabajo con el mismo email, no solo el que recibió el envío.
- Global frente a lista. Una baja global suprime la dirección en todo el canal (todas las campañas y recorridos). Una baja de lista o tema suprime la dirección únicamente para esa lista; la persona seguirá pudiendo recibir comunicaciones de otras listas.
- Los rebotes duros también siguen a la dirección. Un rebote duro suprime la dirección en todo el espacio de trabajo, de modo que un contacto duplicado no puede seguir enviando a un buzón muerto. No lo levanta una nueva suscripción, la API ni una importación; solo el soporte de Joryio (o un cambio real de email). Consulta Contactos que comparten un email o un teléfono.
- Limitado al espacio de trabajo. La supresión se vincula al espacio de trabajo que envió a la dirección. Una baja en un espacio no silencia esa dirección en otro espacio de trabajo de la misma cuenta.
- Excepción transaccional. Un envío configurado para llegar a todos los contactos (la preferencia transaccional/
all) sigue omitiendo las bajas de consentimiento, pero nunca se envía a una dirección con rebote duro: no tiene sentido enviar a un buzón inexistente. - Las quejas de spam también detienen el correo transaccional. Cuando alguien marca tu email como spam, la dirección deja de recibir email de marketing y transaccional (recibos, restablecimiento de contraseña) en ese espacio de trabajo - salvo que el soporte de Joryio haya habilitado el envío transaccional para tu organización; en ese caso las quejas solo detienen el marketing. Si lo quieres, envía el correo transaccional desde un subdominio de envío separado y contacta con soporte. Una baja nunca detiene el correo transaccional; un rebote duro siempre lo hace.
Tanto las campañas como los recorridos lo comprueban en el momento del envío, por lo que un contacto duplicado creado después de la baja también queda suprimido.
Contactos que comparten un email o un teléfono
Dos o más contactos de un mismo espacio de trabajo pueden compartir una dirección de email o un número de teléfono: una persona importada dos veces, o dos personas que de verdad comparten un buzón o un teléfono (por ejemplo, una pareja que usa un email familiar). Joryio les aplica estas reglas:
- Una baja llega a todos los contactos con ese email o teléfono. Sea cual sea el origen - un enlace de baja, la cabecera de un clic, la página de preferencias, un cambio en la página del contacto, la API, un SDK, una importación, una respuesta
STOPo una queja de spam - todos los contactos del espacio de trabajo con el mismo email (para email) o teléfono (para SMS, WhatsApp y Viber) también se dan de baja. Se actualiza su propio estado de suscripción (o, en una baja de lista, su pertenencia a la lista), y cada uno recibe una entrada de historial: baja a través de otro contacto con el mismo email (o teléfono). - El bloqueo se mantiene para los contactos creados después. La baja queda registrada en la dirección o el número, así que un contacto creado más tarde con el mismo email o teléfono también queda bloqueado.
- Una nueva suscripción se aplica solo al contacto en el que se hizo. Si una de las personas se vuelve a suscribir, solo ese contacto vuelve a ser alcanzable; los demás siguen dados de baja, porque pueden ser personas distintas. Ese contacto conserva su propia suscripción hasta que cualquier contacto de la dirección o el número se dé de baja otra vez; entonces todos vuelven a quedar bloqueados.
- Guardar la página de preferencias sin cambios no cambia nada. Solo se aplica un interruptor que la persona cambió de verdad, y solo a ese contacto.
- Una respuesta
STOPse puede anular para un contacto. Una baja de SMS, WhatsApp o Viber que vino de una palabraSTOP(de cualquier proveedor, incluido Delivyr) puede volver a suscribirse mediante la API (una actualización de suscripción normal - sin flag adicional), un SDK, la página del contacto, la propia página de preferencias o formularios de la persona, y una importación solo con "Override unsubscribes" marcado. Se aplica solo a ese contacto - los demás contactos del número siguen bloqueados - y una respuestaSTARTsigue levantándola para el número como antes. El historial del contacto registra que el cambio anuló unSTOPy quién lo hizo (la clave de API, el trabajo de importación, el miembro del equipo o la página de preferencias). - Solo SMS: el proveedor puede seguir bloqueando. Volver a suscribir a un contacto de SMS que envió
STOPmuestra un aviso dondequiera que ocurra (en la página del contacto antes de guardar, en la página de importación y su resumen, y en la respuesta de la API): This contact opted out by texting STOP. Your SMS provider may keep blocking messages until they text START. WhatsApp y Viber no llevan ese aviso. - Cuando el proveedor de SMS sigue bloqueando. Un envío que el proveedor de SMS rechaza por su propio bloqueo
STOP(por ejemplo el error 21610 de Twilio o un rechazo opted-out de Delivyr) se muestra como bloqueado por el proveedor (dado de baja), no como un fallo, y no cuenta para las alertas de tasa de rebote o de fallos. La baja se vuelve a aplicar y el historial del contacto dice provider still blocks: re-opted out. - Los rebotes duros y las quejas de spam solo los levanta el soporte de Joryio. Una nueva suscripción, la API o una importación nunca los eliminan. Contacta con soporte cuando se confirme que una dirección vuelve a funcionar.
- Un espacio de trabajo cada vez. Todo esto ocurre dentro del espacio de trabajo donde se hizo la baja; tus otros espacios de trabajo y marcas nunca se ven afectados.
- Los journeys siguen las mismas reglas que las campañas. Una baja de una lista de email sigue a la dirección también en los journeys: un paso de email de un journey que usa una lista de suscripción omite a todos los contactos cuya dirección abandonó esa lista.
La tarjeta de suscripciones de la página del contacto muestra cuándo un contacto está bloqueado por otro contacto con el mismo email o teléfono, el motivo (baja, STOP, rebote duro o queja de spam), y cuándo el contacto tiene su propia suscripción mientras los demás contactos siguen bloqueados. Si ningún otro contacto del espacio de trabajo tiene la dirección, la tarjeta solo indica que el contacto se volvió a suscribir después de que ese email o número de teléfono se diera de baja.
Consentimiento de marketing de las tiendas (Shopify, WooCommerce, Magento, PrestaShop)
Un pedido o checkout de la tienda nunca reemplaza el teléfono que ya tiene un contacto (solo rellena uno vacío) - solo lo hacen los datos de la cuenta del cliente en la tienda y, en Magento, un pedido de un cliente con sesión iniciada. Un consentimiento de SMS dado con otro número no suscribe el número del contacto. Consulta cómo los datos de la tienda actualizan un contacto en Shopify, WooCommerce y Magento.
El consentimiento de marketing que envía una tienda sigue las reglas anteriores, y además estas, iguales para todas las tiendas (la newsletter de PrestaShop tiene sus propios límites; consulta Newsletter de PrestaShop):
| Qué envía la tienda | Qué hace Joryio |
|---|---|
| Una casilla de consentimiento marcada en un checkout de invitado | Suscribe a un contacto que aún no tiene suscripción en ese canal. Salvo que el ajuste de la tienda de abajo esté activado, nunca vuelve a suscribir a quien se dio de baja: en un checkout de invitado cualquiera puede escribir el email de cualquiera. |
| Un consentimiento de un cliente con sesión iniciada (WooCommerce: un pedido hecho con la sesión iniciada, plugin 1.6.1 o posterior; Magento: un pedido de un cliente con sesión iniciada), con fecha posterior a la última baja del contacto | También vuelve a suscribir a un contacto que se dio de baja con un enlace de baja o el botón de baja en un clic, la página de preferencias, la API, un miembro del equipo o la baja en esta misma tienda. |
| Cualquier consentimiento de Shopify (ajuste desactivado) | Se trata como una casilla de invitado. Shopify asocia un checkout de invitado al cliente existente con ese email y no indica si el comprador había iniciado sesión, así que un consentimiento de Shopify nunca vuelve a suscribir a quien se dio de baja. |
| Un consentimiento en el checkout o en el registro del cliente, con el ajuste de la tienda Permitir que las suscripciones en el pago vuelvan a suscribir a quien se dio de baja activado (desactivado por defecto; Shopify, WooCommerce, Magento y PrestaShop) | Vuelve a suscribir a un contacto que se dio de baja - también después de un checkout de invitado - cuando la hora del consentimiento en la tienda es posterior a su última baja. El riesgo: un checkout de invitado no puede demostrar quién es el comprador, así que alguien que escriba el email de otra persona podría volver a suscribirla; siempre puede volver a darse de baja con un clic. |
| Una casilla sin marcar | Ningún cambio: nunca es una baja. |
| Una baja en la tienda | Da de baja, salvo que Joryio haya registrado un cambio posterior para ese contacto. |
| Lo que ningún consentimiento de la tienda deshace, con el ajuste activado o no | Una queja de spam, un rebote duro, un bloqueo de toda la organización, otro espacio de trabajo, una baja registrada en otro contacto con el mismo email o teléfono, y un STOP de SMS. |
- El ajuste es por conexión de tienda, en Configuración → Integraciones → <tienda>, desactivado por defecto; solo los administradores pueden cambiarlo, y cada cambio queda en el registro de auditoría. Con el doble opt-in de una lista de email o el doble opt-in por SMS activado, primero se envía la confirmación y el contacto queda pendiente hasta que confirme.
- Una nueva suscripción se aplica solo a ese contacto; los demás contactos con el mismo email o teléfono siguen dados de baja. El historial del contacto dice por qué, por ejemplo se volvió a suscribir en el checkout de la tienda (cliente con sesión iniciada) tras darse de baja desde la página de preferencias.
- SMS: con el doble opt-in de SMS activado, una nueva suscripción envía un único mensaje "Responde YES" y el contacto queda pendiente hasta que responda. Un contacto que envió
STOPsolo vuelve por esta vía: con el doble opt-in de SMS desactivado, un consentimiento de la tienda nunca lo vuelve a suscribir. - El consentimiento de la tienda suscribe al canal, no a una lista: una lista que exige doble opt-in sigue enviando su email de confirmación cuando la persona se une a ella.
Newsletter de PrestaShop
En PrestaShop el consentimiento es la suscripción del cliente a la newsletter, solo para email. Consulta también PrestaShop: Consentimiento de marketing.
- El registro del cliente. El indicador
newslettersuscribe al contacto al email, con la fechanewsletter_date_addde PrestaShop. Darse de baja en la tienda (la página de cuenta o el back office) es una baja explícita de la tienda y da de baja al contacto, salvo que Joryio haya registrado un cambio posterior para ese contacto. Un cambio guardado en el cliente desde la tienda por alguien que no ha iniciado sesión como ese cliente puede dar de baja, pero nunca suscribe. - El bloque de newsletter (ps_emailsubscription) es un formulario anónimo: cualquiera puede escribir cualquier email. Una suscripción desde el bloque cuenta como consentimiento solo para el titular registrado con la sesión iniciada de ese email, o tras la confirmación por email de PrestaShop cuando la tienda tiene activados los emails de verificación; cualquier otra suscripción desde el bloque no se aplica. Una baja desde el bloque se aplica por dirección de email.
- La sincronización inicial importa a los suscriptores solo como altas: nunca da de baja a nadie y nunca vuelve a suscribir a un contacto que se dio de baja.
- Después de una baja, una suscripción a la newsletter de PrestaShop no vuelve a suscribir al contacto: la regla del cliente con sesión iniciada de arriba no se aplica a PrestaShop. La única excepción es la casilla de newsletter marcada cuando un checkout de invitado crea la cuenta de invitado del comprador, con el ajuste Permitir que las suscripciones en el pago vuelvan a suscribir a quien se dio de baja activado.
- Las ofertas de socios (
optin) no son consentimiento de marketing y se ignoran.
Detalles por tienda: Shopify, WooCommerce, Magento, PrestaShop.
La baja es por canal
El consentimiento se da por canal, así que una baja afecta solo al canal del que vino.
- Enlace de baja del email y encabezado de un clic. La persona deja de recibir email (y, cuando la campaña tiene un tema de suscripción, también sale de ese tema en email). Sus suscripciones de SMS, WhatsApp, push y Viber no cambian. La página le dice: "Te has dado de baja de los emails. Seguirás recibiendo los mensajes de SMS/WhatsApp a los que te suscribiste."
- Darse de baja de todos los canales. Después, la página ofrece un botón explícito Darse de baja de todos los canales. Solo este botón da de baja de todos los canales y temas; se registra como baja con scope
global, atribuida a la misma campaña y variante. - SMS, WhatsApp y Viber.
STOPy el enlace de baja afectan solo a ese canal (o solo a la lista del remitente);STOPALLse amplía a todos los números de ese canal, nunca a otros canales. - Enlaces enviados antes del 2026-10-04. Los enlaces de baja que ya están en los buzones siguen haciendo lo que hacían cuando se enviaron: el enlace de un email anterior sigue dando de baja de todo.
- Página de preferencias. Sigue siendo por canal y por tema.
Base legal. El consentimiento se recoge por canal, y una baja lo retira para ese canal: a partir de entonces, nada de marketing por ese canal. Los demás canales solo se pueden usar si la persona está suscrita a ellos.
Encabezado List-Unsubscribe (RFC 8058)
Descripción general
RFC 8058 define una forma estándar para que los clientes de email ofrezcan una baja con un clic. Joryio añade estos encabezados automáticamente a los emails salientes.
Activado por defecto. El encabezado está activado en todos los espacios de trabajo, también en uno que nunca guardó su Configuración de suscripciones - todo email de marketing (campañas y journeys) lo lleva. Solo se elimina al desactivar el interruptor List-Unsubscribe en la Configuración de suscripciones, o cuando una campaña transaccional define su propia anulación Sin baja - solo transaccional. Gmail y Yahoo exigen la baja con un clic a los remitentes masivos, así que déjalo activado en el email de marketing.
Encabezados añadidos
List-Unsubscribe: <https://api-eu1.joryio.com/api/u/{token}>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
Configuración
Se guarda en la configuración del espacio de trabajo (un objeto listUnsubscribe ausente, o sin enabled, significa activado; solo enabled: false lo desactiva):
subscriptionSettings: {
listUnsubscribe: {
enabled: true,
includeMailto: true, // Incluye un enlace mailto: (recomendado para Gmail)
scope: 'global' // 'global' o 'list'
}
}
Opciones de alcance
| Alcance | Comportamiento |
|---|---|
global | La baja con un clic elimina al usuario de todas las comunicaciones por email |
list | Solo da de baja de la lista específica desde la que se envió el email |
Control a nivel de campaña
En una campaña de email, el paso Redactar del editor incluye un único selector de Baja que controla tanto si aparece el enlace o encabezado de baja con un clic como de qué elimina a las personas:
- Baja global (predeterminada): se incluye el encabezado y la baja con un clic elimina al destinatario de todos los emails (una baja para todo el espacio de trabajo). Es la opción habitual para email de marketing.
- Darse de baja de:
<tema>(solo se muestra cuando el espacio de trabajo tiene listas de suscripción): se incluye el encabezado y la baja elimina al destinatario únicamente de ese tema, sin afectar a los demás. Al elegir un tema, el envío también omite a quienes ya se dieron de baja de él. - Sin baja: solo transaccional: elimina por completo el encabezado List-Unsubscribe de este envío (recibos, restablecimientos de contraseña, códigos de un solo uso), que están exentos de los requisitos de baja.
Segmentación frente al alcance de baja. Este control solo afecta al enlace o encabezado de baja. No filtra destinatarios. Para enviar solo a los suscriptores de un tema, añade un filtro «miembro de la lista» en el paso Audiencia. Ese filtro ya excluye a quien se dio de baja de la lista y se evalúa al enviar.
SMS y WhatsApp no tienen un encabezado RFC 8058, por lo que su paso Redactar muestra en su lugar un selector de tema de baja (global o un tema específico) con el mismo significado de alcance. No existe una opción de «sin baja» porque siempre se respeta una baja mediante STOP.
Al enviar, la selección de la campaña se combina con la política del espacio de trabajo. La estructura guardada es:
campaign.channelConfig = {
// Omite listUnsubscribe por completo para heredar la política del espacio de trabajo (= Global)
listUnsubscribe: {
enabled: false, // «Sin baja»: suprime el encabezado en esta campaña
},
};
// El alcance de tema se guarda por separado como subscriptionCategoryId de la campaña.
Cumplimiento: elige «Sin baja» solo para mensajes genuinamente transaccionales o relacionales. Los emails masivos y de marketing requieren un encabezado List-Unsubscribe (normas para remitentes masivos de Gmail y Yahoo).
Página de preferencias alojada y baja
Cada mensaje lleva un enlace a la página alojada: el enlace de baja (/u/:token) y el enlace de gestión de preferencias (/preferences/:token). Esta sección explica qué ve allí el destinatario.
Qué canales aparecen
La página muestra solo los canales que tienen sentido para esta persona:
- el canal está configurado en tu espacio de trabajo (tiene un proveedor o remitente configurado), y
- la persona es alcanzable en él: una dirección de email para Email; un número de teléfono para SMS, WhatsApp y Viber; al menos un dispositivo push activo o una suscripción web push para Push.
Un canal al que la persona está suscrita ahora se muestra siempre, aunque no sea alcanzable de otro modo, para que siempre pueda salir de él. Las filas de listas siguen la misma regla. Viber aparece con su propia etiqueta como cualquier otro canal.
Enlace de baja: un clic en la página, y Deshacer
Abrir el enlace de baja no cambia nada por sí solo. La página pregunta primero:
- Dice qué dejará de llegar y de quién - por ejemplo "Dejarás de recibir emails de Acme." - y la dirección a la que se envió el mensaje.
- La persona pulsa Darse de baja. Solo un clic real o una pulsación de tecla en ese botón envía la baja: la página nunca da de baja por sí sola, por mucho tiempo que esté abierta. Justo encima del botón se puede elegir un motivo opcional.
- Cambiar preferencias en su lugar abre los controles completos de canales y listas en vez de dar de baja.
El centro de preferencias hace la misma pregunta. Su botón de baja no da de baja por sí solo: abre esta pregunta, con el motivo opcional, y solo Darse de baja ahí envía la baja. El motivo se pide solo en esta pregunta - guardar preferencias, desactivar un canal o una lista y volver a suscribirse nunca piden ni envían un motivo.
El alcance del enlace no cambia: el canal por el que llegó el mensaje, o una lista; un enlace antiguo, anterior a los enlaces por canal, sigue dando de baja de todo.
Tras la baja, la parte superior de la página dice Te has dado de baja y qué se quitó, y ofrece:
- Deshacer - visible durante 10 minutos. Vuelve a suscribir exactamente lo que se acaba de quitar, por la misma vía auditada que un guardado de preferencias (se registra como
undo_unsubscribe), y reactiva el enlace. - Gestionar preferencias - muestra debajo los controles de canales y listas.
El resultado de cada acción (baja, baja de todo, guardar, volver a suscribirse) aparece en la parte superior de la página y la página se desplaza hasta él. También funciona en una página con diseño personalizado (la pregunta y los controles se colocan en tu hueco {{ preferences_form }}) y en modo redirección (la persona pulsa primero Darse de baja, y la baja se registra antes de enviarla a tu URL).
Del 2026-10-11 al 2026-10-15 la página daba de baja por sí sola cuando llevaba visible alrededor de un segundo. Ya no lo hace - consulta la sección siguiente.
Por qué la página pide un clic
Por qué importa. Muchas empresas usan seguridad de correo corporativa que abre cada enlace de un mensaje ("safe links" o escaneo de enlaces) antes de que la persona lo lea. Algunos de estos escáneres abren los enlaces en un navegador real, que para un servidor parece exactamente una persona. Una página que daba de baja por sí sola al abrirse daba de baja, por tanto, a personas que nunca lo pidieron - en un caso 48 segundos después del envío, justo después de que el escáner pulsara todos los enlaces del email.
Qué hace Joryio.
- Abrir el enlace no cambia nada. Una persona tiene que pulsar Darse de baja en la página.
- El botón solo actúa con un clic real o una pulsación de tecla. Un script que se ejecute en la página no puede pulsarlo por la persona.
- Deshacer se ofrece durante 10 minutos, para que quien se dio de baja por error pueda volver con un clic.
- Una baja que aun así parece automática (ocurrió segundos después del envío, o el tráfico parece de un escáner) se registra, pero se marca Posiblemente automática en el historial de suscripciones del contacto, para que la revises.
El botón de baja de la app de correo sigue siendo de un clic. Gmail, Yahoo y Apple Mail muestran su propio botón Unsubscribe con el estándar de un clic (RFC 8058, el encabezado List-Unsubscribe-Post). Es obligatorio para remitentes masivos, lo envía el proveedor del buzón solo cuando la persona pulsa ese botón y los escáneres de enlaces no lo activan. Funciona exactamente igual que antes (consulta Encabezado List-Unsubscribe). Usa una dirección distinta del botón de la página, así que ambos se registran por separado.
Dónde aparecen los motivos de baja
La pregunta de si darse de baja (en el enlace de baja, y tras el botón de baja del centro de preferencias) ofrece un motivo de baja opcional. El motivo, y la marca Posiblemente automática, aparecen en tres lugares:
- Perfil del contacto - la tarjeta Historial de suscripciones muestra el motivo en cada baja y una etiqueta Posiblemente automática en las marcadas.
- Analítica de campaña - una tarjeta Bajas por motivo junto al recuento de bajas: una fila por persona según su último motivo, los motivos principales más "Otros", y "Sin motivo". Las bajas registradas antes de octubre de 2026 no tienen motivo en la analítica y cuentan como "Sin motivo".
- Settings > Subscriptions > Unsubscribe reasons - la lista del espacio de trabajo con las bajas recientes que tienen motivo o marca: cuándo, contacto (los datos personales se enmascaran para miembros sin el permiso
pii:view), canal o lista, motivo y campaña, con un filtro Solo posiblemente automáticas.
Cómo se produjo cada baja. Desde el 2026-10-15 cada baja registra también cómo llegó - el botón de baja de la app de correo, el botón Darse de baja de la página, el centro de preferencias, la baja de todo, la API, un miembro del equipo en el panel, el SDK, una importación, una respuesta STOP, una queja de spam, la baja a través del proveedor de email o una sincronización de tienda - además del navegador (solo navegador y sistema operativo, nunca la cadena completa ni la dirección IP) y cuánto tiempo después del envío ocurrió. El Historial de suscripciones del contacto lo muestra en cada baja como Cómo. Las bajas que la página hizo sin clic entre el 2026-10-11 y el 2026-10-15 aparecen como "Página de baja abierta, sin clic".
Preguntas frecuentes: bajas automáticas
¿Puede un escáner de enlaces dar de baja a mis contactos? Desde la página no: abrir el enlace no cambia nada, y la página solo da de baja cuando una persona pulsa Darse de baja con un clic real o una pulsación de tecla. Las bajas que la página hizo por sí sola entre el 2026-10-11 y el 2026-10-15 aparecen como "Página de baja abierta, sin clic" en el historial de suscripciones del contacto.
Veo una ola repentina de bajas. ¿Qué hago? Abre Settings > Subscriptions > Unsubscribe reasons, activa Solo posiblemente automáticas y revisa las entradas marcadas y su campaña. Vuelve a suscribir a una persona solo con su propio consentimiento (por ejemplo, te dice que fue un error o se suscribe de nuevo). Nunca vuelvas a suscribir a personas de forma masiva: una baja es una retirada del consentimiento hasta que la persona diga lo contrario.
¿Cambia esto el botón Unsubscribe de Gmail, Yahoo o Apple Mail? No. Ese botón de un clic es un mecanismo estándar independiente y no ha cambiado.
Una persona vuelve a abrir el mismo enlace de baja. ¿Qué pasa? El enlace sigue funcionando hasta que caduca. Si la persona sigue dada de baja, la página lo confirma y no se registra nada de nuevo, así que nada se cuenta dos veces. Si se volvió a suscribir mientras tanto (por ejemplo en el centro de preferencias), el enlace la da de baja otra vez: pulsar darse de baja siempre funciona, con la misma protección frente a escáneres que la primera vez.
Página de preferencias (diseño personalizado)
De forma predeterminada, los destinatarios que hacen clic en un enlace de baja o «gestionar preferencias» ven el centro de preferencias integrado de Joryio. Puedes sustituirlo por tu propia página de marca.
Ubicación: Configuración → Suscripciones → Página de preferencias.
La página es por espacio de trabajo y cuenta con tres modos:
- Predeterminado integrado: el centro de preferencias estándar de Joryio (controles de canal y lista). Siempre funciona y no requiere configuración.
- HTML personalizado: un editor HTML/Liquid completo con vista previa en vivo (renderizada con datos de ejemplo). Se explica más abajo.
- Redirigir a URL: omite nuestra página y envía al destinatario a la tuya. En el enlace de baja, primero registramos la baja y después redirigimos a tu URL con
?email=…&status=unsubscribed; el enlace de gestionar preferencias redirige con un?token=…que tu página puede utilizar para leer y escribir preferencias mediante la API pública. El cumplimiento se mantiene en ambos casos.
Cómo funciona
- Creas el cuerpo de la página en HTML. Puede usar Liquid: personalización (
{{ firstName }},{{ email }}), bloques de contenido ({{ blocks.<slug> }}) y las etiquetas de URL de suscripción que aparecen abajo. - Coloca la etiqueta
{{ preferences_form }}donde deban aparecer los controles funcionales de suscripción (interruptores de canal y lista, Guardar, Darse de baja de todo). Joryio inserta el formulario funcional en ese lugar. - Si omites la etiqueta, los controles se añaden automáticamente al final, de modo que el destinatario siempre puede darse de baja (el editor te avisa si falta la etiqueta).
- La página se renderiza del lado del servidor para cada destinatario (para que las URL de baja y la personalización sean reales) y luego se sanea antes de llegar al navegador: se conservan el diseño, las imágenes, los estilos en línea y un bloque
<style>con alcance; se eliminan scripts, controladores de eventos, iframes, elementos<form>y CSS que puede ejecutar scripts.
Etiquetas disponibles
| Etiqueta | Descripción |
|---|---|
{{ preferences_form }} | Los controles funcionales de suscripción (colócala una vez) |
{{ unsubscribe_url }} | Baja global |
{{ preferences_url }} | Enlace de vuelta a esta página |
{{ resubscribe_url }} | Enlace para volver a suscribirse |
{{ firstName }} / {{ email }} | Personalización del destinatario |
{{ blocks.<slug> }} | Un bloque de contenido reutilizable |
Notas
- Se acepta el marcado de página completa (
<html>/<head>/<body>). Como la página es una pantalla independiente, se renderizan el contenido y los estilos de su cuerpo. - La misma página sirve tanto para la baja con un clic (
/u/:token) como para los enlaces de gestionar preferencias (/preferences/:token). - La página predeterminada integrada también ofrece una acción de «volver a suscribirse a todo». Un
{{ resubscribe_url }}(que añade?action=resubscribe) vuelve a suscribir al abrirse. El «motivo de baja» opcional (registrado en el log de auditoría y el eventomessage.unsubscribed) se pide solo en la pregunta de baja, nunca junto a Guardar ni a «volver a suscribirse a todo».
Gestión de rebotes
Tipos de rebote
| Tipo | Descripción | Acción |
|---|---|---|
| Rebote suave | Fallo temporal de entrega (buzón lleno, servidor caído) | Se cuenta dentro de una ventana; se convierte en rebote duro si hay demasiados |
| Rebote duro | Fallo permanente de entrega (dirección inválida, dominio inexistente) | Marca el email como inválido (suprimido de los envíos) |
Un rebote duro marca la dirección como inválida y deja de enviarle, pero no da de baja al contacto: nunca solicitó dejar de recibir comunicaciones, así que su consentimiento se conserva (al borrar el rebote, por ejemplo al cambiar el email, se le puede volver a enviar). La supresión sigue a la dirección de email en todos los contactos duplicados del espacio de trabajo (consulta Las bajas de email siguen a la dirección), por lo que tampoco se envía a un segundo contacto con el mismo buzón inexistente. Un rebote suave se tolera hasta softBounceMaxRetries veces dentro de softBounceRetryHours; después se trata como rebote duro.
Configuración
subscriptionSettings: {
bounceHandling: {
softBounceRetryHours: 24, // Ventana en la que se cuentan los rebotes suaves
softBounceMaxRetries: 5, // Rebotes suaves en la ventana antes de convertirlos en rebote duro
resubscribeOnEmailChange: true // Borra la marca de inválido al cambiar el email
}
}
Integración de webhooks
Joryio procesa automáticamente los webhooks de rebote de:
- Amazon SES: notificaciones de SNS
- SendGrid: webhooks de eventos
- Mailgun: webhooks
Los webhooks de rebote y eventos del proveedor se configuran con tu proveedor de email durante la incorporación; después, los eventos llegan automáticamente.
Eliminación manual de rebotes
Los administradores pueden borrar el estado de rebote desde la interfaz o la API:
await subscriptionsApi.clearBounceStatus(userId, 'Email confirmed valid by user');
Borrar un rebote desde el panel o la API borra solo un rebote suave. Un rebote duro o una queja de spam solo los levanta el soporte de Joryio; consulta Contactos que comparten un email o un teléfono.
Si el correo a direcciones @privaterelay.appleid.com o @private.icloud.com rebotó porque tu dominio de envío no estaba registrado en Apple, esas direcciones pueden haberse marcado como no válidas. Corrige primero el registro y después elimina los rebotes. Consulta Apple Private Email Relay.
Variables de plantilla Liquid
Variables disponibles
Úsalas en tus plantillas de email:
| Variable | Descripción |
|---|---|
{{ unsubscribe_url }} | URL de baja global |
{{ unsubscribe_url_list }} | URL de baja específica de la lista |
{{ preferences_url }} | URL del centro de preferencias |
{{ resubscribe_url }} | URL para volver a suscribirse (para campañas de reactivación) |
Ejemplo de uso
<p>¿No quieres recibir estos emails?</p>
<p>
<a href="{{ unsubscribe_url_list }}">Darse de baja de esta lista</a>
o
<a href="{{ preferences_url }}">Gestionar tus preferencias</a>
</p>
Filtros de segmento
Tipos de filtro
Tres tipos de filtro para la segmentación:
Filtro de suscripción de canal
Segmenta usuarios según el estado de suscripción al canal:
{
type: 'channel_subscription',
operator: 'subscribed_to_channel', // o 'not_subscribed_to_channel'
channel: 'email',
subscriptionStatus: 'opted_in' // opcional: estado específico
}
Filtro de pertenencia a lista
Segmenta usuarios según su pertenencia a una lista:
{
type: 'list_membership',
operator: 'member_of_list', // o 'not_member_of_list'
listId: 'list-uuid',
channel: 'email' // opcional: canal específico
}
Filtro de estado de rebote
Segmenta usuarios según la validez de su email:
{
type: 'bounce_status',
operator: 'email_valid' // 'email_valid', 'email_bounced',
// 'email_hard_bounced', 'email_soft_bounced'
}
Casos de uso
-
Enviar solo a usuarios con aceptación explícita:
{ type: 'channel_subscription', operator: 'subscribed_to_channel',channel: 'email', subscriptionStatus: 'opted_in' } -
Excluir emails con rebote:
{ type: 'bounce_status', operator: 'email_valid' } -
Segmentar suscriptores al newsletter:
{ type: 'list_membership', operator: 'member_of_list',listId: 'newsletter-list-id' }
Referencia de la API
La referencia REST completa para gestionar el consentimiento de canal, las listas de suscripción y la pertenencia a listas - con todos los endpoints, ejemplos de solicitud/respuesta y alcances necesarios - está en la página API de suscripciones.
Dos detalles útiles antes de usarla:
- Puedes suscribir en la misma llamada que crea el contacto. Cada elemento de
attributesdePOST /users/trackaceptasubscriptions; consulta Suscripciones a listas. Los endpoints específicos indicados abajo siguen siendo la forma de cambiar el consentimiento más adelante. Ni esa llamada ni una importación reactivan nunca una baja existente: se mantiene y se informa, y volver a obtener la aceptación de un contacto dado de baja siempre requiere una llamada explícita al endpoint de suscripción. - El
:userIdde estas rutas es elidinterno del contacto en Joryio (devuelto por la API de usuarios), no tu ID externo de usuario.
Una aceptación habitual: suscribir un contacto a una lista en el canal de email:
curl -X POST https://api-eu1.joryio.com/api/subscriptions/contacts/665f1c2ab3d4e5f6a7b8c9d0/lists/3f6c1a2e-9d4b-4f0a-8c7e-1b2d3e4f5a6b \
-H "Authorization: Bearer jry_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "channel": "email", "source": "api", "consentText": "Weekly newsletter signup" }'
Endpoints públicos (sin autenticación)
// Baja con un clic (RFC 8058): el List-Unsubscribe-Post de la app de correo
POST /u/:token
// El botón Darse de baja de la página alojada (solo el clic de una persona, ver #automatic-unsubscribe)
// Body: { reason?: string, view?: 'unsubscribe' | 'preferences' }
POST /u/:token/confirm
// Obtener preferencias
GET /preferences/:token
// Guardar preferencias
POST /preferences/:token
Body: { channels: [...], lists: [...], reason?: string, undo?: boolean }
SDK Endpoints (SDK Key Auth)
Estos endpoints los utiliza el SDK web y se autentican mediante el encabezado X-SDK-Key.
// Actualizar suscripción de canal
POST /v1/subscriptions/channel
Headers: { 'X-SDK-Key': 'jry_sdk_web_...' }
Body: {
channel: 'email' | 'sms' | 'whatsapp' | 'push' | 'viber',
status: 'optedIn' | 'subscribed' | 'unsubscribed',
userId?: string, // Úsalo si el usuario está identificado
anonymousId?: string // Úsalo si el usuario es anónimo
}
// Actualizar la pertenencia al grupo de suscripción (lista)
POST /v1/subscriptions/group
Headers: { 'X-SDK-Key': 'jry_sdk_web_...' }
Body: {
groupId: string, // ID de la lista
channel: 'email' | 'sms' | 'whatsapp' | 'push' | 'viber',
action: 'subscribe' | 'unsubscribe',
userId?: string,
anonymousId?: string
}
Si todavía no hay perfil para el userId o el anonymousId, el servidor lo crea - por userId cuando se envía, y si no como perfil anónimo - igual que /v1/alias/add, así que un cambio de consentimiento hecho antes de que se almacene el primer evento no se pierde. Los servidores anteriores respondían 404 en su lugar. Los códigos de estado de estas rutas están en Respuestas de las demás rutas de escritura.
Configuración
Configuración del espacio de trabajo
Configura las suscripciones en Configuración > Suscripciones:
interface SubscriptionSettings {
listUnsubscribe?: {
enabled: boolean;
includeMailto: boolean;
scope: 'global' | 'list';
};
bounceHandling?: {
softBounceRetryHours: number; // Ventana para contar rebotes suaves
softBounceMaxRetries?: number; // Rebotes suaves en la ventana antes de convertirlos en duros
resubscribeOnEmailChange: boolean; // Borra la marca de inválido al cambiar el email
};
doubleOptIn?: {
defaultEnabled: boolean;
confirmationEmailTemplateId?: string;
};
bccEmail?: string; // Para archivado de cumplimiento
}
Cumplimiento
Respaldo de pie de baja
Para que ningún email de marketing se envíe sin una forma de darse de baja:
- Bloque de pie de cumplimiento: un bloque de contenido
compliance_footer(creado automáticamente con un valor predeterminado razonable la primera vez que activas el añadido automático) contiene tu dirección y los enlaces de baja/preferencias. Puedes incluirlo en cualquier lugar con{{ blocks.compliance_footer }}o editarlo en Bloques de contenido. - Interruptor de añadido automático: Configuración → Suscripciones → «Añadir automáticamente un pie de baja cuando falte». Al activarlo, el proceso de envío añade el pie de cumplimiento a cualquier email de marketing (uno que incluya un encabezado
List-Unsubscribe) cuyo cuerpo no tenga un enlace de baja o preferencias. No bloquea el envío. - Advertencia en el editor: el editor de emails de campaña muestra una advertencia cuando el cuerpo no tiene un enlace de baja, para que lo detectes antes de enviar (un respaldo visible, no un bloqueo estricto). Ofrece dos accesos directos: Añadir un enlace (abre el editor para insertarlo) y activar el pie con añadido automático (abre esta página de Suscripciones). Se puede descartar durante la sesión. Cuando el añadido automático ya está activo, se muestra una nota informativa más discreta porque el pie se añadirá por ti.
Las listas de suscripción también se pueden seleccionar en nodos de recorrido de SMS, WhatsApp y Viber (no solo de email), de modo que la comprobación de envío por nodo omite los contactos que se dieron de baja de esa lista en cualquier canal.
RGPD (Europa)
- Usa doble opt-in para usuarios de la UE.
- Guarda el texto de consentimiento y la marca de tiempo.
- Ofrece acceso sencillo al centro de preferencias.
- Atiende las solicitudes de baja inmediatamente.
- Mantén un registro de auditoría de todos los cambios de suscripción.
CAN-SPAM (Estados Unidos)
- Incluye una dirección postal física en los emails.
- Atiende las solicitudes de baja en un plazo de 10 días laborables (Joryio lo hace de inmediato).
- Identifica claramente los emails comerciales.
- No uses asuntos engañosos.
TCPA (Estados Unidos - SMS)
- Obtén consentimiento expreso por escrito antes de enviar SMS.
- Respeta las palabras clave STOP inmediatamente.
- Incluye instrucciones de baja en los mensajes.
- Joryio gestiona automáticamente STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT, OPT OUT y OPT-OUT (la base de inglés siempre activa), además de los valores predeterminados localizados (por ejemplo, el hebreo
הסר) y las palabras personalizadas que añadas.
Gestión de palabras clave de SMS y WhatsApp
Joryio procesa automáticamente las palabras clave entrantes y tolera diferencias de mayúsculas, puntuación y espacios (Stop, STOP! y " stop " cuentan igual). STOPALL es la única baja integrada para todo el canal (además de las palabras personalizadas de baja global que configures); las demás palabras de baja se aplican al grupo de suscripción por número o WABA en el que llegó el mensaje, y START vuelve a suscribir al grupo de ese mismo número o WABA. Para consultar el conjunto completo -la base en inglés (incluidos REVOKE y OPTOUT), los valores localizados y tus adiciones personalizadas- y la regla para volver a suscribirse, consulta Palabras clave arriba.
SMS
| Palabra clave | Acción |
|---|---|
STOP, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE, OPTOUT, OPT OUT, OPT-OUT | Da de baja del grupo del número receptor |
STOPALL | Da de baja de todo el canal (todos los números) |
START, YES, UNSTOP, SUBSCRIBE, OPTIN | Vuelve a suscribir al grupo del número receptor |
HELP, INFO | Envía un mensaje de ayuda |
Valores predeterminados localizados (por ejemplo, הסר, PARE, ARRET) y adiciones personalizadas | Igual que su categoría anterior |
| Palabra clave | Acción |
|---|---|
STOP, UNSUBSCRIBE, CANCEL, END, QUIT, OPTOUT, OPT-OUT | Da de baja del grupo del WABA receptor |
STOPALL | Da de baja de todo el canal (todos los WABA) |
START, UNSTOP, SUBSCRIBE, YES, OPTIN, OPT-IN | Vuelve a suscribir al grupo del WABA receptor |
Los webhooks entrantes se verifican mediante firma: los STOP y START falsificados se rechazan, y los proveedores que no admiten verificación de firma entrante se rechazan para palabras clave entrantes. Si no se puede resolver el grupo por número o WABA, la baja se aplica de forma segura a todo el canal.
El webhook entrante de SMS se configura en tus números durante la incorporación; las palabras clave se procesan automáticamente.
Prácticas recomendadas
-
Usa siempre encabezados List-Unsubscribe: mejoran la entregabilidad y Gmail muestra el botón de baja.
-
Implementa doble opt-in para marketing: mejora la calidad de la lista y el cumplimiento.
-
Supervisa las tasas de rebote: las tasas altas perjudican la reputación de remitente.
-
Segmenta por estado de suscripción: envía solo a usuarios con aceptación explícita.
-
Haz que darse de baja sea sencillo: un clic, sin iniciar sesión.
-
Conserva registros de auditoría: son necesarios para el cumplimiento y útiles ante disputas.
-
Prueba el centro de preferencias: asegúrate de que los usuarios puedan gestionar sus preferencias fácilmente.
-
Usa la baja específica de lista: permite que los usuarios sigan suscritos a parte del contenido.
Solución de problemas
Problemas habituales
No se envían emails
- Comprueba si el usuario tiene el estado
unsubscribeden el canal de email. - Comprueba si el email está marcado como inválido por rebotes.
- Verifica el estado de rebote en el perfil de usuario.
La baja no funciona
- Comprueba la caducidad del token (90 días de forma predeterminada).
- Verifica que la firma del token sea correcta.
- Consulta el registro de auditoría para detectar errores.
No se procesa un rebote
- Verifica que la URL del webhook esté bien configurada en el proveedor de email.
- Comprueba la autenticación del webhook.
- Revisa los registros de errores.
Depuración
Comprueba el estado de suscripción:
# Llamada a la API
curl -X GET "https://api-eu1.joryio.com/api/subscriptions/contacts/{userId}" \
-H "Authorization: Bearer {token}"
Consulta el registro de auditoría:
curl -X GET "https://api-eu1.joryio.com/api/subscriptions/contacts/{userId}/history" \
-H "Authorization: Bearer {token}"