Traducción. Autoritativo: fs-msg-0009-sms-adapter.md.
Contexto
El SMS es el canal de mayor alcance en Latinoamérica y el de mayor fricción operativa de los que soportamos. Se diferencia de todo otro adaptador en tres cosas que lo hacen su propia entrega: Necesita un vendor nuevo, lo que exige un ADR antes del primer import (DEC-E1). Cuesta dinero real por mensaje, así que un bucle descontrolado es una cuenta y no un gráfico. Y el registro de remitente es por país — sender IDs alfanuméricos, short codes y long codes tienen reglas propias por mercado, y enviar sin registro significa no-entrega silenciosa en vez de un error. La fila del canal y el puerto existen desde el día uno (FS-MSG-0001). Solo falta el adaptador, que es exactamente lo que DEC-E1 pretendía.Alcance (normativo)
- El adaptador SMS implementando
NotificationChannelPort. messaging.sms_sender_registrations: por tenant, por país.- Seguimiento de costo por mensaje, alimentando la medición.
- Conteo de segmentos con conciencia de codificación (GSM-7 versus UCS-2).
- Acuses de entrega mapeados al vocabulario estándar de estados.
- Un tope duro de gasto por tenant, independiente de la cuota de mensajes.
Fuera de alcance (normativo)
- SMS entrante y conversación bidireccional. Otro producto.
- WhatsApp — F2, y otro canal pese a compartir un número.
- Elegir el proveedor. Ese es el ADR que bloquea esta feature.
Comportamiento (normativo)
- Bloqueado hasta que exista el ADR de proveedor (DEC-E1).
- Enviar a un país donde el tenant no tiene registro verificado se rechaza con error tipado, no se intenta. Un envío sin registro lo descartan las operadoras en silencio, que es el peor modo de falla: parece que funcionó.
- Los números se normalizan a E.164 antes de enviar, y uno inválido falla terminalmente y suprime.
- El largo se calcula con conciencia de codificación: un solo carácter acentuado cambia el mensaje a UCS-2 y reduce a la mitad el tamaño del segmento. La consola muestra el conteo de segmentos antes de enviar, porque un tenant que cree haber enviado un mensaje y pagó tres no lo va a considerar justo.
- El costo por mensaje se registra por envío y alimenta la medición.
- Aplica un tope duro de gasto por tenant, independiente de la cuota de mensajes, y detiene el envío en vez de facturar overage.
- Los acuses de entrega se mapean al vocabulario estándar. Donde el proveedor no ofrezca acuse, el
envío queda en
senty la limitación se documenta en vez de fingir undelivered. - El SMS está disponible solo para el carril transaccional en F1b. El SMS de marketing tiene requisitos de consentimiento por país más estrictos que el correo.
Datos (normativo)
API (normativo)
Eventos (normativo)
Ninguno más allá de los eventos estándar de estado.Criterios de aceptación (normativo)
- Ningún vendor de SMS se importa hasta que su ADR esté aceptado — impuesto por la allowlist del lockfile.
- Enviar a un país sin registro se rechaza con error tipado y sin llamada al proveedor.
- Los números se normalizan a E.164; uno inválido falla terminalmente y suprime.
- El conteo de segmentos es correcto para GSM-7 y UCS-2, probado con fixtures incluyendo un acento.
- El costo se registra por envío y aparece en el snapshot de consumo.
- El tope de gasto detiene el envío y no factura overage.
- Un proveedor sin acuses deja el envío en
sent, nunca undeliveredinventado. - Negativo: ningún mensaje de categoría marketing se despacha por SMS en F1b.