Green Jardin — omnichannel CBD retail
A live CBD retailer with a Shopify storefront and a physical tea salon in Palaiseau — plus a private staff platform I built solo to connect the counter to the web: real-time TV menu, gram-scale POS, 14% loyalty, and Shopify price sync.
Storefront with Ino Digital. Staff platform, POS, loyalty engine, and Shopify bridge — designed and built by Elias. Internal tooling is not publicly linked.

The client
Green Jardin is a premium CBD retailer operating both online and in-store — flowers, resins, puffs, oils, cosmetics, and accessories. Products are lab-certified, THC ≤ 0.3%, and sourced from European growers. The physical location doubles as a tea salon at 2 Bis Rue Léon Blum, Palaiseau (91), rated 4.8/5 on Google.
The business needed more than a web shop: staff sell by the gram at the counter, customers see prices on a TV menu, and the online catalogue must stay aligned with what happens in the store.
Use case — landing page to counter
A customer discovers green-jardin.fr, browses product universes, and checks trust signals — lab certification, Google rating, loyalty programme. When they walk into the tea salon, they see the same live product board on the in-store TV: prices, categories, and promotions pulled from the same real-time source, embedded on the public site via a secured iframe.
At checkout, staff run a three-column POS — customer, products, payment — while the TV greets the client by name, shows their building basket, and displays their 14% loyalty balance. Card payments go through a SumUp terminal; cash is supported too. After the sale, a branded receipt lands in their inbox. None of this touches the Shopify checkout flow — it is a parallel in-store stack built for gram-scale retail.
When prices change at the counter, staff compare in-store values against the Shopify catalogue and push corrections in one click — so the landing page and the boutique never drift apart.
Before vs after — in-store ops
The staff platform replaced manual workflows that broke under rush hour. Same team, same boutique — a different operating model.
Before
- Prices updated separately on the counter board and in Shopify — mismatches found by hand.
- Staff called out prices verbally; customers had no live view of their basket.
- Loyalty tracked informally — no wallet balance at the counter.
- Receipts handed on paper or not at all.
After
- One in-store menu drives the TV, POS, and a Shopify bridge that compares and fixes prices in one click.
- POS checkout pushes a live cart overlay to the customer-facing TV in real time.
- 14% cashback wallet with Firestore transactions that update atomically during checkout.
- Branded email receipts fired through a serverless API after each sale.
Architecture
Firebase Realtime Database is the live nerve centre: the TV menu, POS cart overlays, and the public embed all subscribe to the same stream. Firestore holds loyalty wallets and checkout transactions with atomic updates so balances never go stale mid-sale.
Firestore handles loyalty wallets & atomic checkout transactions. The TV embed on the public site reads the same RTDB stream — no second catalogue to maintain.
Serverless API routes sit between the staff app and external services — Shopify Admin GraphQL for catalogue sync, SumUp for card terminals, Nodemailer for receipts. Firebase Auth gates every staff route; the public TV embed runs in a CSP-isolated iframe so it cannot reach POS or admin surfaces.
What we shipped — storefront
The public shop is a live Shopify storefront, designed and built in collaboration with Ino Digital — product universes, age verification, trust signals, and a web-side loyalty programme. The in-store TV menu is the bridge: embedded on the site so online visitors see exactly what the boutique displays.
What I built — internal ops platform
A private React + Firebase application that staff use on shop devices only. No public URL — the platform exists to run daily operations, not to be browsed from outside.
Control hub — four entry points: TV screen, POS sale, menu editor, loyalty stats. Everything routes through the same authenticated session.
TV menu — full-screen product board by category (CBD / Neo ranges), synced in real time. Live cart overlays, customer greeting, and cashback display while they wait at the counter.
POS checkout — three-column workflow: loyalty customer → gram/pack products → payment. Guest sales supported. Every cart change propagates to the TV within milliseconds.
Loyalty engine — 14% cashback on net spend, wallet usable as discount at checkout. Firestore transactions ensure the balance updates atomically — no double-spend during concurrent edits.
Shopify bridge — side-by-side comparison of in-store menu prices against the online catalogue via Admin GraphQL, with one-click push when staff adjust a price at the counter.
Screens — public storefront
The customer-facing surfaces — Shopify theme, product catalogue, and trust positioning. Built with Ino Digital for go-live on green-jardin.fr.


Screens — in-store ops
The private staff stack — TV menu, POS, and Shopify sync panel. These surfaces are not publicly accessible; screenshots show the workflows staff run daily in the boutique.



My role
Storefront: co-designed and delivered the Shopify experience with Ino Digital — product structure, UX, and go-live on green-jardin.fr.
Internal ops platform: sole designer and developer — architecture, React frontend, Firebase data layer, serverless APIs (SumUp, Shopify GraphQL, email), iframe security model, deployment, and ongoing maintenance.
Want the full story?
Green Jardin is one of 3geeks's production ships — from a Minecraft kid to omnichannel retail systems and production AI at Nokia.