Everything worth knowing, nothing that isn't.
Code design and lifetime
Use 4–8 numeric digits — long enough to resist guessing, short enough to type. Set a short expiry (5–10 minutes), invalidate the code after one successful use, and cap verification attempts before forcing a resend. See /answers/what-is-otp and /answers/what-is-2fa.
Defend against SMS pumping (AIT)
Artificially Inflated Traffic — fraudsters triggering floods of OTPs to premium numbers to earn a cut of the traffic — can quietly dominate an OTP bill. Rate-limit per number and per IP, add velocity checks, and monitor sudden spikes to unusual country codes. See /answers/what-is-sms-pumping and /answers/what-is-ait.
Speed and route priority
OTP is time-sensitive: a code that arrives after the user gives up is a failed login. Send OTP over direct, high-priority routes with headroom for bursts, and monitor DLRs so you catch route degradation before users do. See /answers/what-is-dlr.
Add a fallback channel
If SMS is delayed in a market, fall back automatically to flash-call verification, WhatsApp, or voice OTP so conversion doesn't depend on one channel. See /answers/what-is-flash-call-verification and /answers/what-is-silent-network-auth.
Message content and anti-phishing
Lead with your brand and the code, state what it is for, and include no links — legitimate OTP messages never ask the user to click. This trains users to distrust OTP-style messages that do contain links. See /answers/what-is-smishing.