What Went Wrong
Client reported that mobile customers were abandoning checkout at an alarming rate. Their analytics showed mobile cart additions were normal, but mobile conversion had dropped to nearly zero over 3 weeks. Desktop checkout worked perfectly.
The checkout form appeared to work — fields validated, the button showed a loading spinner — but the order was never submitted. No JavaScript errors in the console. No PHP errors in the logs. The button simply spun forever and then stopped.
What We Found
Tested on multiple devices and reproduced the issue exclusively on iOS Safari (both iPhone and iPad). Chrome on the same devices worked fine.
Used remote Safari debugging to inspect the network tab. Discovered the AJAX checkout request was being blocked by iOS Safari's Intelligent Tracking Prevention (ITP). A third-party analytics script was setting a cookie on the checkout page that triggered ITP's cross-site tracking protection, which then blocked ALL subsequent AJAX requests to the domain.
The analytics script had been updated 3 weeks prior — matching the timeline of the conversion drop exactly. The cookie it set was being classified as a tracking cookie by Safari's heuristics.
How We Fixed It
1. Moved the problematic analytics script to fire only on non-checkout pages using wp_enqueue_script conditional
2. Replaced the checkout-page tracking with a server-side event using WooCommerce's woocommerce_checkout_order_processed hook
3. Added a Safari-specific checkout fallback: if AJAX fails after 10 seconds, the form falls back to a standard POST submission
4. Set up mobile checkout monitoring alert: if mobile conversion drops below 50% of desktop, trigger email notification
Outcome
Mobile checkout immediately started processing orders again. Within the first week, mobile revenue recovered to expected levels — approximately $12,000 in recovered weekly revenue.
The server-side tracking approach actually provided more accurate analytics data since it only fired on completed orders rather than button clicks.