For a new customer, the path from the shopping cart to the order review runs to 5.1 steps on average; the Baymard Institute measured that figure at large retailers. Anyone signed in with a stored address and payment method usually gets through in fewer steps. Unlike the home page, a category or a product page, this section cannot be cached as a whole: every one of those pages depends on a session, a cart, an address. This is where a filled cart either becomes an order or does not - and this is where, in our experience, the least measuring happens.
Key takeaways
- The checkout runs without a page cache: cart, address, shipping costs and payment are produced per session and run through the full chain of application, database and payment interface.
- Averaged across 50 studies, 70.22 percent of filled carts do not become orders (Baymard Institute) - more revenue potential sits behind the cart than in front of it.
- On mobile, only 69 percent of secondary pages reach good INP scores, against 80 percent for home pages (Web Almanac 2025). The checkout belongs to the secondary pages, not to the entry pages.
- A 0.1 second improvement in mobile load time coincided with 8.4 percent more conversions in the retail segment of the study - 15 brands with 20.5 million mobile sessions (Deloitte Ireland 2020).
- Set a separate budget per checkout step for server response time, interaction latency and field count, and measure in the field at the 75th percentile on mobile rather than in the lab at your desk.
- Plan the work before the high-revenue phase: 18.5 percent of annual retail revenue in Germany falls into November and December (HDE).
Why the checkout knows no cache
Category and product pages can largely be prepared in advance. A page cache serves the same HTML to thousands of visitors, an upstream cache pushes it to the edge of the network, and the application does not see the request at all. From the cart onwards that model ends. The content depends on the session: which items are in it, which price applies to this account, which shipping zone applies, which tax rate. Every one of those answers is produced fresh, through the full chain of application, database and payment interface. Anyone who has so far measured their shop's load time on the home page has not yet seen the section the order actually depends on. Server response time work acts directly on every single step here, because no cache is left in between to hide a slow call.
The effect is visible in the field data of the web. Home pages reach good INP scores on mobile in 80 percent of cases, secondary pages in only 69 percent (Web Almanac 2025) - an eleven percentage point gap that did not exist in this form a year earlier. As an explanation the report points to exactly the components a checkout is built from: filters, carousels and form validation, plus scripts that only start deeper in the user journey. Across all pages, 77 percent were in the good range on mobile (Web Almanac 2025); it is the secondary pages that pull that average down, not the entry pages. How the value can be collected cleanly in the first place, and which interactions it summarises, is covered in the article on Interaction to Next Paint.
Why this matters right now
What abandonment at the cart costs
In online retail there is an unusually large body of data on cart abandonment. From 50 different studies the Baymard Institute calculates an average of 70.22 percent (Baymard Institute): a good seven out of ten filled carts do not turn into an order. The value averages across very different sectors, periods and measurement methods and is therefore not a target for any single shop - a specialist site with a configurator behaves differently from a subscription shop with three products. As an order of magnitude, though, it says clearly where the money sits: behind the cart, not in front of it. If you want that translated into euros, the calculation is in the article on load time, conversion rate and revenue.
Part of that abandonment has nothing to do with speed: comparing, parking, shipping costs, a missing payment method. A measurable part does. 17 percent of US online shoppers have abandoned an order in the institute's checkout research because the checkout was too long or too complicated (Baymard Institute). Length and complexity are not purely questions of design. An address check that takes 800 milliseconds after every keystroke makes the same form feel twice as long: the field count stays the same, the perceived effort doubles. Perceived complexity is therefore to a good extent a question of runtime in the browser and not only a question of layout.
How strongly speed works on its own is shown by a study covering 37 brands with around 30 million mobile sessions: the data was collected and analysed by Fifty-Five, commissioned by Google, and the report was prepared by Deloitte Ireland (Milliseconds Make Millions, 2020). The basis was a natural improvement in mobile load time of 0.1 seconds. In the retail segment - 15 brands with 20.5 million sessions - conversions rose by 8.4 percent and average order value by 9.2 percent (Deloitte Ireland 2020). The data was collected over four weeks and shows a correlation for the brands studied; it is not a formula that transfers to every shop. It does describe the direction very clearly: tenths of a second are not cosmetics in retail, they are an economic quantity.
| Step | What the server has to do | Why no cache applies | Leading metric |
|---|---|---|---|
| Cart | Stock, tiered prices, account-specific discounts | Content depends on the session | Server response time |
| Address | Field validation, country rules, tax rate | Personal data entry | Interaction latency |
| Shipping | Costs by weight, zone and delivery date | Result differs per cart | Server response time |
| Payment | Authorisation, third-party frame, strong customer authentication | External window with its own runtime | Interaction latency and layout stability |
| Confirmation | Write the order, create the document, notify | A write operation, not a read | Server response time |
The table explains why a speed project at the checkout runs differently from one on the home page. There it is about images, fonts and render-blocking resources; here about database queries, third-party frames and time on the main thread. Both ends need their own measurement points, and both belong in the same picture of front-end optimisation and server work, otherwise the saving happens in the wrong place. Where the server time actually goes is made visible by the article on Server-Timing - without that breakdown, a high response time stays a number without an address.
The five steps and their bottlenecks
For a new customer at a large retailer, the average checkout is 5.1 steps long, counted from the cart to the order review page (Baymard Institute). Technically these steps are very different animals: two of them compute mainly on the server, two mainly in the browser, one writes. Treating them as one and reporting a single load time for the checkout loses exactly the information that leads to a fix. For the server share, time to first byte is the appropriate leading metric; for the browser share it is the latency of interactions.
Recalculating the cart
Stock, tiered prices and discounts apply per account. Every call goes to the database. Here it pays to count the queries rather than the kilobytes.
Validating address fields
A check on every keystroke occupies the main thread permanently. A check when the field is left is usually enough and keeps typing fluid.
Determining shipping costs
Weight, zone and delivery date determine the result; it can hardly be prepared in advance. A separate measurement point per calculation makes the cost visible.
Authorising payment
Third-party frames bring their own JavaScript and their own fonts. They belong loaded late, with a fixed height and without a jump in the layout.
Including the error paths
Wrong postcode, declined payment, empty stock: these paths run rarely in tests and regularly in production. They need the same measurement as the success case.
Writing the order
The last step writes to several tables and triggers follow-up processes. Whatever runs synchronously there extends the wait right before the thank-you page.
Five of these six points can be addressed without rebuilding the purchase mechanics. The sixth usually requires a decision: what has to happen synchronously for the order to be valid, and what may go into a queue. Document generation, reconciliation with the inventory system and sending notifications do not, in our experience, belong in the click path but behind the confirmation page. In Shopware projects this is frequently the point at which the confirmation page drops from several seconds to a fraction of that, without a single field disappearing.
The order of work that has proven itself
Form fields are the most expensive component
The average checkout contains 11.3 form fields, although according to the institute's research 8 fields would be enough for most shops (Baymard Institute). The value has fallen over the years - 11.8 fields in 2021, 12.7 in 2019 (Baymard Institute) - yet the gap to what is necessary has remained. Every additional field costs twice: once in attention while filling it in and once in runtime in the browser. The first cost is well known, the second is rarely quantified.
In typical shop themes a field brings several event handlers with it, often a check on every keystroke, sometimes a request to the server for address completion. With eleven fields that adds up to a permanent base load on the main thread - and that base load is precisely what interaction latency measures. Reducing the number of fields reduces both costs at once. Where fields cannot be removed because the business needs them, rebuilding the validation helps: from keystroke to leaving the field, and splitting long tasks as described in the article on long tasks and the scheduler interface.
{
"checkout_budget": [
{ "step": "cart", "ttfb_ms": 400, "inp_ms": 150, "fields": 0 },
{ "step": "address", "ttfb_ms": 400, "inp_ms": 150, "fields": 8 },
{ "step": "shipping", "ttfb_ms": 500, "inp_ms": 150, "fields": 0 },
{ "step": "payment", "ttfb_ms": 600, "inp_ms": 200, "fields": 0 },
{ "step": "confirmation", "ttfb_ms": 400, "inp_ms": 150, "fields": 0 }
],
"measurement_window": "field data, 75th percentile, mobile",
"error_paths": ["postcode_invalid", "payment_declined", "stock_empty"]
}What a budget does not measure
Measure interaction latency per step, not per page
Interaction latency reports the longest interaction of a page visit. In a checkout spread across several page loads, each step produces its own value; in the field data those values are then merged, and the individual step is no longer visible. For assessment that is correct, for debugging it is useless: you see that something is slow, but not where. A second, separate recording makes sense, holding the longest interaction per checkout step, collected in the browser and sent when the page is left. How much work accumulates on the main thread is shown by the lab measurement in the same report: at the 90th percentile, mobile users face over 7.5 seconds of blocking time before a page becomes fully interactive (Web Almanac 2025).
The snippet below works without any external library and uses only interfaces the browser already provides. It keeps the highest value per step and sends it to an endpoint in the same shop at the end. What has to be observed legally, and why a measurement without a personal identifier can in many cases work without consent, is covered in the article on performance measurement without consent.
// Keep the longest interaction per checkout step
const values = new Map();
const step = document.body.dataset.checkoutStep || 'cart';
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (!entry.interactionId) continue;
const seen = values.get(step) || 0;
if (entry.duration > seen) values.set(step, Math.round(entry.duration));
}
}).observe({ type: 'event', buffered: true, durationThreshold: 40 });
addEventListener('visibilitychange', () => {
if (document.visibilityState !== 'hidden' || values.size === 0) return;
const payload = JSON.stringify(Object.fromEntries(values));
navigator.sendBeacon('/measurements/checkout', payload);
});Payment, third-party frames and the last click
The payment step is typically the one in which external code runs inside your own purchase process. The embedded frame of the payment service brings its own JavaScript, loads its own fonts and does not measure itself. For the page that means three things: additional time on the main thread, additional connections and an element whose height is only known after loading. That is exactly where layout shifts right before paying come from - the order button slides down while the thumb is already on its way. How to avoid this is described in the article on layout shifts in a shop.
- Load the third-party frame only once the customer has chosen a payment method, not when the step opens.
- Give the frame a fixed height so the order button stays where it is while content loads.
- Open the connection to the payment service early, but fetch the resources themselves late.
- Trim your own scripts in the payment step to what is needed; every task saved benefits the external frame.
- Disable the order button after the first click and show that state, so double orders and repeated requests do not occur.
The effort pays off because everything comes together in the payment step: external code, form logic and a server response that cannot be prepared. How much external code a shop carries in total is covered by the article on trimming third-party scripts; how the same checkout behaves under heavy load is shown by a load test before peak season. The two belong together, because a response time measured on a quiet night says little about a Friday evening in December.
A checkout does not become fast because the home page is fast. It becomes fast when each of its steps has its own budget and is measured on its own - including the paths that go wrong.
In practice that means five measurement points instead of one, a budget per step and a recording that also captures the error paths. The rest is craft - consolidating queries, removing fields, untangling validation, taming third-party frames. Which Core Web Vitals describe which step, and how strongly CSS runtime in the browser interferes, is explored in the article on style recalculation. Looking at both together usually requires less rebuilding than expected.
Related Articles
Load Testing for Peak Season: Surviving Traffic Spikes
A page answering in 400 ms on a single request can break at 300 concurrent visitors. How a load test makes capacity visible before the peak season starts.
Page Speed and Conversion: How Speed Drives Revenue
Every second of load time decides conversion and cart value: how speed drives revenue, what 100 milliseconds are worth and Core Web Vitals in euros.
Shopware Performance: Faster Loading Times
Make Shopware CE faster with built-in tools: integrated HTTP cache and reverse proxy, cache warmup, OpenSearch and the performance gain of a 6.x update.