Self-initiated product conceptAndroid-first · Ghana

Ntɛm

Quick commerce designed around a Ghanaian evening.

A three-sided marketplace connecting customers, independent merchants and riders through one coherent ordering and fulfilment system.

3
Apps
Customer, merchant and rider on one component tree
30
Screens
All interactive, all reachable
97
Design tokens
Every colour pairing contrast-verified
21
Passing assertions
Order model tested before any UI existed

01 / The problem

The unit of need is not a category. It is an evening.

7:10 pm, Tuesday. Ama gets home from work. Her daughter has a fever and needs paracetamol. There are no vegetables for tomorrow’s stew. She hasn’t eaten.

Three needs, three kinds of business, one evening. Today that means a pharmacy run, a market trip and cooking — or three separate apps and three separate deliveries.

Every quick commerce app in the market solves one category at a time. Ntɛm treats the evening as the unit of need rather than the category — which means one basket containing three merchants with radically different operating realities.

MerchantItemPrepBehaviour
Yaa's ProvisionsVegetables~2 minPick from shelf
Kofi's Chop BarWaakye + tilapia~20 minCooked to order
Adom PharmacyParacetamol~3 minPick, may verify

The design question: how do you present a single, honest promise on top of three incompatible timelines?

Role

End-to-end Product Designer

Scope

Research · IA · Interaction · System · Prototype

Platform

Android-first mobile ecosystem

Market

Accra & Kumasi, Ghana

02 / Market conditions

I checked what was true before deciding what to build.

Two of my starting assumptions were wrong. Payment friction and data cost are the obvious angles for an African market — and neither survives contact with the numbers.

26.4M
Active MoMo wallets
Payment is a solved rail, not a differentiator
GH¢492.9bn
Moved in June 2026 alone
Digital money is ordinary here
$0.40
Per GB of mobile data
Among Africa's lowest — bandwidth is not the barrier
~70%
Internet penetration
Digital literacy and device range are the real constraints

The finding that shaped the strategy

Melcom wins on inventory it owns. Nobody is serving the inventory that actually feeds Accra.

Melcom launched NOWin 2026 — 20-minute delivery from 65 owned stores. Every well-capitalised competitor is building a vertically integrated supply chain. Ghana’s retail depth, meanwhile, lives in provisions shops, chop bars and neighbourhood pharmacies that no aggregator can acquire.

Catalogue breadth →Supply control →Melcom NOW65 owned storesKonzoom60-min AccraBig SampseasyBasketNtɛmaggregatedThe unowned inventoryProvisions shops · chop bars · pharmaciesthat no single retailer can acquire

Wedge 01 · Supply-side moat

The merchant network

Melcom sells its own stock. Ntɛm digitises everyone else’s. A platform that makes independent merchants operable builds a catalogue a single retailer structurally cannot match — which is why the merchant app is not a companion product, it is the product.

Wedge 02 · Demand-side experience

The multi-merchant basket

Single-vertical players cannot fulfil an evening that needs vegetables, dinner and paracetamol. The merchant network makes the multi-basket possible; the multi-basket makes the merchant network valuable. Neither works alone.

03 / Users

Designing for interaction modes, not demographics.

Two users of the same age can need entirely different interfaces; two users thirty years apart can need the same one. So each persona is defined by how they actually engage with the system — search-first, browse-and-compare, guided, interrupt-driven, glanceable.

Ama Serwaa

The Fluent Shopper · 28

“I don't want to browse. I know what I need — I need it to be here in thirty minutes.”

Interaction mode
Search-first · under 2 min
Needs
Speed, saved payment, one-tap reorder, an ETA she can trust.
Design response
Prominent search, persistent basket bar, MoMo as the default rather than an option.

Kwame Boateng

The Deliberate Provider · 36

“If I see one price in the store and another at the end, I won't come back.”

Interaction mode
Browse-and-compare · 10–20 min
Needs
Unit prices in local measures, transparent totals, no surprises at checkout.
Design response
Store subtotals, olonka/bowl pricing, the single delivery fee shown in the basket.

Auntie Efua Mensah

The Assisted Newcomer · 54

“If I press the wrong thing, will my money go?”

Interaction mode
Guided and linear · deliberate
Needs
Large targets, plain language, one action per screen, no way to lose money.
Design response
17px base body, buttons that state their consequence, full refund on timeout.

Why Auntie Efua matters

Designing for her raised the floor for everyone. Every clarity decision made for her — plain labels, explicit confirmation, honest totals — measurably reduced friction for Ama and Kwame too. She is not an edge case. She is the reason the product is usable.

The supply side · four more interaction modes

Yaa Darko
Provisions shop · Madina
Batch management

High SKU count, steady volume. Sets up in bulk, then manages exceptions.

Kofi Owusu
Chop bar · Osu
Interrupt-driven

Cooks alone. Must accept or decline in under five seconds, mid-service.

Ibrahim Alhassan
Rider · Nima
Glanceable

One-handed, phone mounted, in traffic. Navigates by landmark, not street.

Selorm Agbeko
Part-time rider · Achimota
Guided step-through

New to the work. Needs the app to teach the job, not assume it.

04 / Architecture

One decision that makes everything else possible.

A naive system delivers three times, charges three fees and knocks on the door across an hour. The fix is not a screen — it is how the order itself is shaped.

ORDER #NT-4471GH¢137.00 · 1 address · 1 feePARTITIONYaa's Provisions3 itemsown status · own totalPARTITIONKofi's Chop Bar1 item · 20 min prepown status · own totalPARTITIONAdom Pharmacy1 itemown status · own totalDelivery job · sequenced pickupsAdom → Yaa → Kofi (longest prep last)One partition can fail without touching the othersFailure isolation, per-store tracking, partial refunds and merchant privacyall fall out of this structure rather than being engineered one by one

Each merchant owns a partition, not a slice of a flat list. The customer sees one basket; the system holds three independently addressable objects under it.

CustomerAmaPlatformNtɛmMerchantYaaRiderIbrahimEXCEPTION — RESOLVED BEFORE IT REACHES THE RIDERPlaces multi-merchant orderConfirms one promise: 7:45 pmDispatches partitionAccepts · sets prep timeItem unavailable + substituteSubstitution choice · 4:00 windowAccepts substituteUpdates pickup list silentlyCollects in sequenceDelivers · single arrivalAma made one decision. Yaa tapped one button. Ibrahim followed one list.Every piece of coordination happened in the middle.

One order moving across three applications. The platform absorbs the complexity so the edges stay simple.

Information architecture · 30 screens

Categories lead and merchants follow. Ama knows she needs paracetamol, not which of eleven pharmacies stocks it — requiring users to understand the supply chain before they can shop would make the platform’s differentiator the customer’s problem.

Customer
Ama
15
Home
Search
Category
Storefront
Basket
Checkout ×3
MoMo
Tracking
Substitution
Delivered
Account
Merchant
Yaa · Kofi · Adom
9
Orders queue
Incoming
Order detail
Out of stock
Inventory
Edit product
Insights
Store
Rider
Ibrahim · Selorm
6
Go online
Job offer
Active run
Handover
Earnings

05 / Interaction design

Solving the three unsolved screens of quick commerce.

Most screens in a commerce app are solved problems. A product page is a product page. Three screens here are not, because no existing app has to answer what they answer.

7:14MTN 78%
Your basket
🏪
Yaa's Provisions
Madina · 2.4 km · Ready in 5 min
Tomatoes
1 olonka · GH¢25/olonka
GH¢25.00
Onions
2 kg · GH¢7.50/kg
GH¢15.00
Garden eggs
1 bowl · GH¢12/bowl
GH¢12.00
Store subtotalGH¢52.00
🍲
Kofi's Chop Bar
Osu · 6.1 km · Cooks in ~20 min
Waakye + grilled tilapia
1 plate
GH¢55.00
Store subtotalGH¢55.00
💊
Adom Pharmacy
East Legon · 1.1 km · Ready in 3 min
Paracetamol suspension
1 bottle
GH¢18.00
Store subtotalGH¢18.00
Items (3 stores)GH¢125.00
DeliveryGH¢12.00
TotalGH¢137.00
One delivery fee for three stores. Shown here, not at checkout.
Continue to checkout ›

Screen 01

The multi-merchant basket

One basket, one title. The plural would undo the entire premise — Ama is placing one order for one evening.

  • The store card is the partition made visible

    Grouping is not cosmetic. It is the same boundary that later lets one store fail without taking down the order, so the user learns the structure while shopping calmly.

  • Price per unit, in local measures

    1 olonka · GH¢25/olonka. Kwame buys in olonka, bowl and paint rubber, not kilograms. Metric units would be a translation, not a design.

  • Prep time on the card, not at checkout

    Ordering hot food is a choice about time, and that choice belongs where it is made.

  • The delivery fee lives here

    Late-revealed costs are the most common trust failure in commerce — and one fee for three stores is the clearest proof of value, so burying it would hide the argument.

Screen 02

The adaptive delivery choice

An adaptive system is by definition invisible. If the customer can’t see it, it can’t build trust — and if you expose the algorithm, you’ve built a logistics dashboard rather than a shopping app. Naming the preference is the narrow path between them.

SYSTEM DECIDES — INVISIBLESequenced pickupTimed pickupSplit dispatchHub consolidationSelected on prep-time variance,merchant proximity, distance, rider supplyCOLLAPSE TOBring everything togetherArrives about 7:45 pm · GH¢12.00Bring things as they’re readyFirst 7:28 pm · Last 7:50 pm · GH¢18.00CUSTOMER CHOOSESExpose the preference. Hide the logic.She chooses an outcome; the system chooses the method.The engine can be rewritten and this screen never changes,because it was never describing the mechanism.

Screen 03 · the hard one

The substitution exception

Money has already left. A child is sick. A rider is waiting. And the person on the other end may never have completed a purchase in an app before.

  • Scope before problem

    “One item is not available.” The first three words say this is small. “There’s a problem with your order” spikes anxiety before she has read anything.

  • The merchant suggested it, and is named for it

    Yaa knows her shelf; the platform doesn’t. The merchant app will not let her flag an item without either offering a substitute or explicitly confirming there is none.

  • The refund is a number, before the decision

    GH¢4.00 comes back to your MoMo. Exact amount, named destination, present tense. An unquantified refund is a lost one.

  • Buttons are answers, not commands

    “Yes, send the aubergine.” Each button contains its full consequence, so a skim cannot produce an expensive mistake.

  • Inaction is safe, stated plainly, and costs nothing

    If she is busy with a feverish child and never opens it, the item is removed and she is refunded in full. She cannot lose by hesitating.

Most commerce apps default the other way: silence means the substitute ships. That optimises basket value at the cost of trust — the wrong trade in a market where one bad story travels a neighbourhood faster than any advertisement.

Tracking · order in progress
One item is not available
Yaa’s Provisions
3:12
Garden eggs
1 bowl
GH¢12.00
Yaa suggests instead:
Aubergine
1 bowl
GH¢8.00
GH¢4.00 comes back to your MoMo
Yes, send the aubergine
No — remove it, refund GH¢12.00
Cancel Yaa’s Provisions (refund GH¢52.00)
Your food and medicine are not affected — they’re on the way.
If you don’t reply in 3:12, we’ll remove the item and refund you GH¢12.00 in full.

06 / Interactive prototype

Test the live React prototype.

Not a click-through. Three real apps sharing one order object — act as the merchant and the customer’s screen changes.

Live interactive prototype

Three apps, one live order

Switch apps with the tabs on the phone. The order follows you — accept as the merchant and the customer’s tracking screen updates.

Loading Ntɛm…

400 × 820 · Pixel-class Android

Try this

  1. 1

    Customer — Build a basket across three stores, then pick a delivery outcome at checkout.

  2. 2

    Merchant — Accept as Yaa, Kofi and Adom. Then mark an item out of stock and offer a substitute.

  3. 3

    Customer — The exception is waiting on Tracking, with a live four-minute countdown.

  4. 4

    Rider — Go online. The run is sequenced so the chop bar is collected last.

Do nothing when the substitution appears. It removes the item and refunds in full — inaction is always the free, safe outcome.

07 / Design system

Warm and local, because the strategy is.

Every quick commerce app in the region looks the same: blue or green, white, high-gloss, imported. A product whose differentiator is local supply cannot look like it was designed somewhere else. The palette comes from where the product operates — the clay-red of laterite roads, the deep green of plantain and garden eggs, the gold of late Accra afternoons.

Clay Red
#B4441F
Primary · buttons and brand
Forest Green
#1B5E43
Success · delivered and healthy
Gold Accent
#E39B26
Accent only · never text
Warm Ink
#231A14
Primary text · 17.08:1
Warm Sand
#FDF9F5
App background surface

Contrast was measured, not assumed

Riders work outdoors in Accra sun and customers check ETAs on the street, so every pairing was computed against WCAG 2.1 rather than eyeballed.

PairingSampleRatioWCAG 2.1
ink-900 on sand-050GH¢137.0016.31:1AAA
green-600 on sand-050GH¢137.007.35:1AAA
white on clay-600GH¢137.005.54:1AA
clay-700 on clay-050GH¢137.006.47:1AA
red-600 on red-050GH¢137.004.64:1AA
gold-500 on whiteGH¢137.002.34:1FAIL

The gold problem

Gold scores 2.34:1 against white — it fails as a text colour and as a button fill. Darkening it until it passed would have produced a muddy brown that lost the quality worth having. So the constraint is documented and enforced instead: gold is a surface and an accent, never a text colour and never a primary button.

A design system’s job is to record where the brand and accessibility disagree, and to decide once, in public, rather than repeatedly and quietly in individual screens.

One system, three characters

The three apps share tokens but not personality. Kofi accepts orders between serving customers, so density is respect for his time. Ibrahim reads at a glance while moving, so sparseness is safety. Ama browses, so imagery is the point.

Customer
A market you can browse
Density
Comfortable
Body
17px
Targets
48dp
Imagery
Product-led
Merchant
A tool behind a counter
Density
Compact
Body
15px
Targets
48dp
Imagery
Minimal
Rider
A dashboard at speed
Density
Sparse
Body
19px
Targets
64dp
Imagery
None

Inter, chosen for a linguistic reason

The product is named Ntɛm, and the character ɛ (U+025B) is essential to Twi orthography alongside ɔ. Many popular UI typefaces lack these glyphs or fall back in ways that break the line. A product named in Twi cannot use a typeface that cannot spell its own name.

17px body, 48dp targets

One pixel above the conventional 16, applied everywhere, measurably eases reading for Auntie Efua and costs the other personas nothing. Targets sit above the 44dp convention because she taps deliberately and imprecisely, and Ibrahim taps one-handed on a mounted phone. Accessibility gains are usually made in decisions this small.

08 / Process

Eight phases, each closing on a deliverable.

01
Framing
Market conditions, competitive position, the three-sided premise
02
Users
Seven personas defined by interaction mode, not demographics
03
Journey
The hero evening, adaptive fulfilment, the failure path
04
Architecture
IA across three apps, the order partition model
05
Interaction
Annotated wireframes for the three unsolved screens
06
System
97 tokens, verified contrast, three app characters
07
Motion
10 animations, 39 SVG assets, reduced-motion audit
08
Prototype
React + Vite, 30 screens, one shared order object

The model was tested before any UI existed

The order reducer went through 21 assertions in Node before a single screen was built — including the one that matters: cancelling one store refunds exactly that store’s subtotal and leaves the other two partitions intact. If that hadn’t held, the substitution screen would have needed special-casing at every layer.

Building it found a design bug

The rider never received a job. A run is only built once every merchant accepts — but the merchant app initially exposed only two of the three. The flow diagram had been correct and the implementation was not, which is the argument for prototyping in code rather than in frames.

Scope, honestly

Static mock data, no backend, no persistence. This is a concept project: the deliverable is the interaction model and the cross-app choreography, not the plumbing. Next step is moderated testing with Ghanaian users against the live build.

09 / Principles

Clear decisions at the edges. Complex coordination in the middle.

Principle 01

Expose the preference, hide the logic

Four routing models sit behind the checkout screen, chosen on prep-time variance, merchant proximity, distance and rider supply. Ama sees none of it — she answers one question: together, or as it comes? The engine can be rewritten without the interface changing, because the interface was never describing the mechanism.

Principle 02

The order partition is the architecture

Each merchant owns a partition rather than a slice of a flat list. That one decision is why failure isolation, per-store tracking, partial refunds and merchant privacy fall out of the model instead of being engineered individually. Cancel one store in the prototype and the other two stay intact.

Principle 03

Inaction is always the free, safe outcome

When an item goes unavailable after payment, silence removes it and refunds in full. The system never spends her money on something she didn't confirm. Most apps default the other way, optimising basket value at the cost of trust — the wrong trade in a market where digital commerce is still earning credibility.

Principle 04

Layer depth, don't branch modes

One app serves every fluency level through progressive depth rather than a simplified mode. Fluent users travel further per tap; nobody is segregated. The same pattern carries into the merchant and rider apps, where one shared core does the essential job and additional structure waits for those who need it.

Principle 05

Resolve exceptions where the knowledge is

A merchant marking something unavailable must suggest a substitute or explicitly decline one — she knows her shelf, the platform doesn't. The rider never meets the problem as a decision, only as an updated list. Complexity is absorbed in the middle so the edges stay simple.

Principle 06

Every cost appears before the decision that incurs it

Delivery fee in the basket, prep time on the store card, refund amount above the buttons. Late-revealed costs are the most common trust failure in commerce — and one fee for three stores is the clearest proof of the product's value, so burying it would hide the argument.

Continue exploring

More systems, products and design decisions.