
Gold & jewellery commerce, retail and wholesale
BTC
Two apps from one Flutter codebase for one of Egypt's largest gold and jewellery houses: a consumer storefront and a B2B wholesale ordering app, both over the same GraphQL API.
The challenge
The same business sells a 1,200 EGP gift to a walk-in customer and a 50-gram ingot to a merchant, on prices that move with the gold market. Two audiences, two buying flows, one catalogue — and a company that did not want two engineering efforts.
What it had to do
- A retail storefront and B2B wholesale ordering from one catalogue
- Prices that move with the gold market
- Delivery country and language chosen per visit, so a price doesn't change at checkout
- One engineering effort, not two
My role
Product engineer on both apps and the shared codebase behind them.
How I built it
- Built the customer storefront — collections, categories, a savings calculator, cart and checkout — with per-visit delivery country and language.
- Built the B2B merchant app for wholesale ordering from the same codebase and the same catalogue.
- Integrated both against a GraphQL API so a price or a product exists once and both apps read it.
- Shipped both to the App Store and Google Play.
Decisions, and why
One codebase, two products — not one app with a switch
Retail and wholesale share a catalogue and nothing else: different prices, different quantities, different checkout. A single app gated on an account type would have put wholesale pricing one bug away from a consumer's screen. Two builds from one codebase keeps the shared model shared and the flows genuinely separate.
GraphQL, because the two apps ask different questions of the same catalogue
The storefront wants a product with images and a retail price; the merchant app wants the same product with tiers and stock. Against REST that is either two sets of endpoints or over-fetching on both sides. One graph lets each app ask for the shape it renders.
Country and language as a per-visit choice, not a device setting
Delivery country decides price and availability, and the buyer is not always in the country they are shipping to. Making both explicit selectors in the header — rather than inferring from the locale — avoids quoting someone a price that changes at checkout.
Stack
From the product
Each caption describes what the screen is doing — several of these products have an Arabic-only interface.



See it live
Building something like this?
Tell me what you are trying to ship and I will tell you, honestly, whether I am the right person to build it.
Hire me for the same thing