Fallback inteligente IP→SMS
Cuándo y cómo caer a SMS sin duplicar mensajes ni perder el contexto.
El fallback es la red de seguridad de la mensajería IP: si el canal rico no puede entregar, el mensaje se reenvía por SMS. Hecho mal, el usuario recibe el mismo aviso dos veces; hecho bien, ni lo nota.
Qué dispara el fallback
- Capacidad: el destinatario no tiene el canal (consulta previa de capacidades).
- Error inmediato: el canal rechaza el envío.
- Timeout: no llega
delivereddentro del plazo definido.
Una implementación con timeout
−async function notify(user, text) {− await mx.chat.send("rcs", text);+async function notify(user, text, { timeoutMs = 20000 } = {}) {+ const msg = await mx.chat.send("rcs", text);+ const delivered = await waitForStatus(msg.id, "delivered", timeoutMs);+ if (!delivered) {+ await revoke(msg.id); // evita duplicados si el canal lo soporta+ await mx.sms.send({ to: user.phone, text: toPlainText(text) });+ }}
El respaldo convierte dos canales imperfectos en un sistema confiable. La idea es simple: intenta primero el canal rico y, si no hay confirmación de entrega dentro de un plazo, envía el mismo contenido por SMS. Lo difícil está en los detalles: cuánto esperar, cómo evitar que el usuario reciba ambos y cómo adaptar el contenido.
Pruébalo
En el playground, el canal de chat «falla» para un número sin la app. Observa cómo el código detecta la falla y cae al SMS con una versión de texto plano.
// Try chat first, fall back to SMS when the user has no chat app
const hasChatApp = { "+56911111111": true, "+56922222222": false };
async function notify(to, rich, plain) {
if (hasChatApp[to]) {
await mx.chat.send("chat", rich);
console.log(to, "→ entregado por chat");
return "chat";
}
console.warn(to, "sin canal de chat, usando SMS");
await mx.sms.send({ to, text: plain });
return "sms";
}
const rich = "📦 Tu pedido #4821 va en camino. [Rastrear] [Cambiar dirección]";
const plain = "Tu pedido 4821 va en camino. Rastrea en nviame.cl/p/4821";
for (const to of Object.keys(hasChatApp)) {
const via = await notify(to, rich, plain);
console.log("canal final:", via);
}Recuerda que el SMS de respaldo debe ser autosuficiente: sin botones, con un enlace corto y, si el texto original era largo, resumido para caber en un segmento.