Your form works perfectly. You tested it. Your QA tested it. The staging build passed. Then a customer emails: "I tried submitting on my iPhone three times and nothing happened."
You open the page on your MacBook. It works. You open Chrome DevTools, switch to the iPhone 14 preset, fill the form, hit submit. Works.
The bug is real. Your test environment just isn't real enough to catch it.
Why mobile-only bugs are so hard to reproduce
Desktop and DevTools mobile emulation share the same JavaScript engine, the same network stack, and the same OS. Real mobile devices don't.
Here's what actually breaks on real phones but not in your tests:
- iOS Safari quirks. Safari handles
position: fixed, viewport units, and autofill differently than every other browser. Form fields that look fine on desktop Safari can fail on iOS Safari because the iOS keyboard repositions the viewport. - Touch event conflicts. A button that uses
onmousedowninstead ofonclickmight never fire on a touchscreen. Or it fires twice. - Network instability. Real users on 4G or spotty WiFi see timeouts your office network never produces. Forms that retry silently look "submitted" to your code but never actually post.
- Browser version skew. Roughly 15-20% of mobile traffic still runs browsers more than 6 months old. Your modern build pipeline may ship code that breaks on older Chromium variants without warning.
- In-app browsers. Instagram, TikTok, and Facebook open links in their own embedded browsers, which strip cookies, block third-party scripts, and disable autofill. If 30% of your traffic comes from social, this is huge.
QA misses all of this because QA runs on the same handful of devices in the same office on the same WiFi. Real users don't.
The fastest way to actually find them
Stop trying to reproduce. Start watching.
Every mobile-only bug has already happened to someone. The fix isn't simulating their session — it's seeing it. That's where session replay earns its rent. Instead of guessing what device or browser broke, you filter past sessions to ones that match the failure signal and watch what the user actually saw.
Step 1: Filter sessions where the form failed
In CloseTrace, open your sessions view and apply two filters:
- Device type: Mobile
- Event:
form_failed(or whichever event name your form fires on submission errors — many teams useform_submit_errororform_abandoned)
If you don't have a form_failed event yet, filter by sessions where users hit the submit button but no form_submitted event followed within 5 seconds. That gap is the bug.
Step 2: Sort by browser and OS
Mobile-only bugs cluster. You almost never see "fails on every mobile device." You see "fails on iOS 16 Safari" or "fails on Android Chrome 119+" or "fails inside the Instagram in-app browser." Group your filtered sessions by browser and OS version. The cluster tells you where to look.
A common pattern: 80% of failed mobile submissions in a given week come from a single browser/OS combination. That's not a CSS issue. That's a JavaScript exception you'd see immediately in the console — if you'd been looking at that device.
Step 3: Watch three replays end to end
Pick three session recordings from the failing cluster. Watch them at 1x speed, not sped up. You're looking for:
- Where the user's finger goes vs. where the field activates. Off-by-a-few-pixels tap targets are invisible on desktop and obvious on replay.
- Whether the keyboard covers the submit button. This is the #1 mobile form killer. Users tap submit, the keyboard doesn't dismiss, and they can't tell the form is asking for a fix on a hidden error message.
- Console errors at the moment of failure. A good session replay captures network requests and console output. The error message is usually right there.
You'll find the bug in under an hour. I've done this dozens of times. The longest part is deciding which fix to ship first.
Common mobile-only bugs you'll find this way
After watching a few hundred of these, the same culprits keep appearing:
- Autofill collisions. iOS autofill writes a value but doesn't fire the
changeevent your validation listens for. Form thinks the field is empty. - Hidden validation errors. Error messages render, but in a position the keyboard covers. User taps submit, "nothing happens," they leave.
- Fixed-position buttons. Submit buttons styled with
position: fixedget pushed off-screen by the iOS URL bar collapsing. - Disabled submit logic. A debounce that re-enables the button after 300ms feels fine on desktop. On a flaky 4G connection where the first tap registers slowly, users tap twice and the second tap hits the disabled state.
- Cookie-blocked sessions. Form posts that depend on a session cookie fail silently inside in-app browsers that don't persist cookies.
If you see any of these in your replays, you've also got a lead recovery opportunity — the user filled the form, the data exists in CloseTrace's form drafts, and you can email them while the bug fix ships.
The takeaway
You will not catch mobile-only bugs by adding more devices to your QA matrix. You'll catch them by watching real failures from real users, filtered by the signal that matters: a mobile session where the form was attempted and never completed.
Set up the form_failed event. Filter to mobile. Watch three replays. The bug is in there.
If you want to compare tools that do this, see how CloseTrace stacks up against Hotjar and Microsoft Clarity, or just check pricing.
Related reading
