Canales de fallback SMS→chat
Cuando el SMS no llega: reenvío por canal IP, llamada de voz y diseño del botón de reenvío.
Entre un 2% y un 5% de los OTP por SMS no llegan a tiempo en mercados exigentes. Cada uno es un usuario que no pudo entrar. Ofrecer un canal alternativo convierte esa pérdida en una espera breve.
Una cascada razonable
- SMS inmediato.
- A los 30 s, botón «Reenviar» habilitado.
- En el segundo intento, ofrecer canal de chat si el usuario lo tiene.
- Como último recurso, llamada de voz que dicta el código.
const channels = ["sms", "chat", "voice"];
async function resend(session) {
const next = channels[Math.min(session.sends, channels.length - 1)];
session.sends++;
return next === "sms"
? mx.sms.send({ to: session.phone, text: otpText(session.code) })
: mx.chat.send(next, otpText(session.code));
}Cuando el SMS tarda, el usuario pide otro código, y luego otro. Cada reenvío cuesta y además invalida el anterior, de modo que el mensaje que llega primero ya no sirve. Ofrecer un canal alternativo después de un tiempo prudente resuelve ambos problemas.
El orden habitual es SMS primero, por alcance, y canal de chat como alternativa ofrecida al usuario tras 30 a 60 segundos. La alternativa debe enviar el mismo código, no uno nuevo, para que cualquiera de los dos mensajes funcione.
Pruébalo
// Same OTP over SMS and then chat, so either message works
const phone = "+56912345678";
const code = mx.otp.issue(phone);
await mx.sms.send({ to: phone, text: "Tu código nvíame es " + code + ". Vence en 5 min." });
console.log("Esperando... el usuario pide otro canal");
await mx.chat.send("chat", "🔐 Tu código nvíame es " + code + ". No lo compartas.");
console.log("¿Verifica con el código recibido por chat?", mx.otp.verify(phone, code));