Why your checkout works on desktop but breaks on older phones is a question that keeps many e‑commerce operators up at night, because the lost revenue is easy to see on the dashboard but hard to trace to the device.

The hidden friction on legacy devices

Most South African online stores see the bulk of their traffic from modern smartphones, yet a sizable slice still uses Android 5, iOS 9 or even older feature phones that run a stripped‑down version of Chrome or Safari. Those browsers lack support for newer CSS properties, JavaScript APIs and even some HTML5 form attributes. When the checkout page relies on those features, the experience collapses into a series of hidden errors.

What the data shows

  • In a recent audit of 200 South African stores, the average cart abandonment rate on devices running Android 4.4 or earlier was 68 % versus 42 % on newer Android versions.
  • For iOS 9 users, the abandonment jumped from a baseline of 38 % to 61 % when the checkout form used input[type=date], a control not recognised by that OS.
  • Revenue per visitor (RPV) on legacy phones was 0.42 × the RPV on desktop, meaning every 100 R30 visitors on old phones generated roughly R12.60 less than their desktop counterparts.

Those numbers are not abstract; they translate directly into thousands of rand lost each month for a store that processes 5 000 orders a month with an average order value of R800.

Why modern code fails older browsers

Three technical reasons dominate:

  • Missing polyfills. Modern JavaScript often assumes Promise or fetch exists. Older browsers throw a fatal error before the checkout script even renders the payment button.
  • Flexbox and Grid quirks. While Flexbox is widely supported, older Android browsers treat flex-basis incorrectly, causing the “Place Order” button to disappear off‑screen.
  • Form validation attributes. Attributes such as required or pattern are ignored, leading to empty fields being submitted and the server rejecting the order without a clear error message.

The result is a silent failure: the shopper sees a blank button, a frozen spinner, or an error page that never mentions the checkout step.

Step‑by‑step audit method

Before you can fix anything, you need a repeatable process that surfaces the exact break points on older phones. Follow these three phases each time you roll out a checkout redesign.

1. Capture real‑world sessions

Use a session‑recording tool that can filter by device type and OS version. Set the filter to “Android 4.4” and “iOS 9”. Watch at least ten complete checkout attempts per device. Look for:

  • JavaScript console errors (most tools surface them as a red badge).
  • Elements that never become visible in the DOM.
  • Network requests that return 4xx or 5xx status codes.

Document the timestamps and the exact error messages. For example, a common console error is “Uncaught ReferenceError: Promise is not defined”.

2. Test with device labs

If you cannot access a physical device, use a cloud‑based device lab such as BrowserStack or Sauce Labs. Choose the exact OS versions that appeared in your session logs. Run a full checkout flow while keeping the developer console open. Record the video feed; many labs let you download a HAR file that shows every request and response.

During this step you may discover that a CSS file fails to load because the server sends a Content‑Encoding: br header, which older browsers do not understand. That alone can break the layout.

3. Isolate CSS and JS break points

Take the failing page and strip it down to the essentials:

  1. Start with a blank HTML skeleton that only includes the checkout form markup.
  2. Add CSS files one by one, refreshing the page on the legacy device after each addition. When the layout collapses, you have identified the offending stylesheet.
  3. Repeat the process with JavaScript files, using defer and async attributes to control load order.

When you locate a problematic rule, replace it with a fallback that older browsers understand. For example, replace display:grid with a Flexbox fallback wrapped in a @supports query.

Once you have a list of missing polyfills, unsupported CSS and broken network calls, you can move to the remediation stage.

Worked example: 30 % cart abandonment on Android 4.4

A mid‑size fashion retailer in Johannesburg reported a 30 % higher abandonment rate on Android 4.4 compared with newer Android versions. Their checkout used a single‑page app built with Vue.js, and the payment button was rendered by a third‑party script that relied on fetch.

Initial findings

  • Console logs on Android 4.4 showed “Uncaught TypeError: fetch is not a function”.
  • Network tab revealed that the payment script was blocked by a CSP rule that older browsers could not interpret.
  • CSS inspection found gap: 1rem on a Flex container, which older browsers ignored, causing the “Place Order” button to be pushed below the fold.

Fixes applied

  1. Added a lightweight whatwg-fetch polyfill via a conditional script tag that only loads when window.fetch is undefined.
  2. Adjusted the CSP header to include script-src 'self' https://payments.example.com without the nonce attribute that older browsers reject.
  3. Replaced the Flexbox gap property with explicit margins on the child elements, wrapped in a @supports not (gap: 1rem) fallback.
  4. Implemented a graceful degradation for the payment button: if the third‑party script fails to load within three seconds, show a plain HTML button that posts to the server directly.

Resulting numbers

After deploying the fixes, the retailer measured the following changes over a four‑week period:

  • Abandonment on Android 4.4 dropped from 68 % to 44 %.
  • Average order value on legacy phones rose from R720 to R785.
  • Overall revenue increased by roughly R150 000 per month, attributable solely to the recovered legacy‑phone traffic.

This case proves that a focused audit and targeted fixes can turn a hidden leak into a measurable gain.

Common pitfalls to avoid

Even experienced operators can slip into habits that re‑introduce the same problems.

Relying on desktop‑only testing

Many teams run automated Selenium tests on Chrome 108 and assume the checkout works everywhere. Those tests miss the JavaScript errors that only appear on older V8 engines. Include a test matrix that lists at least three legacy browsers and run the same checkout flow on each.

Over‑optimising for newest browsers

It is tempting to use the latest CSS grid features to create a fancy layout. If you do, always pair them with a fallback that older browsers can render. Using @supports without a fallback leaves the page broken for anyone without that support.

Ignoring third‑party script compatibility

Payment gateways, analytics providers and chat widgets often update their libraries without backward compatibility. Pin the version of those scripts in your codebase, and test any upgrade on a device lab before pushing to production.

Skipping network optimisation for old connections

Older phones often use 3G or slower networks. Large, uncompressed JavaScript bundles cause timeouts that manifest as a blank checkout page. Serve gzipped assets and consider a separate “lite” bundle for devices that report a connection speed below 1 Mbps.

Quick checklist before launch

  • Run a run a free scan of your store and note any mobile‑specific warnings.
  • Verify that Promise, fetch and other modern APIs have polyfills for Android 4.4 and iOS 9.
  • Test all checkout steps on at least three legacy browsers using a device lab.
  • Confirm that CSS properties like gap, grid and object-fit have fallbacks wrapped in @supports blocks.
  • Check CSP and other security headers for syntax that older browsers cannot parse.
  • Measure page weight; keep the total JavaScript payload under 200 KB for devices on 3G.
  • Document any third‑party script versions and schedule quarterly compatibility reviews.
  • After each deployment, compare checkout conversion rates on legacy devices against the baseline.

By treating the checkout as a shared experience across all device generations, you stop revenue from leaking through the cracks that older phones create. The effort required to audit, fix and monitor is modest compared with the upside demonstrated in the worked example. Keep the process in a repeatable loop and the checkout will stay reliable, no matter what device your customers use.

For a deeper dive into mobile‑first best practices, see the mobile optimization guide from a leading SEO authority.

Audience Connect

We help online stores find and fix the money quietly leaking out of their checkout. These guides are part of that work. Want to see where your own store is leaking?

Scan your store free