# Un'azienda agricola che vende, fattura e avvisa senza cambiare strumento

> Azienda agricola biologica di Montemurlo: vendita online, back-office, strumenti del frantoio, pagamenti ed email transazionali, con gli avvisi ai clienti su WhatsApp.

**Enneci Agency** — Tenuta del Barone di Montemurlo di Nicolò Coppi. Via Piemonte 4/40, 59100 Prato (PO), Italia.
Contatti: ciao@enneciagency.it · +39 379 2885434 (anche WhatsApp) · https://www.enneciagency.it
Zona servita: Prato e provincia, Firenze e Pistoia, e in tutta la Toscana.

## Scheda

- Cliente: Felice Agricoltura di Curcetti Felice
- Settore: Agroalimentare
- Tipo di lavoro: E-commerce
- Anno: 2026
- Sito online: https://www.feliceagricoltura.it
- Tecnologie: Next.js, TypeScript, Prisma, PostgreSQL, Redis, Docker, whatsapp-web.js
- Pagina: https://www.enneciagency.it/progetti/felice-agricoltura/

## Risultati

- **1** — monorepo: negozio, gestionale e worker
- **2** — processi separati, per un motivo preciso
- **0** — arrotondamenti: importi in centesimi interi
- **IT** — email transazionali via Aruba

Felice Agricoltura è un'azienda agricola biologica di Montemurlo, in provincia di Prato, con il Frantoio della Rocca. Serviva un posto solo per vendere online, seguire gli ordini e tenere informati i clienti senza scrivere messaggi a mano.

## Vendere prodotti agricoli non è vendere magliette

Un prodotto agricolo ha stagionalità, lotti e un'IVA che cambia per categoria. Gli ordini vanno seguiti fino alla consegna e i clienti, spesso abituali, preferiscono un messaggio su WhatsApp a una email che non leggeranno.

Il punto di partenza è stato l'interfaccia disegnata nel progetto Claude Design dell'azienda, tradotta poi in un'applicazione che dovesse reggere ordini veri e contabilità vera.

## Due processi, perché WhatsApp non è un'API

Gli avvisi passano da `whatsapp-web.js`, che pilota una sessione reale di WhatsApp Web dentro un Chromium e deve restare acceso con lo stato salvato su disco. Non può vivere dentro una funzione che nasce e muore a ogni richiesta.

Perciò il worker è un processo a sé: il sito accoda i messaggi su Redis e il worker li consegna. Se il worker è fermo il negozio continua a funzionare e i messaggi partono al riavvio — la vendita non si blocca mai per un avviso.

Gli importi sono numeri interi in centesimi: sui totali con IVA per categoria, i decimali in virgola mobile producono differenze di un centesimo che in contabilità non si possono spiegare.

## Cosa abbiamo costruito

- **Negozio e area amministrativa** — Un'unica applicazione Next.js: vetrina, carrello, ordini e back-office di gestione.
- **Logica di dominio isolata** — IVA, importi, stati dell'ordine e code stanno in un pacchetto senza dipendenze dal framework: si testano da soli.
- **Worker WhatsApp** — Processo autonomo che consuma la coda Redis e consegna gli avvisi ai clienti.
- **Pagamenti ed email** — Incassi online e posta transazionale via Aruba, con i modelli dei messaggi in italiano.

## Quattro pacchetti, e le regole più delicate fuori dal framework

Il progetto è un monorepo con quattro pacchetti: il sito e la sua area amministrativa, il worker di WhatsApp, un pacchetto di dominio e uno per il database. Delle trecento e passa sorgenti, la parte che conta davvero non è nelle pagine — è nel pacchetto `core`.

Lì stanno le regole che non possono sbagliare: come si calcolano IVA e totali, quali stati può assumere un ordine e in quale ordine, come si normalizza un numero di telefono prima di mandargli un messaggio, come funziona la coda. Nessuna di queste cose importa il framework, quindi si provano da sole, in un secondo, senza avviare un sito.

Lo schema del database vive nel suo pacchetto con le migrazioni numerate: undici passaggi che raccontano come la struttura è cambiata. È la differenza fra un database che si può far evolvere e uno che si tocca con paura.

## Come si lavora adesso

L'azienda gestisce il catalogo e gli ordini dalla stessa applicazione che i clienti vedono, e gli avvisi partono da soli quando un ordine cambia stato. La separazione fra sito e worker ha un effetto concreto: un problema su WhatsApp non ferma le vendite, e i messaggi in coda vengono recapitati appena il servizio torna.
