Editorial line chart on cream paper marking a sudden conversion-rate anomaly with an orange highlight.
The Ecom Bunny

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.”

24%
Mobile drop-off at shipping
50
Shopify Plus stores audited
200ms
Late-firing handler

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 Ecom Bunny

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.