CVMEDICAL vende prodotti farmaceutici e medical-device in Italia attraverso una rete di informatori scientifici. Ogni giorno gli ISF — questo è il loro nome ufficiale, «informatori scientifici del farmaco» — escono con un'agenda di medici da visitare in una zona assegnata. Parlano del prodotto, lasciano materiale informativo, raccolgono la firma del medico a conferma della visita, registrano cosa è stato detto. A fine mese qualcuno deve mettere insieme: chi ha visitato chi, quanti medici sono «in frequenza», cosa si è venduto via grossista (sell-in) e cosa è uscito davvero dalle farmacie (sell-out), quanto manca alla quota dell'agente. Quel qualcuno, fino a quando non siamo arrivati noi, era una persona con un Excel da 12 sheet.
CVMGEST è il software che ha sostituito quell'Excel. È in produzione da metà 2024, gestisce la rete ISF di CVMEDICAL e oggi è proponibile come prodotto verticale ad altre aziende del settore. Questo è il dietro le quinte.
Perché un CRM generalista non funziona qui
La prima domanda che ci hanno fatto è stata: «non ci basterebbe Salesforce?». Risposta onesta: no. Per un motivo specifico al settore farma/medical-device. Il dominio non è il classico funnel B2B «lead → opportunity → won»: è una rete bipartita medico↔struttura con relazioni N:M (lo stesso medico opera in più strutture: ASL la mattina, ambulatorio privato il pomeriggio, ospedale a chiamata), una nomenclatura settoriale rigida (specializzazioni, classi terapeutiche, linee prodotto), un workflow di visita con vincoli normativi (firma del medico tracciata, materiale promozionale rendicontato), e una matematica delle quote che incrocia tre dimensioni — agente, prodotto, medico — in modo non banale.
Salesforce sa fare tante cose, ma plasmarlo su questo dominio costa più che scriverlo da zero. E a regime resti con una customizzazione che nessuno saprà più toccare. Custom verticale, in questo caso, paga.
Il modello dati: 25+ entità di dominio
Le tabelle che reggono CVMGEST raccontano il settore. Le elenco perché chi viene da farma/medical le riconoscerà subito.
- Medico — anagrafica, contatti, indirizzo geolocalizzato, specializzazione principale. Un medico può avere più specializzazioni e operare in più strutture.
- Struttura — ASL, ospedale, ambulatorio privato, farmacia, casa di cura. Ogni struttura ha un comune, una zona, una tipologia.
- Specializzazione — cardiologia, dermatologia, oncologia… Categorie controllate, non testo libero.
- Linea prodotto — raggruppamento commerciale dei prodotti.
- Prodotto — ogni singolo farmaco/dispositivo con allegati (foglietto illustrativo, scheda tecnica) e materiali promozionali.
- Profilo — il piano di promozione di un prodotto su determinate specializzazioni: regole di chi visita chi, con cosa.
- Visita — l'atomo del sistema. ISF, medico, struttura, data, prodotti presentati, materiale lasciato, firma, geolocalizzazione, note.
- Sell-in / Sell-out — file Excel mensili dai grossisti e dalle farmacie. Decine di migliaia di righe da consolidare.
- Quota — tre dimensioni: agente × linea/prodotto × medico. Ogni quota ha un periodo, un target, una progressione.
- Zona / Comune — assegnazione territoriale degli agenti. Una riassegnazione zona scatena ricalcoli a cascata.
- Magazzino campioni — i materiali promozionali sono regolamentati: bisogna tracciare carico, scarico per agente, consegna alla visita.
Questa è la mappa di un dominio reale, non un'astrazione. Ogni voce è una tabella in Postgres con vincoli, indici e (dove serve) Row Level Security multi-tenant nel caso il prodotto venga venduto a più aziende sullo stesso istanza.
Decisione 1: Angular 21 + AG-Grid Enterprise + FullCalendar
L'app deve fare tre cose molto diverse: tabelle dense con filtri profondi (vista medici, visite, sell-out), pianificazione visuale (calendario), schede di dettaglio con form complesse. Abbiamo costruito su Angular 21 — stack che usiamo anche per Connexon — con tre librerie chiave.
- AG-Grid Enterprise per le tabelle. Non è negoziabile: quando devi mostrare 30.000 righe di sell-out con pivot, raggruppamento, esportazione Excel, filtri colonna multipli, AG-Grid Community non basta. La licenza paga l'ora di sviluppo che ti risparmia.
- FullCalendar per la programmazione visite. Vista mese, settimana, lista. Drag-and-drop, ricorrenze, eventi colorati per agente. Funziona anche su tablet, che è dove gli ISF lo usano.
- Signature Pad per la firma del medico. Tela canvas, tocco con dito o stylus, salvataggio come SVG vettoriale (compatto, scalabile, archiviabile a lungo termine).
Decisione 2: Supabase + offline reale
Backend Supabase, come per Connexon. Postgres come database, autenticazione, storage per allegati prodotto e firme. Row Level Security per separare i dati per azienda quando il prodotto viaggia in white-label.
La novità rispetto a Connexon è l'offline. Gli ISF non lavorano in ufficio: lavorano in ambulatori dove il segnale 4G è quello che è. Una visita non può fallire perché manca rete. CVMGEST è una PWA con cache locale IndexedDB che memorizza l'agenda del giorno, le anagrafiche dei medici della zona, le ultime visite registrate. La nuova visita si scrive in locale, finisce in una coda di sincronizzazione, sale appena il segnale torna. L'ISF non se ne accorge.
Decisione 3: Excel come interfaccia di import
Sell-in e sell-out arrivano in Excel. Da grossisti diversi, in formati diversi, con tracciati che cambiano ogni 6-12 mesi. La tentazione iniziale era pretendere un EDI: l'abbiamo accantonata in 48 ore. I grossisti non cambieranno il loro IT per noi.
CVMGEST ha un import Excel configurabile: per ciascun fornitore di dati definiamo un template di parsing (quale colonna è il codice prodotto, quale il quantitativo, quale la farmacia destinataria), il sistema legge il file con SheetJS, lo riconcilia contro le anagrafiche e genera i record di sell-in/sell-out. Un file da 30.000 righe si processa in pochi secondi.
Decisione 4: Mappa per zone-agente
Una funzionalità che la direzione vendite ci ha chiesto presto: vedere su una mappa i medici della zona di un agente, capire dove c'è poca copertura, riassegnare zone in modo informato. Google Maps con marker raggruppati per zona, layer che mostra densità di visite ultime 12 settimane, click-to-call al medico direttamente dal pin. Un mese di lavoro che ha cambiato il modo in cui CVMEDICAL pianifica le rotazioni di territorio.
Cosa abbiamo sbagliato
- Quote come tabella piatta. La prima versione delle quote era una tabella con righe (agente, prodotto, target). Abbiamo scoperto in produzione che la dimensione «medico» serviva quasi sempre — quote mirate sui top prescrittori. Ricostruito tutto come modello multidimensionale con periodi, scaglioni, override. Lezione: nel pharma, le quote non sono mai 2D.
- Firma come PNG. All'inizio salvavamo le firme come immagini PNG in base64 nel JSON della visita. Su 50.000 visite il database aveva ingoiato 4 GB di firme. Migrato tutto a SVG su Supabase Storage con riferimento URL: peso ridotto di 20x, archiviazione GDPR-compliant.
- Sell-out senza dedup forte. Stesso file caricato due volte raddoppiava le righe. Aggiunta una chiave deterministica (farmacia + prodotto + periodo + numero documento) come UNIQUE su Postgres. Da quel momento il doppio import è un'eccezione vincolante, non un disastro silenzioso.
I numeri che possiamo condividere
- 25+ entità di dominio modellate (medici, strutture, visite, quote, sell-in/out, magazzino campioni…).
- 100% delle visite con firma digitale e geolocalizzazione, archiviate in modo GDPR-compliant.
- ~90% di tempo risparmiato sul consolidamento mensile dei dati di vendita (da giorni di lavoro umano a minuti di import automatico).
- Offline-ready completo: PWA installabile, cache IndexedDB, sincronizzazione differita.
- Tabelle interattive AG-Grid Enterprise con pivot, raggruppamento ed export Excel su ogni vista.
Dove vogliamo andare
Le prossime release di CVMGEST stanno aggiungendo: un assistente LLM che pre-classifica le note di visita e suggerisce next-best-action al direttore vendite, un modulo di e-detailing — il materiale promozionale interattivo presentato al medico durante la visita — e un'integrazione con i CRM dei principali grossisti dove disponibile, per saltare il passo Excel quando si può.
La regola che ci portiamo via
Quando un dominio è verticale come questo — settore regolato, nomenclatura propria, workflow non riducibili a un funnel generico — il custom non è un capriccio. È l'unico modo per fare un software che la rete commerciale userà davvero. CVMGEST funziona perché ogni voce di menu è un termine che gli ISF già usano in azienda. Il software non chiede loro di parlare informatichese: parla farmaceutichese.