Selected work

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.

Cruscotto, the hub’s morning page: takings, orders to confirm, today’s deliveries and the week

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.
  • Cassetta Raccolto BaseDisponibileRaccolto BaseSingle o coppie, cucina veloce30,00 €Composizione dal magazzino
  • Cassetta Sapori del SudDisponibileSapori del SudChi ama i sapori tradizionali35,00 €Composizione dal magazzino
  • Cassetta Orto ArmoniaDisponibileOrto ArmoniaFamiglie piccole40,00 €Composizione dal magazzino
  • Cassetta Mondo SolidaleDisponibileMondo SolidaleSpesa con valore sociale40,00 €Composizione dal magazzino
  • Cassetta Zuppe e MinestroniDisponibileZuppe e MinestroniCucina slow, piatti caldi45,00 €Composizione dal magazzino
  • Cassetta Orto Vegan GourmetDisponibileOrto Vegan GourmetSpesa vegana completa50,00 €Composizione dal magazzino
  • Cassetta Salute & BenessereDisponibileSalute & BenessereAlimentazione funzionale50,00 €Composizione dal magazzino
  • Cassetta Grande FamigliaDisponibileGrande FamigliaNuclei numerosi60,00 €Composizione dal magazzino
  • Cassetta Campania d’EccellenzaDisponibileCampania d’EccellenzaGastronomia campana80,00 €Composizione dal magazzino
  • Cassetta Orto Vegan DeluxDisponibileOrto Vegan DeluxVegano d’eccellenza80,00 €Composizione dal magazzino
  • Cassetta Gran Dispensa Deluxe FamilyDisponibileGran Dispensa Deluxe FamilyGrandi pranzi e occasioni150,00 €Composizione dal magazzino
  • Cassetta Raccolto BaseDisponibileRaccolto BaseSingle o coppie, cucina veloce30,00 €Composizione dal magazzino

Shopify · ortovaincitta.it

The shop’s Shopify site, ortovaincitta.it: header, the tomato hero, the categories and the box subscriptions
The Shopify site on a phone: header, search, the tomato hero and the categories

Before · four places, no single truth

  1. Orders

    Where it lived

    Simone’s personal WhatsApp

    What it cost

    Scattered across chats, rebuilt by hand

  2. Stock

    Where it lived

    Shopify and paper notes

    What it cost

    Never matched the shelf

  3. Delivery

    Where it lived

    The owner’s head

    What it cost

    Cost more than customers paid

  4. Answers

    Where it lived

    Simone, all day

    What it cost

    The same questions, every day

  5. 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.

Chat di prova: the conversation with the bot on the left, and every tool call it made to the hub on the right

The control around the model

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

Vetrina · app.ortovaincitta.it

1,000+ products, search and categories.

The storefront list on a phone: search, category chips with Frutta selected, products with their price and the add buttons

Il tuo ordine

No checkout. The cart becomes a WhatsApp message.

The storefront order sheet: three fruits, the indicative total and the button «Manda l’ordine su WhatsApp»

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.

Magazzino: problems first, sold out, below threshold, expiring and to sell quickly, then the stock table. A load of 20 kg of yellow carrots arrives from Telegram and the page updates.
Customer profile on the phone: total spent, orders, habits, loyalty and last orders
An order on the tablet, with the shop’s own statuses
Nuovo ordine, for phone and in-store orders, with the same checks as the bot

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.

Bot Magazzino settings in the hub: the authorised Telegram group, confirmation before any change, proposal expiry, time zone, the three summary times, the shop’s instructions and the authorised operators

The leak, and how we closed it

Fresh produce does not wait for the paperwork.

Before

  1. 01An arrival landsNobody writes it down. The kilos live in a head or on paper.
  2. 02Stock driftsShopify says one thing, the shelf another.
  3. 03Produce ripens unseenFigs and greens turn while nobody is offering them.
  4. 04Thrown awayFood in the bin, money lost, and deliveries priced below their cost.

With the hub and the bots

  1. 01A voice note«so’ arrivate 20 kg di fichi» from the shop floor.
  2. 02A human «sì»The bot proposes the move, nothing is written until someone confirms.
  3. 03The hub flags itIn scadenza, da vendere velocemente, sotto soglia, esaurito.
  4. 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.

20:30

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.

Consegne: the four cost bands and the 116 served postcodes, each assigned to a band

116

Postcodes served · cost lives on the band

  • Fascia 1
  • Fascia 2
  • Fascia 3
  • Fascia 4
Risposte pronte on the tablet: the questions customers really ask, with the shop’s answer

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
A customer profile on the phone: total spent, orders, average spend, last order, habits, loyalty and recent orders
Centro di controllo: the fifteen behaviour rules, each a line the shop can switch off and on
A product card on the tablet: description, media, formats and stock

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.

Email

A project in mind?

Opening your project brief…