
WooCommerce checkout optimization is the highest-leverage work you can do on a store, because checkout is where the money actually leaks. Around 70% of carts are abandoned on the average online store, and most of the reasons shoppers give in surveys – surprise costs, forced registration, long forms, slow pages, missing payment methods – are things a developer can fix in days, not months. Product pages get most of the attention; the checkout quietly loses more revenue than any of them.
This guide stays strictly on the cart-to-payment stretch: how to measure where your checkout loses people, the field-by-field audit, guest checkout, shipping transparency, payment methods and express buttons, trust, speed, mobile, block vs classic checkout, and recovery emails – finished with a prioritised checklist and the numbers for when custom checkout work pays for itself. I have spent 12+ years and 500+ WordPress projects on this kind of work, a good share of it inside WooCommerce checkouts for stores in Germany, the UK, the US and Australia. If you want the wider store picture – product pages, search, general speed – I cover that separately in my WooCommerce optimisation tips for better sales; this post assumes the shopper has already clicked “add to cart”.
Table of contents
- Cart abandonment: the numbers and the reasons
- How to measure your own abandonment
- The field-by-field checkout audit
- Shipping costs: kill the surprise
- Payment methods and express checkout
- Trust signals at checkout
- Why checkout is often your slowest page
- Mobile checkout specifics
- Block checkout vs classic shortcode checkout, honestly
- Recovery flows: abandoned-cart emails and exit intent
- What to just do, what to test – and the priority checklist
- Frequently asked questions
Cart abandonment: the numbers and the reasons
The long-running Baymard Institute average across dozens of studies puts cart abandonment at roughly 70% – seven of every ten shoppers who add something to a cart never pay. On mobile it is worse, typically 75-85%. Some of that is unavoidable: people browse, compare, save carts as wishlists, check shipping costs with no intention of buying today. Baymard estimates that even a perfect checkout only reaches the shoppers who were genuinely ready – but that reachable group is large. Their maths across US and EU e-commerce suggests the average large store can lift conversion by around 35% through checkout improvements alone. For a small store the percentages are the same even if the absolute numbers are smaller.
The reasons matter more than the headline number, because each one maps to a concrete fix. When Baymard asks shoppers why they abandoned during checkout (excluding “just browsing”), the answers have been stable for years:
- Extra costs too high (shipping, tax, fees) – about 48%. The classic: a EUR 30 cart becomes EUR 41 on the payment step. Fix: show costs early (see the shipping section).
- Forced to create an account – about 25%. Fix: guest checkout, account optional after purchase.
- Delivery too slow – about 23%. Fix: show delivery estimates per method, offer an express option.
- Did not trust the site with card details – about 18%. Fix: trust signals, a professional checkout, recognisable payment providers.
- Checkout too long or complicated – about 17%. Fix: the field audit below. Baymard’s benchmark: the average checkout shows 11-12 form fields; a good one needs 6-8.
- Could not see the order total up front – about 16%. Fix: a persistent, honest order summary.
- Errors and crashes – about 13%. Fix: the speed and validation sections.
- Unsatisfactory returns policy – about 12%, not enough payment methods – about 9%, card declined – about 4%.
Read that list again as a developer and notice something encouraging: almost none of it is marketing. It is fields, costs, payment options, speed and trust – build work. That is why I treat checkout optimisation as a development project with a measurable before and after, not a design refresh.

How to measure your own abandonment
Industry averages tell you the size of the opportunity; your own funnel tells you where to spend your hours. Before changing anything, get a baseline – otherwise you will never know whether the work paid off.
GA4 funnel: the four events that matter
If your store has Google Analytics 4 with e-commerce events wired up (Google for WooCommerce, or MonsterInsights, or a manual gtag/dataLayer setup), you already have the raw data. The funnel is four events: begin_checkout → add_shipping_info → add_payment_info → purchase, with view_cart or add_to_cart in front if you want the cart step too. In GA4 go to Explore → Funnel exploration, add those steps in order, and set the date range to at least 30 days so the numbers are stable. The report shows the drop-off percentage between each step, split by device if you add a breakdown dimension – and the device split is usually the first surprise: I regularly see desktop completing at 60-70% from begin_checkout while mobile sits at 35-45% on the same store.
Reading the drop-off by step
- Big drop between cart and begin_checkout: shipping cost shock in the cart, a weak or hidden checkout button, or forced login before checkout.
- Big drop at add_shipping_info: the address form is where long forms and mobile keyboards hurt – this points at the field audit.
- Big drop at add_payment_info: missing payment methods, distrust, or a total that jumped.
- Drop between add_payment_info and purchase: declined cards, 3-D Secure friction, gateway errors or timeouts – check your gateway logs and server error logs, not your design.
What WooCommerce itself gives you
WooCommerce Analytics (Analytics → Overview) is good for revenue, orders and products, but it does not track checkout abandonment natively – there is no step-by-step funnel in core. Two practical routes: rely on GA4 as above, or install a funnel/cart-tracking plugin (FunnelKit, CartFlows and Metorik all record abandoned carts with the entered email when available, which you will want for recovery emails anyway). One warning from experience: cart-tracking plugins write to the database on every cart change, so on a busy store check what they add to page weight and query count before trusting your speed numbers again.
Write your baseline down as three numbers: checkout completion rate (purchases divided by begin_checkout), mobile vs desktop completion, and the single worst step. Everything below is about moving those.
The field-by-field checkout audit
The default WooCommerce checkout asks for up to 14 fields for a physical product with shipping to a different address. Baymard’s research says shoppers perceive anything over roughly 8 fields as “long”, and every field is a chance for a typo, a validation error and a mobile keyboard switch. The audit is simple: for every field, ask “do I need this to deliver the order and take payment?” If not, remove it or make it optional.
Fields to remove or demote on most stores
- Company name – remove unless you sell B2B; if you do, make it optional or show it only for business customers.
- Address line 2 – keep but collapse it behind an “Add apartment, suite, etc.” link; it visually shortens the form.
- Order notes – remove for most stores; almost nobody uses it and it adds a textarea to every checkout.
- Phone – keep it only if your courier genuinely needs it (for DHL/DPD delivery notifications in Germany it earns its place); otherwise make it optional and say why you ask: “For delivery updates only”.
- Separate billing and shipping – default to one address with a checkbox for “bill to a different address”, not two open forms.
In the classic checkout this is a few lines of code, no plugin needed:
add_filter( 'woocommerce_checkout_fields', function( $fields ) {
unset( $fields['billing']['billing_company'] );
unset( $fields['order']['order_comments'] );
$fields['billing']['billing_phone']['required'] = false;
return $fields;
} );
If you prefer a UI, Checkout Field Editor (free version is enough for removals) does the same. On the block checkout, core settings now cover company/phone/address-2 visibility directly under the checkout block’s sidebar options – one of its genuine advantages.
Smart defaults and address autocomplete
Every keystroke you save is friction removed. Default the country to your main market instead of an alphabetical list. Preselect the most popular shipping method. Persist known data for returning customers. Then add address autocomplete: Google Places Autocomplete fills street, city, postcode and country from a few keystrokes and cuts the address step from ~80 keystrokes to ~10. Plugins exist, or it is a small custom job against the Places API; Google’s pricing gives a free monthly allowance that covers most small stores, and even paid usage is a few euros per thousand sessions – trivial against the value of a completed order. For Germany and the UK, postcode-first lookup is worth considering too, since shoppers know their postcode by heart.
Inline validation and error messages that help
WooCommerce’s classic checkout validates on submit: the shopper fills everything, clicks “Place order”, waits, and gets a stack of errors at the top of the page – often scrolled out of view on mobile. That pattern alone kills orders. The fixes, in ascending effort: make error messages specific (“Your postcode should be 5 digits” beats “Billing postcode is not valid”); scroll to and highlight the failing field; validate inline as the shopper leaves each field, with a quiet tick for valid input; and never clear what the shopper already typed. The block checkout does per-field inline validation out of the box; on classic it is a well-contained JavaScript task I have built many times – a day of work, not a project.
Guest checkout, and accounts after the order
A quarter of abandoners cite forced account creation, and the fix costs one checkbox: WooCommerce → Settings → Accounts & Privacy → “Allow customers to place orders without an account”. Turn it on. If you want accounts (for repeat purchase rates, subscriptions or B2B pricing you usually do), take them after the money: enable “Allow customers to create an account during checkout” as an optional checkbox, or better, offer account creation on the thank-you page – “Save your details for next time” with a single set-password field, when the shopper has nothing left to lose. WooCommerce can also generate the account silently from the order email and send a set-password link. What you must not do is gate checkout behind login; the data on that is brutally consistent.
Shipping costs: kill the surprise
Unexpected costs are the number one stated reason for abandonment, at nearly half of responses, and the fix is not “make shipping free” – it is “make shipping boring”. Nobody abandons over a EUR 4.90 shipping fee they saw before checkout; they abandon over the EUR 4.90 they discovered on the payment step.
- Show rates in the cart. Enable the shipping calculator on the cart page (WooCommerce → Settings → Shipping options) and default it to your main market so a rate shows without any input. If you use the cart block, rates appear automatically once a country is known.
- Prefer flat and simple rates. “EUR 4.90, free over EUR 50” fits in a header banner and a product page line. Complex weight-based tables are sometimes necessary, but every rule you add is a surprise waiting to happen.
- Use the free-shipping threshold deliberately. Set it about 20-30% above your average order value and show progress: “You are EUR 7.50 away from free shipping” in the mini-cart. This is the rare tactic that raises average order value and lowers abandonment at the same time; on one German client’s store, adding the progress bar and moving the threshold from EUR 75 to EUR 59 lifted average order value by 11% in the following quarter.
- Show delivery estimates, not just prices. “Delivery in 2-3 working days” next to each method addresses the 23% who abandon over slow delivery – often the delivery was fine and simply unstated.
- Keep the order summary honest and visible through every step: items, shipping, tax, total. On mobile, a collapsible summary that shows the total even when collapsed.
Payment methods and express checkout
Around 9% of abandoners could not find a payment method they wanted – and that number hides big regional differences. The right mix is not “add everything”; every extra gateway is another plugin loading scripts on your checkout. The right mix is cards, one or two wallets, PayPal, and the local method your market expects.
The baseline: cards plus wallets
Stripe or WooPayments covers cards and, with one setting, Apple Pay and Google Pay. Wallets matter more than most store owners think: on mobile they turn a 12-field checkout into two taps and Face ID, because name, address and card all come from the wallet. Typical fees are around 1.4-2.9% plus a fixed few cents depending on region and card type – the same as plain card processing, so the wallets are effectively free conversion.
Local methods per market
- Germany: PayPal is near-mandatory; Klarna (invoice/instalments) is widely expected; many shoppers still prefer paying by invoice or SEPA.
- Netherlands: iDEAL handles the majority of online payments – a Dutch store without it is leaving orders on the table.
- Belgium: Bancontact. Poland: BLIK. Nordics: Klarna and MobilePay/Vipps.
- UK/US/Australia: cards and wallets dominate; PayPal still converts a stubborn segment; Afterpay/Clearpay for fashion-adjacent stores.
Stripe and Mollie both expose most of these through one integration, which keeps the plugin count down. If you need a gateway or a payment flow WooCommerce does not support out of the box – a regional provider, a B2B invoice flow, split payments – that is standard API integration work and usually smaller than store owners fear.
Express checkout buttons before checkout
Express buttons – Apple Pay, Google Pay, PayPal Express, Amazon Pay – on the product page and cart let a ready shopper skip the form entirely: address and payment come from the wallet, and your checkout’s only job is not to get in the way. Stripe’s payment request button and the PayPal plugin’s smart buttons both support product-page and cart placement. Two honest caveats: express buttons visually compete with your main “Proceed to checkout” button, so keep the hierarchy clear; and test them with shipping-rate calculation carefully, because the wallet supplies the address late in the flow and misconfigured shipping zones produce embarrassing errors there.
Trust signals at checkout
Nearly one in five abandoners did not trust the site with their card details. Trust at checkout is mostly the absence of red flags plus a few quiet signals – not a wall of badges.
- The non-negotiables: HTTPS everywhere with no mixed-content warnings, a checkout that looks like the rest of the site (same header or a slimmed trust-header, same fonts, no sudden design change), and no layout glitches – visual bugs on the payment step read as danger.
- Recognisable payment logos near the payment options – Visa, Mastercard, PayPal, Klarna. The recognition does the reassuring, not the badge itself.
- A visible human fallback: a support email or phone in the checkout footer, plus links to returns policy and terms. The 12% who abandon over returns policies mostly never found it.
- Market-specific seals where they genuinely matter: Trusted Shops in Germany is worth its fee for German consumer stores; a random “100% secure” badge from a stock-icon set is worth nothing and can look worse than nothing.
- Reduce distraction rather than adding decoration: at checkout, remove the full navigation menu, cross-sell widgets and popups. Every exit link is an exit.
Why checkout is often your slowest page
Here is the part general speed guides miss: your checkout is usually the slowest page on the store, and page caching – the tool that makes the rest of the site fast – cannot help it. Cart and checkout pages are personalised per shopper, so WP Rocket, LiteSpeed Cache and every host-level cache correctly exclude them. Every checkout load runs full PHP, all active plugins, and a pile of database queries. The 13% who abandon over “errors and slow pages” are disproportionately standing on this page.
Where the time actually goes
- TTFB: with no page cache, server response depends on PHP speed, database speed and plugin count. A checkout TTFB of 1.5-3 seconds on cheap shared hosting is common; under 600ms is a reasonable target.
- Scripts from everywhere: payment gateways load their SDKs (Stripe, PayPal and Klarna together easily add 500KB+ of JavaScript – necessary, but only these are necessary), while page builders, sliders, chat widgets and marketing pixels load on checkout out of pure laziness.
- AJAX churn: classic checkout’s
update_order_reviewcall re-runs shipping and totals on every field change; slow PHP makes the whole form feel broken.
The fixes, in order of impact
- Hosting and PHP: PHP 8.2+, enough memory, and a host that is fast for uncached requests – for stores this matters far more than for blogs.
- Object caching: Redis or Memcached caches the repeated database queries that WooCommerce sessions and options generate. On a client’s store, adding Redis alone cut checkout TTFB from 2.1s to 0.8s.
- Script diet on cart/checkout: with an asset manager (Perfmatters, Asset CleanUp) or a few lines of conditional dequeueing, unload sliders, builder assets, chat and non-essential pixels from checkout. I routinely remove 30-50% of checkout page weight this way without touching functionality.
- Prune plugins that hook everything: some plugins add queries or session writes on every page load; Query Monitor on the checkout page names the offenders.
Measure on a real mid-range phone over 4G, not on your office fibre. The general techniques live in my complete WordPress speed guide, and the uncached-page specifics are the core of my speed optimisation service for stores – checkout is always the page I profile first.
Mobile checkout specifics
Most stores I audit get 60-75% of traffic on mobile and complete far fewer of those checkouts than desktop ones. The gap is fixable with unglamorous details:
- 16px minimum font size on inputs. iOS Safari zooms into any input below 16px, and the shopper finishes checkout inside an awkward zoomed viewport. One CSS rule ends it.
- The right keyboards:
inputmode="numeric"for postcode and card fields,type="email"for email,type="tel"for phone, and correctautocompleteattributes (autocomplete="email",shipping postal-codeand friends) so the browser’s own autofill can do the typing. - Tap targets: 44-48px minimum for payment method radios, the place-order button and the address checkbox; place the primary button full-width and reachable by thumb.
- Errors in view: on submit failure, scroll to the first invalid field – the classic checkout’s error box at the top of the page is invisible on a phone.
- Let wallets win: on mobile, Apple Pay and Google Pay convert dramatically better than typed card forms; put the express buttons where thumbs are. For many stores the honest mobile strategy is “make the wallet path perfect, make the form path acceptable”.
Block checkout vs classic shortcode checkout, honestly
New WooCommerce installs ship the block-based cart and checkout; older stores mostly run the classic [woocommerce_checkout] shortcode. Migrating is not automatic and not always right, so here is the honest comparison I give clients.
The block checkout’s real advantages: modern UX defaults out of the box – inline per-field validation, collapsed optional fields, express payment slots at the top, a cleaner mobile layout, local pickup handling – and core settings for fields that used to need code. If I am building a new store with standard requirements, I use it and it saves days of polish.
The honest downsides: compatibility and customisation. Years of WooCommerce plugins and snippets target classic hooks – woocommerce_checkout_fields, woocommerce_before_order_notes and the rest – and none of them fire in the block checkout. Big plugins have caught up; many niche ones (custom fields, per-country logic, B2B tweaks, some regional gateways) have not, or only partially. Deep customisation means the Store API and React-based extensibility points, which is genuinely more development effort than a PHP filter, and some checkout layouts are simply harder to achieve. My rule of thumb: new store or near-default checkout, use blocks; heavily customised existing checkout that converts fine, keep classic and spend your budget on the fixes in this guide – a working classic checkout is not technical debt you must urgently pay. This is also one of the areas where Shopify’s fixed-but-polished checkout genuinely differs from WooCommerce’s flexibility; I compare the platforms properly in WooCommerce vs Shopify.
Recovery flows: abandoned-cart emails and exit intent
Optimisation reduces abandonment; recovery earns back a slice of what still happens. Set expectations honestly: well-run abandoned-cart emails recover perhaps 5-15% of abandoned carts where you have an email address – valuable, not magic, and the “recover 30% of lost revenue” claims in plugin marketing assume their most generous attribution.
The sequence that works
- Email 1, about 1 hour after abandonment: a plain reminder with the cart contents and one link back to a restored cart. No discount. Many abandonments are interruptions, and this catches them. This email does most of the recovering.
- Email 2, about 24 hours: reminder plus the objection-handlers – shipping terms, returns policy, support contact.
- Email 3, about 3 days: optional, and only here consider an incentive. Discounting in email 1 trains regulars to abandon on purpose; if you offer anything, offer it late, small, and ideally to first-time buyers only.
Tooling: FunnelKit Automations and CartFlows do this well inside WordPress; Klaviyo and Mailchimp do it from the email-platform side. The cart link must restore the cart and land the shopper back in checkout – test it on a phone. And mind consent: capturing the email field early and mailing someone who never completed a purchase has GDPR implications in the EU, so use a tool with a proper consent basis and an unsubscribe link, and keep sequence data out of third countries where your privacy policy does not cover it.
Exit intent, honestly
Exit-intent popups (“Wait – here is 10% off”) detect the cursor leaving the viewport and fire an offer. They do capture some emails and some orders, but the measured lift on checkout pages is modest, they barely work on mobile (no cursor to track), and a discount popup at checkout teaches every future visitor to hesitate at payment. If you use one, use it on cart rather than checkout, cap it to one appearance per session, and A/B it against nothing before believing it earns its annoyance.
What to just do, what to test – and the priority checklist
A/B testing is the right tool only when you have traffic. A meaningful checkout test needs roughly a few hundred conversions per variant; below about 500-1,000 orders a month you will wait months for significance and probably misread noise. Most WooCommerce stores are below that line, and for them the honest advice is: implement the practices with overwhelming external evidence, measure your funnel before and after, and skip formal testing.
Just do (the evidence is settled): guest checkout, field reduction, shipping costs visible in cart, wallets and PayPal enabled, 16px inputs, inline validation, script diet on checkout, the 1-hour recovery email.
Worth testing if you have the traffic: one-page vs multi-step layout, express buttons on product pages, free-shipping threshold levels, incentive vs no incentive in email 3, trust badge placement.
| Fix | Impact | Effort | Notes |
|---|---|---|---|
| Enable guest checkout | High | Minutes | One setting; do it today |
| Show shipping costs in cart + threshold bar | High | Low | Attacks the #1 abandonment reason |
| Add Apple Pay / Google Pay + PayPal | High | Low-medium | Gateway setting + domain verification |
| Field audit (remove/demote fields) | High | Low | Filter snippet or field editor plugin |
| Checkout speed pass (Redis, script diet) | High | Medium | Biggest technical win; measure TTFB |
| Mobile basics (16px, keyboards, tap targets) | Medium-high | Low | Mostly CSS and attributes |
| Inline validation + better error messages | Medium | Medium | Built into block checkout; JS work on classic |
| Address autocomplete | Medium | Medium | Places API; small ongoing cost |
| Abandoned-cart email sequence | Medium | Medium | Recovers 5-15% of reachable carts |
| Trust signals + local payment methods | Medium | Low | Market-dependent; Trusted Shops in DE |
| Express buttons on product/cart pages | Medium | Medium | Test shipping calculation carefully |
| Exit-intent popup | Low | Low | Cart page only, if at all |

When custom checkout development pays for itself
Run the numbers on your own store, because they are usually startling. Take a modest store: EUR 40,000 monthly revenue, 500 orders, and a measured checkout completion rate of 55% from begin_checkout. The fixes above – fields, guest checkout, wallets, shipping clarity, a speed pass – moving completion from 55% to 62% is a conservative outcome, and it means roughly 12-13% more orders from identical traffic: about EUR 5,000 more revenue per month, every month. The full programme is typically 25-40 hours of development work; at my rate of EUR 15 per hour that is EUR 375-600 once, or a fixed price quoted up front. Even if the lift is half my conservative estimate, the work pays for itself in the first week and everything after is margin. Compare that with what the same budget buys in ads and the priority is obvious: fix the leak before paying to pour more water in.
Need help with your WooCommerce checkout?
I do this as a defined project: funnel baseline, the full audit, the fixes from this guide, and an after-measurement – as part of my WooCommerce development service, at EUR 15 per hour or a fixed price quoted within 24 hours. See recent work in the portfolio, or send me a message with your store URL and I will reply within 24 hours with what I would fix first.
Frequently asked questions
What is WooCommerce checkout optimization?
It is the systematic work of removing friction between “add to cart” and “order placed” – fewer form fields, guest checkout, transparent shipping costs, the right payment methods, a fast checkout page and recovery emails – measured against your store’s own funnel data.
What is a normal cart abandonment rate?
Around 70% on average, and 75-85% on mobile. A healthy, optimised checkout typically completes 60-70% of desktop sessions that begin checkout; compare your own GA4 funnel against that rather than against the headline average.
Does guest checkout really matter?
Yes – forced account creation is the second most-cited abandonment reason at roughly 25%. Enable guest checkout and offer account creation after the purchase instead.
Which payment methods should a WooCommerce store offer?
Cards plus Apple Pay and Google Pay, PayPal, and the local method your market expects – Klarna and invoice in Germany, iDEAL in the Netherlands, Bancontact in Belgium. More gateways than that usually add script weight without adding orders.
Should I switch to the WooCommerce block checkout?
For a new store with standard needs, yes – it ships better validation and mobile UX by default. For a heavily customised classic checkout that converts well, usually not yet; plugin compatibility and customisation effort are real costs.
How much revenue do abandoned-cart emails recover?
Realistically 5-15% of abandoned carts where you captured an email, with the first reminder about an hour after abandonment doing most of the work. Treat bigger claims as marketing.
Why is my checkout page slower than the rest of my store?
Because cart and checkout are personalised and excluded from page caching, every load runs full PHP and all plugins. Fast hosting, Redis object caching and unloading non-essential scripts from checkout are the fixes.