Saltar al contenido
nvíame
Capítulo 4 de 412 min7 oct 2026

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 delivered dentro del plazo definido.

Una implementación con timeout

De envío simple a envío con fallback
−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) });
+ }
}
Mostrando: antes · haz clic para alternar

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.

Se completa automáticamente al leer el 80%.

Comentarios (3)

Matías Herrera7 oct 2026

¿Cuánto debo esperar antes de hacer fallback?

Equipo nvíameAutor7 oct 2026

Depende de la urgencia. Para un OTP, 15–30 segundos sin `delivered`. Para un recordatorio de cita, varios minutos. Configúralo por tipo de mensaje, no globalmente.

Camila Rojas7 oct 2026

Lo apliqué en el proyecto del trabajo. La sección «Fallback inteligente IP→SMS» me ahorró una discusión larga con el equipo: ahora tenemos un criterio compartido.

Sofía Castillo7 oct 2026

¿Hay alguna diferencia importante si lo implemento en un servicio con varias instancias detrás de un balanceador?

Equipo nvíameAutor7 oct 2026

Sí: todo estado que hoy vive en memoria (contadores, sesiones, claves vistas) debe moverse a un almacén compartido con TTL, como Redis. Si no, cada instancia ve solo una parte de la historia.

Los comentarios se guardan solo en este navegador.