Validate numbers before sending
Validation for otp authentication belongs upstream of the OTP request. The places that earn it are signup and password reset. Those are the moments where a bad number enters your database, or an outdated one gets used for something consequential.
Acudo sits in front of your existing OTP provider rather than replacing it. The sequence is user input, then a number intelligence check against 220+ network operators that covers line type and current status. Your application decides from that response whether to proceed with the send.
Numbers that were never going to deliver stop consuming message spend and stop producing mystery failures in your dashboard. A number that returns as VoIP or absent gives your fraud logic a signal at signup rather than after an account takeover.
Build TOTP enrolment correctly
Time-based one-time password (TOTP) enrolment starts with a shared secret delivered as a Base32 string inside a QR code, which the authenticator app stores and the server keeps alongside the account. From that point, both sides compute the same code independently. No message is sent, which is precisely why the carrier problems above disappear.
RFC 6238 sets the time step at 30 seconds and recommends allowing at most one additional step for network delay, so a validation window of plus or minus one step. Widen it beyond that, and you extend the attack window on a six-digit code. Keep it too narrow and you reject correct codes from phones whose clocks have drifted, which produces the worst kind of support ticket: the customer is doing everything right, and your system says no.
Handle drift with an explicit re-synchronisation path rather than a permanently loose window. Log rejected-but-close codes separately from wrong codes, because the first pattern tells you about clock skew and the second tells you about something else entirely.
Design account recovery
Every otp authentication factor you add is a factor someone can lose. Phones get replaced and stolen, and the account behind them still needs an owner. NIST's guidance on saved recovery codes specifies at least 64 bits from an approved random bit generator, issued at enrolment, with a notification sent whenever a replacement is requested.
Issue backup codes at the moment of TOTP enrolment, not later, and make the user acknowledge storing them before the flow completes. For re-enrolment on a new device, require a real authentication event rather than a knowledge question, because knowledge questions are the softest surface on the account.
The rule to hold: recovery must never be cheaper for an attacker than the front door. If someone can bypass a bound authenticator by claiming device loss and answering a security question, the authenticator was decoration. Notify the account holder on every recovery event through a channel other than the one being recovered.
Build the failure response
When delivery still fails during otp authentication, the response has to be designed rather than improvised. Rate-limit resends with a visible countdown and a hard cap per session, both to control cost and to close the endpoint that SMS pumping attacks feed on. Tell people what's happening in specific terms, because "code sent" is useless when nothing arrived.
Monitor delivery by carrier and line type rather than in aggregate, since an aggregate success rate hides the segment that's failing. Automatic channel fallback to voice after the first failed sms authentication attempt, and a route into authenticator enrolment for anyone who fails twice, turns a dead end into a working path. Watch your rejected-valid-code rate as a separate signal, because that's a clock problem.
Prioritise the upstream work. Validating the number before the send removes failures that no retry logic can recover from, and graceful fallback handles what's left.
Conclusion
Failed codes are a data quality problem dressed up as a telecoms problem. Fix the number before the send and give people a second route when the first one goes quiet.
Acudo brings HLR lookup and E.164 formatting into one platform, which checks whether a number is real and active before your budget and your customer's patience are spent on it. Talk to our team about placing number validation in front of your one-time password authentication flow.