Case study · Student project · Mobile app

Shopper App

A grocery comparison app for newly arrived expats in the Netherlands, designed to find familiar products, compare prices, and shop in Dutch supermarkets without the friction.

Role
UX/UI Designer & Front-End Dev
Team
Back-end developer, HR department
Built with
Ionic Angular & Bootstrap
Delivered
Shipped to production
The challenge

Every grocery comparison app in the Netherlands was built for Dutch speakers.

Six grocery comparison apps already existed in the Netherlands when this project started. All of them were Dutch-only, browser-based, and missing the features users kept asking for in interviews:

  • English support.
  • A store locator.
  • Coverage of Asian, Polish, and Turkish supermarkets.
  • A real mobile experience instead of a desktop site opened on a phone.

The market gap was not technical. No one had designed for this user yet.

"Most participants were already looking up prices on store websites before leaving the house. It worked, but it was slow and spread across four or five different sites."

from interview notes
UX approach

Start with the person, not the product gap

I worked from real expat behaviour, through a market and problem definition, into testing before and after launch. Open any method for the full detail.

01

Discover

Understanding the user

02

Define

Structuring the problem

03

Validate

Testing the solution

What I designed

The final screens, and what shaped them

Each core screen went through several rounds of usability testing and iteration. A few of the changes that came out of those rounds:

Onboarding screen listing nearby stores Albert Heijn, SPAR and Amazing Oriental with walking, driving and transit times, and an Allow location permission checkbox
Onboarding

Selling the benefit, not the feature

The onboarding leads with a clearer image of what the app is for, and the copy was rewritten around what users gain, the distance and travel time to nearby stores, instead of the technical permission it asks for.

benefit first,
jargon later
Home screen with a Hey there greeting, an expandable search bar, category buttons, and a labelled Home and Grocery list navigation bar
Home

A header built for the thumb

The intro copy was chosen from a preference test, and the search bar grew into a larger, expandable header that sits within thumb reach. Category buttons were enlarged and the navigation icons gained clear text labels.

search bar in
the thumb zone
Search results for milk showing Cheapest and Nearest tags, prices per litre, and a simple add-to-list button on each item
Search results

Cheapest and nearest, at a glance

Results moved the search bar clear of the camera island, sharpened the product text, and emphasised the Cheapest and Nearest tags that set the app apart. The add-to-list button was enlarged and simplified after an expert review mistook the old one for a paste button.

tags that do
the comparing
Shopping list grouped by store and aisle category with quantity steppers, discount markers, and a Clear list button
Shopping list

Grouped by store, ready to shop

Items are grouped by store and aisle category, so everything in one section can be grabbed at once, with collapsible groups for long lists. The intimidating delete button became a plainer clear list.

shop one
aisle at a time
Design impact

A clear gap, filled for a user no one had designed for

Shipped product impact
bolt
40% Faster grocery comparison
star
3.9 / 5 Usefulness rating
group
45 Post-launch survey users

The existing apps were not just incomplete. They were designed for a completely different user. Filling the gap well meant understanding why those gaps existed in the first place, then designing directly for the person no one had built for.

The challenge

Every grocery comparison app in the Netherlands was built for Dutch speakers.

Six grocery comparison apps already existed in the Netherlands when this project started. All of them were Dutch-only, browser-based, and missing the features users kept asking for in interviews:

  • English support.
  • A store locator.
  • Coverage of Asian, Polish, and Turkish supermarkets.
  • A real mobile experience instead of a desktop site opened on a phone.

The market gap was not technical. No one had designed for this user yet.

"Most participants were already looking up prices on store websites before leaving the house. It worked, but it was slow and spread across four or five different sites."

from interview notes
Understand the user

Ten interviews to turn a vague gap into a feature list

User interviews

I did ten interviews with newly arrived expats in the Netherlands. The market gap was easy to describe but hard to specify, so the interviews were meant to turn it into a list of features people would actually use, ranked by importance.

User persona built from interviews with 10 expat participants, showing shopping behaviour, constraints, and goals
User persona built from interviews with 10 expat participants.
User journey map showing the steps an expat takes when buying groceries in the Netherlands, with frustrations at each stage
User journey map showing the steps an expat takes when buying groceries, with frustrations at each stage.
Market analysis

Six apps in the market. None of them built for this user.

Six grocery comparison apps existed in the Netherlands at the time of the project. The market gap was specific: English support was completely absent across all six, and only one had any mobile experience worth calling that.

The MVP scope followed directly from this. Anything an existing app did well was treated as a baseline, and anything no existing app did was a candidate for the MVP. The five features chosen for the MVP were the five that none of the existing apps covered well.

Competitor analysis of six grocery comparison apps in the Netherlands, scored across language support, mobile experience, store coverage, and key features
Competitor analysis of six grocery comparison apps, scored across language support, mobile experience, store coverage, and key features.
Design

From flow chart to sketches to high-fidelity

UX flow chart

Before drawing any screens, I mapped the full navigation structure in a UX flow chart. The app had to be simple enough for a first-time user to move through without instruction, especially someone unfamiliar with Dutch app conventions. That is harder to design for than it sounds across multiple languages and user contexts.

UX flow chart showing the full navigation structure of Shopper App before any screens were designed
UX flow chart mapping the full navigation structure before any screens were designed.

Sketches and hi-fi

The sketching phase was four iterations. The reason for staying low-fidelity that long was that the screens would depend on the data structure of the Shopping Scraper API, which the back-end developer was still building, and committing to high-fidelity too early would have wasted work.

When the API structure stabilised, I moved to high-fidelity in Figma across three core flows: onboarding, search-to-list, and the shopping list view. The design system was small, twelve components built from scratch for this project, and biased toward accessibility from the start because the WCAG-AA requirement was a fixed constraint.

Development

Front-end built in Ionic Angular, connected to a custom Shopping Scraper API

I built the front-end in Ionic Angular and Bootstrap, alongside an in-house back-end developer who built the Shopping Scraper API and the database. Owning the front-end myself meant no handoff gap. Every design decision landed in code as intended, and anything that looked good in Figma but was awkward to build got caught early enough to fix.

A few interactions got simplified during the build. The simpler version usually worked better for users anyway.

C4 architecture diagram showing how Shopper App's front-end, Shopping Scraper API, and database connect
C4 architecture diagram showing how the front-end, Shopping Scraper API, and database connect.
Testing

Testing the design, before and after launch

Usability testing

Two rounds of usability testing with five users each. Round one tested the core flows, and two findings shaped the next iteration: the search bar was too small for one-handed use on the bus, where most testers said they actually used grocery apps, and the navigation icons were not recognisable to first-time users unfamiliar with Dutch app conventions.

Round two tested the revised flows. The thumb-zone search header tested cleanly, and so did the navigation icons with text labels. The only new finding was small, some label wording and one error message, fixed before launch.

Expert review

A heuristic evaluation by an external designer, done after round two, brought a different lens: consistency, terminology, error handling, and accessibility compliance. It found one thing the usability testing had not: the original add-to-list button looked like a paste button, and the error message wording was technical in two places.

Post launch

After launch, a survey of 45 users structured around Peter Morville's UX Honeycomb (useful, usable, findable, credible, desirable, accessible, valuable) put the strongest scores on usable and findable, the two dimensions the design had focused on most. The weakest was desirable: the app was useful but not loved, and the onboarding step scored lowest.

WCAG 2.1 compliance checklist results for Shopper App, verified with Google Lighthouse
WCAG 2.1 compliance checklist results, verified with Google Lighthouse.
UX evaluation results mapped against the UX Honeycomb framework, combining usability test and post-launch survey data
UX evaluation mapped against the UX Honeycomb framework, combining usability test and post-launch survey data.
Reflection

What this project taught me

Owning both design and front-end changed how I approached the UX work. Knowing I would build it made me more careful about decisions that would be hard to implement. That constraint improved some of the solutions. Things that looked elegant in Figma got simplified once I built them, and the simpler version almost always worked better for users.

Next case study

Moodlet stress tracker

View case study →