
The Case of the Ghost-Step: why 24% of mobile users drop off at shipping
An audit of 50 Shopify Plus stores revealed a pattern of phantom touch events on the shipping selector — a tiny script-priority bug that looks exactly like price sensitivity in your reports.
7 min read
The problem wasn’t the price. It wasn’t the speed. It was a single line of JavaScript in a common Shopify app firing 200ms late on mobile devices. To the user, the page looked broken. To the merchant, it looked like “low intent.”
Here’s the thing about mobile checkout funnels: the numbers always “make sense” at first. Drop-off at shipping? Customers got cold feet on the total. Cart abandonment after coupon entry? They were never going to convert without one. There’s always a tidy psychological story we can wrap around a drop in the funnel. That tidiness is usually the first red flag.
The anomaly that didn’t fit a narrative
While auditing event logs for a $40M home-goods brand, I noticed a cluster of touchstart events on the “Calculate Shipping” button that never resolved into a corresponding click. On desktop the same control fired both events cleanly. On iOS Safari it was perfect. On mid-range Android over Chrome — silence.
“In ecommerce analytics, we often mistake technical friction for psychological hesitation. Data tells us what happened; it rarely tells us why.”
The discovery phase
The signature of a UI thread being blocked by a rogue third-party script is exactly this: the user’s finger registers contact, the OS sends the event, but the JavaScript event loop is too busy serializing a tracking payload to acknowledge it before the user lifts their finger and tries again. The second tap looks like a brand-new session in analytics. The third tap looks like rage.
The fix that recovered 18% of the funnel
// Prioritize the shipping interaction over deferred trackers.
document
.querySelector('.shipping-calc-trigger')
.addEventListener('touchstart', (e) => {
performance.mark?.('shipping_interaction');
requestAnimationFrame(() => handleShippingCalc(e));
}, { passive: true });The cross-brand pattern
After spotting it once, I went looking for the same fingerprint across 49 other Shopify Plus stores I had read access to. 31 of them had the same pattern at varying severities. Every one of them had attributed the drop-off to “shipping price perception” in their last quarterly review.
What this means for your reports
The uncomfortable implication: a meaningful slice of what your attribution tool calls “low-intent traffic” is actually high-intent traffic running into a UI that doesn’t respond. The cheapest growth lever on the planet is fixing the bugs you’ve been explaining away.