Saltar al contenido

Emotional UX in e-commerce

I took a production e-commerce template, audited what it leaves out, designed a small component system to put it back, and tested it against a live store built on the same template. Usability didn’t move. Trust and purchase intent did, and every participant preferred the redesigned store. The gap between those two results is the point of this project.

Repository (opens in a new tab)
Role
Research, design & front-end
Tools
Next.js 16 · React 19 · TypeScript · Tailwind v4 · shadcn/UI · Stripe
Timeframe
2026
Context
Master’s thesis (UNIR)

Templates optimise everything they can measure

Component-based templates are a real achievement: reusable, fast, maintainable. Your Next Store, the open-source Next.js template I worked on, loads almost instantly thanks to server components, static caching and a CDN.

But a template optimises what it can measure. Load time, bundle size and task completion all have a number. Whether a first-time visitor believes the shop will actually ship their order doesn’t. So it goes unbuilt, in this template and in every store that ships on top of it unchanged.

That isn’t a styling problem. In e-commerce, trust is what turns a visit into a payment.

A healthy score with a hole in it

I ran a heuristic evaluation across Nielsen’s ten heuristics and mapped each finding to Norman’s three levels of emotional design: visceral (first impression), behavioural (ease of use) and reflective (trust and meaning).

The global severity came out at 1.03 out of 4: a template that works. The average hid the problem. Help & Documentation scored 2.75. There was no shipping or returns policy, no visible contact and no legal pages. Almost every serious issue sat on the reflective level.

Mean severity of the audit findings per Nielsen heuristic
HeuristicMean severity (0 = no issue, 4 = catastrophic)
Help & documentation2.75
Error prevention1.75
User control & freedom1.50
Visibility of status1.25
Flexibility & efficiency1.25
Consistency & standards1.00
Error recovery0.50
Recognition vs recall0.25
Match with real world0
Aesthetic & minimalist0
Mean1.03

The template answered “how do I buy this?” perfectly. It had no answer to “should I buy this here?”

Emotional design isn’t decoration

“Emotional” usually gets read as delight: animation, warmth, personality. The audit pointed somewhere less decorative. What was missing was the reflective layer, the signals a stranger uses to decide whether a small shop is real.

Diagram: designer, product, user. The user’s response splits into Norman’s three levels — visceral (perceptually induced), behavioural (expectation induced) and reflective (intellectually induced) reactions.
Norman’s three levels. Every severity-3 finding in the audit sat on the reflective one: no returns policy, no visible contact, thin checkout validation.

So I designed for the moments where that decision happens, not for charm.

Four components, zero new dependencies

One constraint shaped everything: no libraries beyond the template’s own stack. If emotional design needs extra weight to exist, it’s the first thing to get cut. Every component extends existing shadcn/Radix primitives instead.

  • Trust bar: a Server Component. It’s visible on every page and ships zero JavaScript to the browser.
  • Product card: split into a server shell and a small client island, so a grid of thirty products ships one copy of the interaction logic, not thirty.
  • Cart drawer: built on React 19’s useOptimistic. Quantities update before the network responds and roll back automatically if the request fails. Removing an item, whether by the bin icon or by going below one, always asks first.

Before · YNS template

The template’s cart drawer: one T-shirt at $61.50, then a long empty space, a discount-code field, the subtotal, “Shipping calculated at checkout” and a Checkout button.

After · prototype component drawer

The redesigned cart drawer: “Add 12,00€ more for free shipping” above a progress bar, one ring at 48,00€, subtotal, shipping and an estimated total with VAT included, then secure payment, 30-day returns and 24/48h delivery above a “Checkout 48,00€” button.
The cart drawer with one item, before and after. The redesign shows how far free shipping is and puts payment, returns and delivery beside the checkout button. Past the threshold, the bar turns green and shipping shows as free.

Trading an inline size picker for a dialog

The prototype showed sizes directly on hover. Once built, it crowded the overlay and fought the link wrapping the card. I replaced it with a dialog that confirms automatically once every option is chosen. It’s one tap for single-attribute products, and it’s properly accessible.

State diagram of the product card. At rest it shows the main image with name, price and category. Hover darkens the image and shows an Add to cart button. Clicking Add on a product with variants replaces the button with a size selector (S, M, L, XL) and a link to the product. Mouse leave returns from hover to rest; clicking outside returns from the selector.
The product card as built. The size selector only opens for products with variants; everything else goes straight to the cart. Mouse leave and clicking outside both return to rest.

The most anxious moment is the one the store doesn’t own

The fourth component never shipped as designed. Payment is fully delegated to Stripe’s hosted checkout, and the store’s code can’t touch that page.

That turned out to be the most revealing finding of the build. The moment with the most at stake, handing over card details, happens on the one surface the store has given away. I moved the trust signals into the cart footer, the last surface the store controls before the handoff.

Flow diagram: product page (add to cart), cart drawer (review items), cart footer (checkout button), then Stripe’s hosted checkout — the one step drawn in a different colour. Stripe returns to a success page and confirms the order by webhook.
The purchase flow. The store owns every step up to the cart footer; Stripe owns the one where the card details go.

Emotional design can walk someone up to the payment step. It can’t go through it. Every delegated surface (payments, auth, embedded widgets) is a place where nobody is designing for trust.

Same template, real competitor, same people

To isolate the system, I compared it against a live jewellery store built on the same template rather than against the bare demo.

  • 6 participants, within-subjects, with the order counterbalanced (three saw each store first)
  • 4 tasks per store, each targeting one component
  • SUS, a hedonic questionnaire (emotional response, perceived trust, purchase intent) and a closing interview

What the metrics saw, and what they missed

Time to manage the cart
72sto36s
Time to find returns and payment info
30sto18s
Perceived trust, on a 7-point scale
+0.58
Participants who preferred the redesign
6/6
Usability scores were identical: 82.9 vs 83.3.

The loudest signal was the order

None of the differences reached statistical significance; with six people, they couldn’t. And one effect dwarfed everything else. Whichever store participants saw second scored about 24 SUS points higher, for all six of them. The difference between versions was under one point.

Order effect on the SUS score: each participant’s first evaluation against their second
Participant1st store evaluated2nd store evaluated
P4 · A, saw the live store first97.5100
P2 · B, saw the redesign first82.595
P3 · B, saw the redesign first7095
P6 · A, saw the live store first6590
P1 · B, saw the redesign first57.590
P5 · A, saw the live store first55100
Mean71.2595

Counterbalancing cancels that out in the averages, but it also means the usability comparison says little on its own. What survives is directional and consistent across three independent sources: the trust scores, the unanimous preference and what people remembered.

There’s also one failure worth owning. One participant removed an item from the cart and believed the task was done when it wasn’t. The confirmation dialog still isn’t clear enough.

Measure only efficiency, and you’ll only build efficiency

This study didn’t prove that emotional design sells more. It showed something more uncomfortable: the standard instrument rated both stores as equivalent, and every participant chose the same one.

What made the difference lived on the reflective level. That’s trust, and it’s exactly the dimension a usability score, a performance audit or a component library doesn’t register.

That’s the blind spot. It isn’t that teams don’t care how people feel. It’s that the tools we use to decide whether something is done can’t see it. If nobody measures trust, nobody owns it. And in a store, trust is what stands between a visit and a payment.

What I’d change

  • Remove the order effect. Replicate with a larger, pre-registered sample, or switch to a between-subjects design.
  • Measure behaviour, not intent. Track completed checkouts instead of self-reported willingness to buy.
  • Take the checkout back. Replace the Stripe redirect with embedded Stripe Elements, so the fourth component can finally be built and tested where it belongs.