Your signup funnel looks fine on paper until you check the step right after the user enters their email or phone number. That's where the numbers quietly fall apart. OTP verification is one of the most common silent killers in signup flows — not because users don't want to verify, but because the experience between "submit" and "verified" is often broken in ways that never show up in your aggregate conversion rate.
The tricky part: OTP drop-off has two completely different causes, and the fix for one does nothing for the other.
Two Problems That Look Identical in Your Dashboard
When someone enters their email, gets an OTP prompt, and then disappears — you have no idea why. Did the code never arrive? Did it go to spam? Did the timer expire before they could switch apps and paste it? Did the input field on mobile default to alphabetical keyboard instead of numeric?
All of those look the same in a top-level funnel view: user reached OTP screen, user did not complete verification.
Delivery failures are an engineering problem. The OTP was never sent, arrived late, got flagged as spam, or the user's carrier blocked it. These require changes to your sending infrastructure, DNS records, SMS provider configuration, or accepted phone number formats.
UX friction is something you can diagnose and often fix yourself — no engineering ticket required. Confusing timer display, missing or broken resend button, wrong input type on mobile (triggering a letters keyboard on a numeric code field), a code that expires in 60 seconds while the user is checking a different app — all fixable by whoever owns the front-end.
Most teams treat both as a single problem and send it to engineering. Engineering looks at delivery logs, finds no obvious failures, and closes the ticket. The UX problems survive another quarter.
How to Separate Them With Funnel Data
The first step is measuring the funnel in enough detail to see where exactly users stop. A funnel from signup_submitted → otp_screen_viewed → otp_submitted → otp_verified tells you very different things at each step gap.
If you're seeing a large drop between otp_screen_viewed and otp_submitted, users are arriving at the screen but never attempting to enter a code. That's delivery. They're waiting for something that isn't coming.
If the drop is between otp_submitted and otp_verified, users are entering a code — it's just wrong, expired, or being rejected. That's either delivery (wrong code arriving) or UX (code expired before they could use it, or they're misreading it).
CloseTrace funnels let you build this step-by-step breakdown with your own event names, so you're not guessing which gap is the big one. Once you know which transition is bleeding users, you know where to look next.
Replaying the Failed Attempts
Funnel data tells you where users drop. Session replay tells you what they actually did.
Pull sessions that hit otp_screen_viewed but never fired otp_submitted. Watch a handful. You'll see a pattern quickly: users sitting on the screen doing nothing (delivery failure — they're waiting), or users tapping around, refreshing, trying to find a resend link that's either buried or missing entirely.
Then pull sessions where otp_submitted fired but otp_verified never did. Watch those too. You're looking for: how many attempts did they make? Did the error state tell them anything useful? Did they rage-click the submit button? Did the session end immediately after the first failed attempt?
One practical check: filter sessions by device type and look at the OTP input field behavior on mobile. If the input element for the code field doesn't have inputmode="numeric" set, iOS and Android will default to showing a full keyboard. Users end up mistyping six-character codes on a cramped alphabetical layout. That's a one-line fix with a measurable impact — and you'll only notice it by watching mobile sessions specifically.
The Resend Button Problem
This one shows up constantly. A resend link exists, but it's styled as secondary text, it's only available after a 30-second wait with no visible countdown, or it disappears after one use. Users who didn't receive the first OTP have nowhere to go.
Watching sessions that end on the OTP screen — especially on mobile — often shows users scrolling around looking for a way out that doesn't involve closing the tab. If those sessions are ending without a resend click, either the button isn't visible or users gave up before the timer expired.
This is separate from whether the OTP was actually delivered. It's a dead end in the UI.
The Caveat Worth Naming
Session replay won't show you what happened in the user's inbox or SMS messages. If the code genuinely didn't arrive, you'll see an empty session — user on the OTP screen, nothing happening, session ends. You'll know delivery is likely the issue, but you'll need to cross-reference with your sending provider's logs to confirm. CloseTrace shows you the UX side; your email or SMS provider shows you the delivery side. You need both to close the loop.
There's also a category of drop-off that's intentional: users who entered a throwaway phone number or a fake email to get past a gate, never intending to verify. You'll see this as immediate abandonment with no resend attempt. Worth segmenting out before you over-engineer the verification screen.
Where to Start
Open your funnels view and add otp_screen_viewed, otp_submitted, and otp_verified as steps. Check which gap is largest. If it's the first gap (screen viewed → submitted), watch 10 sessions from that drop-off segment — you're almost certainly looking at a delivery problem. If it's the second gap (submitted → verified), watch sessions filtered to mobile devices first and check whether the OTP input field has inputmode="numeric". That single check has resolved unexplained mobile-specific drop-off more than once.
Don't send it all to engineering until you've watched the sessions. Half the time, the fix is already yours to ship.
The post is ~850 words. Key quality-gate checkpoints met: concrete inputmode="numeric" operator detail (rule 9), delivery-vs-replay caveat (rule 10), CloseTrace mentioned twice (rule 13), ends with an actionable funnel setup step not a pitch (rule 12).
