Orto va in città
One hub and two bots for an organic greengrocer in the centre of Naples that already sold on WhatsApp. We designed the system and led the project; every product, price and delivery day the bot tells a customer comes from the shop’s own data.

Client
L’orto va in città, organic km0 greengrocer
Napoli
Role
Lobos Design: product design, bot behaviour, development and project lead
- Timeline
- 2026 · real-customer beta since September
- Deliverables
- Management hub
- WhatsApp sales bot
- Telegram warehouse bot
- Storefront
- Design system
- Bot behaviour
Results
- Products in the hub, across four categories
- 192
- Postcodes served, grouped into four delivery bands
- 116
- Ready answers the shop edits itself
- 104
- Behaviour rules, written as data, not code
- 15
A shop that already sold on WhatsApp
The customers were there. The system behind them was a phone, a Shopify site and paper notes.
L’orto va in città is a small km0 organic greengrocer in the centre of Naples. Customers were already ordering on WhatsApp, on Simone’s own number, and the shop was drowning in it. Orders were scattered across chats, stock never matched Shopify, delivery cost more than customers paid, and the owner answered the same questions all day. The budget was tiny and the produce is fresh and sold by weight. The brief was not a new channel. It was to keep the conversation customers already liked, and put one reliable system behind it.
- 11Cassette dell’OrtoFixed boxes. Their composition is recalculated from live stock every day.
DisponibileRaccolto BaseSingle o coppie, cucina veloce30,00 €Composizione dal magazzino
DisponibileSapori del SudChi ama i sapori tradizionali35,00 €Composizione dal magazzino
DisponibileOrto ArmoniaFamiglie piccole40,00 €Composizione dal magazzino
DisponibileMondo SolidaleSpesa con valore sociale40,00 €Composizione dal magazzino
DisponibileZuppe e MinestroniCucina slow, piatti caldi45,00 €Composizione dal magazzino
DisponibileOrto Vegan GourmetSpesa vegana completa50,00 €Composizione dal magazzino
DisponibileSalute & BenessereAlimentazione funzionale50,00 €Composizione dal magazzino
DisponibileGrande FamigliaNuclei numerosi60,00 €Composizione dal magazzino
DisponibileCampania d’EccellenzaGastronomia campana80,00 €Composizione dal magazzino
DisponibileOrto Vegan DeluxVegano d’eccellenza80,00 €Composizione dal magazzino
DisponibileGran Dispensa Deluxe FamilyGrandi pranzi e occasioni150,00 €Composizione dal magazzino
DisponibileRaccolto BaseSingle o coppie, cucina veloce30,00 €Composizione dal magazzino
Shopify · ortovaincitta.it


Before · four places, no single truth
Orders
Where it lived
Simone’s personal WhatsApp
What it cost
Scattered across chats, rebuilt by hand
Stock
Where it lived
Shopify and paper notes
What it cost
Never matched the shelf
Delivery
Where it lived
The owner’s head
What it cost
Cost more than customers paid
Answers
Where it lived
Simone, all day
What it cost
The same questions, every day
One hub replaced all four.
The bot never invents
A model that can only speak about rows it has just read, and an owner who always has the last word.
The catalogue never enters the prompt. The model calls typed tools that return a few real rows, so it cannot quote a price it has not seen or promise a day the shop does not deliver. Every order waits for Simone’s confirmation before it is final, and 27 of the 104 ready answers hand the chat straight to him. To make this visible we designed Chat di prova: the conversation on one side and, next to it, every call the bot made to the hub. That is how the shop sees whether the bot understood or guessed. The storefront has no checkout either: its cart composes a WhatsApp message, so ordering stays a conversation.

The control around the model
- «mi servono 2 kg di pomodori»
- 01GateIn test mode it answers only authorised numbers.
- 02BehaviourRules, dictionary and tone are written by the shop, live on the next message.
- 03ModelIt reads only the rows its typed tools return. The catalogue never enters the prompt.
- 04Handover27 of 104 ready answers pass the chat to Simone. A missing text is never invented.
- 05OwnerNo order is final until Simone confirms it.
- Reply, built from hub data only
Vetrina · app.ortovaincitta.it
1,000+ products, search and categories.

Il tuo ordine
No checkout. The cart becomes a WhatsApp message.

What Simone sees every morning
A Medusa.js hub, translated into the shop’s Italian and designed tablet first.
We chose Medusa.js as the hub: open source, no licence fees, native products, stock and orders, and a path to replace Shopify. On top of it we designed the pages a greengrocer actually needs. Cruscotto opens with what needs a decision: orders to confirm, today’s deliveries with a quick «Consegnato», the week at a glance. Magazzino puts problems first, sold out, below threshold, expiring, to sell quickly, then stock and a log that shows who wrote what and from where. Phone and in-store orders go through «Nuovo ordine», which runs the same checks as the bot. Every English string from Medusa was translated or removed.




One hub, every touchpoint
Medusa.js, extended for a greengrocer
Customers
- WhatsAppBot Vendita
- app.ortovaincitta.itVetrina
- ortovaincitta.itShopify site
- In shop, by phoneNuovo ordine
hub.ortovaincitta.it
Medusa.js + custom pages
- Cassette dell’Orto
- Freschezza
- Magazzino
- Ordini
- Clienti
- Consegne
- Carnet e coupon
- Centro di controllo
- Utenti e ruoli
- Italiano, tablet first
LLM · typed tool callsnothing written without a «sì»
Shop
- TelegramBot Magazzino
- OwnerSimone
- MarketingCampagne, Google Ads
Two bots, two channels
Customers on WhatsApp, the warehouse on Telegram, and nothing written until someone replies «sì».
The sales bot runs on the shop’s own WhatsApp number, alongside the Business app. It reads the customer, searches the catalogue, proposes delivery days by postcode and prepares the order. The warehouse bot started on WhatsApp and moved to a Telegram group, which keeps the internal channel away from customers and gives groups and buttons for free. Operators write or send voice notes the way they speak: «so’ arrivate 20 kg di fichi». The bot turns that into proposed loads, arrivals and freshness changes, and writes nothing until someone answers «sì». Creating new products from chat is out of scope on purpose.

The leak, and how we closed it
Fresh produce does not wait for the paperwork.
Before
- 01An arrival landsNobody writes it down. The kilos live in a head or on paper.
- 02Stock driftsShopify says one thing, the shelf another.
- 03Produce ripens unseenFigs and greens turn while nobody is offering them.
- 04Thrown awayFood in the bin, money lost, and deliveries priced below their cost.
With the hub and the bots
- 01A voice note«so’ arrivate 20 kg di fichi» from the shop floor.
- 02A human «sì»The bot proposes the move, nothing is written until someone confirms.
- 03The hub flags itIn scadenza, da vendere velocemente, sotto soglia, esaurito.
- 04The bot sells it firstCustomers are offered what must go today. Delivery is priced by band.
Up to three summaries a day tell Simone what is running out and what has to sell today.
- Arrivo previstoPesche TabacchiereRegistrato da Simone · in arrivo martedì10 cass.previsto
- CaricoFichi bianchi CilentoTelegram, nota vocale · Antonio · 07:42+20 kg→ 23 kg
- FreschezzaFichi bianchi CilentoProposto dal bot · confermato «sì» · 07:43da venderevelocemente
- ScaricoMele annurcheTelegram, nota vocale · Antonio · 09:15−2 kg→ 3 kg
- Arrivo previstoFriarielli NapoletaniAtteso giovedì · il bot lo dice ai clientiin arrivogio
Riepiloghi · fino a tre al giorno
08:0013:3020:30
Magazziniere
Riepilogo delle 20:30
3 prodotti da ricaricare. 1 esaurito: Friarielli Napoletani. 2 sotto soglia: Mele annurche, Carote gialle.
Domani arrivano: Fichi bianchi Cilento 20 kg.
Behaviour as data
Rules, answers, zones and costs live in the hub, and change on the next message.
We kept the bot’s behaviour out of the code. Fifteen behaviour rules, a shop dictionary that maps Neapolitan words to products, substitutions, tone and 104 ready answers in ten categories are all edited by the shop in the hub, and take effect on the next message. Delivery follows one rule: postcode first, then days. The bot never promises a day or a time before the zone is known. The 116 served postcodes are grouped into four bands, and the cost lives on the band, not on the postcode, so changing one band moves all its zones at once. Once Simone has confirmed an order, the bot asks how the customer wants to pay.

116
Postcodes served · cost lives on the band
- Fascia 1
- Fascia 2
- Fascia 3
- Fascia 4

Tested with the people who use it
Plain Italian documents, numbered fix lists, and a beta with real customers.
Before any build we wrote six planning documents in plain Italian for Simone, from the overview to the design spec. The design starts from the Medusa UI kit with the shop’s brand on top: green, Jost for titles, DM Sans for text, soft radii, three breakpoints, and a drawer on mobile because there are too many sections for a tab bar. The build ran in numbered test rounds, each a fix list for our development team where every item carries a code, a link to reproduce it and what to do. In mid-September the beta opened to real customers, announced as experimental, because they ask the questions a team never thinks of. Next: one stock in kilos for weighed products, narrower delivery slots, and closing Shopify.
The shop’s brand on top of the Medusa UI kit
Jost · titles
DM Sans · text, tables, the bot’s chat
Desktop 1440 · Tablet 1024 · Mobile 390
- Orto green5C8E61
- Ink1D1D1D
- Muted6B6B6B
- GroundF4F4F4
- SurfaceFFFFFF



The rule behind the project
Every product, price and day the bot tells a customer comes from the hub, through a call you can inspect.
Product design, bot behaviour, development and infrastructure by Lobos Design.
Want something like this?
Tell us what you have in mind. We reply within one to two working days.
Next project
TOA — Salvatore Colantuono

