Independent retailer
Aurora — +27% checkout completion
Aurora had steady traffic and a full cart rate that looked healthy — right up until the checkout, where two thirds of shoppers walked away.
All case studies
The situation
Aurora sells a small, considered range of homeware through one online store and one physical shop. Roughly 40,000 people a month were reaching the site, mostly from organic search and a well-run Instagram account, and around 12% of them were adding something to a cart. That is a healthy number for the category. The problem sat entirely after that point: of every hundred carts created, only around eighteen turned into an order.
The team's assumption, understandably, was a pricing problem. Discount codes had been tried, then free delivery thresholds, then a retargeting budget. None of it moved the number more than a percentage point, because none of it addressed what was actually happening — people were being asked to do too much work at the exact moment they had already decided to buy.
Before touching any design, we ran session recordings across two weeks and 1,200 checkout attempts, and mapped every point at which someone stopped. The pattern was blunt: 46% of losses happened on the account creation screen, and a further 22% on the step where delivery cost first appeared.
What the audit found
The account wall
A mandatory account was created before payment could be taken. This is usually justified internally as building a customer database, but it converts a two-minute purchase into a sign-up flow with a password policy. Nearly half of everyone who abandoned did so on that single screen, and the recordings showed the same behavior repeatedly: read the screen, scroll for an alternative, leave.
Cost revealed too late
Delivery was calculated after the address form. People had already invested three minutes before learning the real total. Unexpected extra cost is consistently the most-cited reason for abandoning a purchase online, and it does more damage than the cost itself — it reads as a trick, which affects whether someone returns at all.
Every step a full page load
Each of the five steps was a server-rendered page. On a mid-range Android over 4G, that meant between 1.4 and 2.8 seconds of blank screen per step, five times, with any validation error costing a further round trip and often clearing the fields below it.
No sense of progress
There was no indicator of how many steps remained. On mobile the payment fields sat below the fold with no visual cue that anything followed, so a proportion of people simply believed the process had stalled.
What was broken
- Five separate checkout steps, each one a fresh page load.
- An account had to be created before payment, with no guest option.
- Delivery cost only appeared on the final screen, after the address form.
- On phones the payment fields sat below the fold with no visible progress.
What we changed
Two steps instead of five
Address and payment collapsed into a single scrollable panel with inline validation, so nothing reloads and nothing is lost on a mistake.
Guest checkout first
Account creation moved to after the order is placed, offered as a one-tap opt-in rather than a gate.
Honest totals early
Delivery and tax shown in the cart, before anyone starts typing. Surprise costs are the single most cited reason people abandon.
The technical detail
The specific decisions behind the numbers, in plain language.
Single-page checkout with optimistic validation
Address and payment collapsed into one scrollable panel. Fields validate on blur against the same rules the server uses, so an error is shown within milliseconds, in place, without a reload and without clearing anything the customer already typed.
Address autocomplete
A ZIP code lookup replaced six free-text fields with one input and a picker. Median time from starting the address to completing it dropped from 71 seconds to 19, and address-related delivery failures fell alongside it.
Correct input types and autofill hints
Every field carries the right inputmode and autocomplete token, so phones show the numeric keypad for card entry and offer saved details. It is a small, unglamorous change that measurably shortens the flow on mobile.
Totals computed in the cart
Delivery and tax are resolved from a coarse location signal as soon as the cart is opened, then refined once the real address is known. Nobody reaches the payment field without already knowing the number they will be charged.
Performance budget enforced in CI
The checkout route is capped at 180KB of JavaScript and a 2.5s largest contentful paint on a throttled mid-tier device. A pull request that breaks the budget fails the build rather than quietly regressing the number over a year.
How it ran
Audit
Session recordings, funnel instrumentation, twelve moderated tests on real phones, and a full performance trace of each existing step.
Design
Flow rewritten as a single panel, tested as a clickable prototype with eight customers before a line of production code was written.
Build
Implementation behind a feature flag, running in parallel with the old checkout so it could be switched off in seconds.
Measure
Split test, weekly readouts, then a full rollout and a written handover of what to watch and why.
How we measured it
The rebuild ran as a 50/50 split test against the existing checkout for six weeks, covering roughly 4,800 sessions per variant — enough to reach significance on completion rate without extending the test into the seasonal peak, where behavior changes.
Completion rate rose from 18.2% to 23.1%, a 27% relative increase, with a 95% confidence interval that did not cross zero. Cart abandonment fell 41%. Median time from cart to confirmed order dropped from 4m 12s to 1m 48s.
Two secondary effects mattered as much to the business: refunds tied to wrong addresses fell by a third thanks to the ZIP code lookup, and the proportion of customers opting into an account after checkout was higher than the proportion who had been forced into one before it.
checkout completion
cart abandonment
faster to first payment field
“We assumed people didn't want the products. They wanted them — they just didn't want the form.”
What we took from it
- A conversion problem near the money is almost never a pricing problem first — check the form before you discount.
- Forced account creation costs more customers than the customer data is worth.
- The cheapest performance win in commerce is not loading a new page for every step.