Where the Magento checkout gets stuck
A default Magento 2 checkout has four steps: cart, shipping address, shipping method and payment. Each step renders via Knockout.js components that only render once the JavaScript bundle has fully executed. On an average mobile connection that is noticeable.
- ▸Knockout.js render delays: the checkout page loads a heavy JS bundle before customers can fill in anything. On Slow 4G this adds up to more than 3 seconds before the first interaction.
- ▸Address validation round trips: each keystroke in the address field triggers a server request for validation. With slow TTFB that feels like stuttering.
- ▸Payment method JS bundling: payment methods only load their own scripts when customers reach step 4. That delay happens at the worst possible moment.
- ▸No soft validation between steps: customers who fill in a field incorrectly only notice at the click of Next. The error appears at the top of the page, far from the field that needs correcting.
- ▸No recovery after a failed payment: when a payment fails the customer lands on a generic error page with no pre-filled data. Many customers leave the store at that point.
- ▸Guest checkout not prominent in the flow: creating an account is promoted by default above guest checkout, which creates an extra barrier for mobile shoppers.
These are not bugs. This is how Magento 2 checkout works by default. The problems stack up on an average store with a few payment methods and one or two address validation extensions.
The measurable impact on your funnel
Cart abandonment of 70 percent or higher on checkout is not unusual for Magento stores. Industry averages sit around 70 to 75 percent. But not all those abandoned carts are shoppers who changed their mind. A portion leaves because the checkout is too slow, a form fails to submit, or a payment method only appears at the last step.
The most informative measurement is drop-off per step in GA4 enhanced ecommerce. Where do customers leave: when filling in the address, when choosing the shipping method, or at the payment step? That data determines where the gain is. INP on the checkout page itself is a second indicator: an INP above 200ms on the form fields means customers feel noticeable lag with every input.
At CarCare24 the CrUX INP for the checkout stood at 111ms after the performance optimisations. That is below the 200ms threshold. For a checkout with Knockout.js that is achievable with targeted adjustments to the script load order and avoiding synchronous XHR calls in the validation logic.
How I audit the checkout
A checkout audit starts with data, not assumptions. I look at three sources: the GA4 enhanced ecommerce funnel, session recordings from Hotjar or Microsoft Clarity, and CrUX data for the /checkout path.
- ▸GA4 enhanced ecommerce funnel: step-by-step drop-off rate per device type. Mobile visitors drop off more often at the address form, desktop visitors more often at the payment step.
- ▸Session recordings: Hotjar or Microsoft Clarity show where customers hesitate, go back, or drop off after a validation error. This makes assumptions about behaviour unnecessary.
- ▸CrUX INP for /checkout: the Chrome User Experience Report shows the actual interaction delay on the checkout page, measured with real visitors over 28 days.
- ▸Payment provider logs: Mollie or Stripe logs give insight into how many payments start, how many fail on the first attempt, and how many customers return after a failed payment.
- ▸Network waterfall on the checkout page: which scripts load synchronously, which payment method scripts are not waiting for a user trigger, and what is the TTFB on cart creation.
- ▸Address validation extension analysis: which extension handles address validation, how many requests does it send per input, and is a debounce in place.
From these sources comes a ranked list of bottlenecks with estimated conversion impact. Only then do you decide which fixes get scope.
What I typically adjust in the Magento checkout
After the audit I implement the fixes with the highest impact on drop-off and INP. On Magento stores it is almost always a combination of the following adjustments:
- ▸1-page checkout: all steps on a single page without page refreshes between address, shipping and payment. The Knockout.js components are loaded immediately without step-by-step navigation.
- ▸Inline validation with soft errors: validation errors appear directly next to the field, not only after clicking Next. When there is an error the focus stays on the field.
- ▸Async payment method loading: payment methods are loaded asynchronously when the checkout page opens, not only at step 4. Customers see the options earlier and can make a choice while filling in the address.
- ▸Address autocomplete via Postcode.nl or PDOK: postcode plus house number are sufficient for Dutch addresses. Street and city are filled in automatically, shortening the form and reducing validation errors.
- ▸magento_persistent.php for recovery after a failed payment: when a payment fails, address data and the chosen payment method are kept in the session. Customers do not have to start over.
- ▸Guest checkout as the primary option: moving the account creation prompt to after the purchase, as part of the order confirmation. On mobile this significantly reduces the input path.
Which of these adjustments apply depends on your extension set and Magento version. On Magento 2.4.6 or higher some options are directly available via configuration. On older versions targeted patches or custom modules are needed.
-- Client case
Checkout INP 111ms: how CarCare24 improved interactivity on the payment step
CarCare24 has a Magento 2 checkout with four payment methods (iDEAL, credit card, PayPal, buy now pay later) and address validation via an external API. Before the optimisations the checkout INP was above 300ms on mobile. Customers experienced noticeable lag when filling in the address form, particularly when the address validation sent a server request.
The audit identified three concrete bottlenecks: address validation sent a request on every keystroke without a debounce, payment method scripts were loaded synchronously when step 4 opened, and the Knockout.js binding for shipping methods blocked the main thread when switching shipping options.
The fixes: debounce on the address validation API call (300ms delay before sending), async loading of payment method scripts on checkout page open, and a patch on the Knockout.js shipping method binding to unload the main thread. Result: CrUX INP dropped to 111ms. Cart abandonment in GA4 enhanced ecommerce dropped from 76 percent to 64 percent on the checkout step. That is not a guarantee for every store, but it shows where the gain is when you target the right bottlenecks.
What I do not do
There are quick ways to make a checkout look better without addressing the actual bottlenecks. I do not use them.
- ✕Installing OneStepCheckout extensions without my own assessment: there are dozens of one-step checkout extensions available for Magento. Some are well built, many are not. They add their own JavaScript stack that makes the existing bundle heavier. I do not install an extension I have not first analysed for bundle impact and conflicts with existing modules.
- ✕Headless checkout without broader architecture context: a React or Next.js checkout decoupled from the Magento backend sounds appealing, but requires a stable GraphQL or REST API, correctly configured CORS, and a solid understanding of the Magento quote and order flow. I only do this when the broader store architecture supports it.
- ✕Custom payment provider integrations without customer research: adding a new payment method your customers do not use does not fix a conversion problem. I first look at drop-off per payment method in the GA4 data.
- ✕Score chasing without funnel context: an INP of 150ms versus 111ms matters less if guest checkout is hard to find. I prioritise on funnel impact, not technical perfection.
If an extension or approach falls outside my assessment I say so directly. An honest no is better than an implementation that creates more problems than it solves.
Scope and pricing
The price of a checkout project depends on the number of payment methods, whether B2B flows are present (multi-address, cost centres, invoice workflows), and whether the scope is audit only or also implementation.
I do not work with fixed price packages for Magento checkout work. A store with iDEAL and guest checkout has a different scope than a B2B store with five payment methods, a different checkout per customer group and a VAT validation flow. Pricing is on request, after an initial conversation.