I’ve seen this mistake in multiple products.
User clicks “Resend OTP”… System generates a new code every time. Sounds correct, right?
But here’s what actually happens:
- SMS gets delayed
- User clicks resend
- New OTP is generated
- Old OTP arrives first
- User enters it and get “Invalid OTP” error
From the user’s perspective, your system is broken.
The fix is simple : For a few retries, send the same OTP. So whichever message arrives first, the code still works.
I implemented this once, and it instantly reduced login friction.
Sometimes the problem isn’t the feature. It’s the timing.
Have you implemented the OTP correctly in your app ?
